aboutsummaryrefslogtreecommitdiffstats
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
parent4e51cb9d47a86fee833396ad0cdfb8e84ec8166c (diff)
downloadydb-8edc031b752662cb60f411a2d7d3d6c162d801cf.tar.gz
Change "devtools/contrib/piglet/projects/ydblib/config.yaml"
commit_hash:bf8be6eaf53bc3065d37ec3eeb7b664ca9d6b76d
-rw-r--r--yt/yql/tests/sql/suites/action/action_eval_cluster_and_table.sql8
-rw-r--r--yt/yql/tests/sql/suites/action/action_eval_cluster_table.cfg3
-rw-r--r--yt/yql/tests/sql/suites/action/action_eval_cluster_table.sql9
-rw-r--r--yt/yql/tests/sql/suites/action/action_eval_cluster_table_for.cfg3
-rw-r--r--yt/yql/tests/sql/suites/action/action_eval_cluster_table_for.sql14
-rw-r--r--yt/yql/tests/sql/suites/action/action_eval_cluster_use.cfg3
-rw-r--r--yt/yql/tests/sql/suites/action/action_eval_cluster_use.sql10
-rw-r--r--yt/yql/tests/sql/suites/action/action_eval_cluster_use_compact_named_exprs.cfg3
-rw-r--r--yt/yql/tests/sql/suites/action/action_eval_cluster_use_compact_named_exprs.sql20
-rw-r--r--yt/yql/tests/sql/suites/action/action_nested_query.sql10
-rw-r--r--yt/yql/tests/sql/suites/action/combine_subqueries_with_table_param.sql22
-rw-r--r--yt/yql/tests/sql/suites/action/default.cfg2
-rw-r--r--yt/yql/tests/sql/suites/action/dep_world_action_quote.sql20
-rw-r--r--yt/yql/tests/sql/suites/action/dep_world_quote_code.sql31
-rw-r--r--yt/yql/tests/sql/suites/action/discard.sql32
-rw-r--r--yt/yql/tests/sql/suites/action/empty_do.sql13
-rw-r--r--yt/yql/tests/sql/suites/action/eval_anon_table.cfg2
-rw-r--r--yt/yql/tests/sql/suites/action/eval_anon_table.sql13
-rw-r--r--yt/yql/tests/sql/suites/action/eval_atom_wrong_type_expr.cfg3
-rw-r--r--yt/yql/tests/sql/suites/action/eval_atom_wrong_type_expr.sql8
-rw-r--r--yt/yql/tests/sql/suites/action/eval_atom_wrong_type_param.cfg3
-rw-r--r--yt/yql/tests/sql/suites/action/eval_atom_wrong_type_param.sql8
-rw-r--r--yt/yql/tests/sql/suites/action/eval_column.cfg2
-rw-r--r--yt/yql/tests/sql/suites/action/eval_column.sql34
-rw-r--r--yt/yql/tests/sql/suites/action/eval_drop.cfg1
-rw-r--r--yt/yql/tests/sql/suites/action/eval_drop.sql7
-rw-r--r--yt/yql/tests/sql/suites/action/eval_each_input_table.sql9
-rw-r--r--yt/yql/tests/sql/suites/action/eval_filter.cfg2
-rw-r--r--yt/yql/tests/sql/suites/action/eval_filter.sql12
-rw-r--r--yt/yql/tests/sql/suites/action/eval_folder.cfg1
-rw-r--r--yt/yql/tests/sql/suites/action/eval_folder.sql5
-rw-r--r--yt/yql/tests/sql/suites/action/eval_folder_via_file.cfg1
-rw-r--r--yt/yql/tests/sql/suites/action/eval_folder_via_file.sql18
-rw-r--r--yt/yql/tests/sql/suites/action/eval_folder_via_file_in_job.cfg2
-rw-r--r--yt/yql/tests/sql/suites/action/eval_folder_via_file_in_job.sql25
-rw-r--r--yt/yql/tests/sql/suites/action/eval_for.sql21
-rw-r--r--yt/yql/tests/sql/suites/action/eval_for_over_subquery.sql13
-rw-r--r--yt/yql/tests/sql/suites/action/eval_if.sql18
-rw-r--r--yt/yql/tests/sql/suites/action/eval_if_guard.sql10
-rw-r--r--yt/yql/tests/sql/suites/action/eval_input_output_table.cfg3
-rw-r--r--yt/yql/tests/sql/suites/action/eval_input_output_table.sql14
-rw-r--r--yt/yql/tests/sql/suites/action/eval_input_output_table_subquery.cfg3
-rw-r--r--yt/yql/tests/sql/suites/action/eval_input_output_table_subquery.sql16
-rw-r--r--yt/yql/tests/sql/suites/action/eval_like.cfg2
-rw-r--r--yt/yql/tests/sql/suites/action/eval_like.sql12
-rw-r--r--yt/yql/tests/sql/suites/action/eval_on_modif_table_fail.cfg3
-rw-r--r--yt/yql/tests/sql/suites/action/eval_on_modif_table_fail.sql16
-rw-r--r--yt/yql/tests/sql/suites/action/eval_pragma.cfg3
-rw-r--r--yt/yql/tests/sql/suites/action/eval_pragma.sql4
-rw-r--r--yt/yql/tests/sql/suites/action/eval_range.cfg2
-rw-r--r--yt/yql/tests/sql/suites/action/eval_range.sql13
-rw-r--r--yt/yql/tests/sql/suites/action/eval_regexp.cfg2
-rw-r--r--yt/yql/tests/sql/suites/action/eval_regexp.sql11
-rw-r--r--yt/yql/tests/sql/suites/action/eval_sample.cfg1
-rw-r--r--yt/yql/tests/sql/suites/action/eval_sample.sql7
-rw-r--r--yt/yql/tests/sql/suites/action/eval_skip_take.cfg2
-rw-r--r--yt/yql/tests/sql/suites/action/eval_skip_take.sql8
-rw-r--r--yt/yql/tests/sql/suites/action/eval_table_with_view.sql6
-rw-r--r--yt/yql/tests/sql/suites/action/eval_typeof_output_table.cfg3
-rw-r--r--yt/yql/tests/sql/suites/action/eval_typeof_output_table.sql26
-rw-r--r--yt/yql/tests/sql/suites/action/eval_unresolved_type_arg.sql25
-rw-r--r--yt/yql/tests/sql/suites/action/eval_values_output_table_subquery.cfg3
-rw-r--r--yt/yql/tests/sql/suites/action/eval_values_output_table_subquery.sql8
-rw-r--r--yt/yql/tests/sql/suites/action/evaluate_match_type.sql12
-rw-r--r--yt/yql/tests/sql/suites/action/evaluate_pure.cfg2
-rw-r--r--yt/yql/tests/sql/suites/action/evaluate_pure.sql13
-rw-r--r--yt/yql/tests/sql/suites/action/evaluate_queries.cfg2
-rw-r--r--yt/yql/tests/sql/suites/action/evaluate_queries.sql28
-rw-r--r--yt/yql/tests/sql/suites/action/export_action.cfg2
-rw-r--r--yt/yql/tests/sql/suites/action/export_action.sql6
-rw-r--r--yt/yql/tests/sql/suites/action/input_attrs.txt.attr32
-rw-r--r--yt/yql/tests/sql/suites/action/insert_after_eval.cfg1
-rw-r--r--yt/yql/tests/sql/suites/action/insert_after_eval.sql9
-rw-r--r--yt/yql/tests/sql/suites/action/insert_after_eval_xlock.cfg1
-rw-r--r--yt/yql/tests/sql/suites/action/insert_after_eval_xlock.sql9
-rw-r--r--yt/yql/tests/sql/suites/action/insert_each_from_folder.cfg2
-rw-r--r--yt/yql/tests/sql/suites/action/insert_each_from_folder.sql19
-rw-r--r--yt/yql/tests/sql/suites/action/mixed_eval_typeof_world1.cfg6
-rw-r--r--yt/yql/tests/sql/suites/action/mixed_eval_typeof_world1.sql46
-rw-r--r--yt/yql/tests/sql/suites/action/modify.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/action/nested_rewrite_io.sql22
-rw-r--r--yt/yql/tests/sql/suites/action/nested_subquery.cfg3
-rw-r--r--yt/yql/tests/sql/suites/action/nested_subquery.sql13
-rw-r--r--yt/yql/tests/sql/suites/action/parallel_for.sql11
-rw-r--r--yt/yql/tests/sql/suites/action/pending_arg_fail.cfg1
-rw-r--r--yt/yql/tests/sql/suites/action/pending_arg_fail.sql5
-rw-r--r--yt/yql/tests/sql/suites/action/process_from_subquery_with_orderby.sql5
-rw-r--r--yt/yql/tests/sql/suites/action/runtime_if_select.sql29
-rw-r--r--yt/yql/tests/sql/suites/action/select_from_subquery_with_orderby.sql12
-rw-r--r--yt/yql/tests/sql/suites/action/subquery.sql21
-rw-r--r--yt/yql/tests/sql/suites/action/subquery_merge1.sql25
-rw-r--r--yt/yql/tests/sql/suites/action/subquery_merge2.sql17
-rw-r--r--yt/yql/tests/sql/suites/action/subquery_merge_evaluate.sql16
-rw-r--r--yt/yql/tests/sql/suites/action/subquery_merge_nested_subquery.cfg1
-rw-r--r--yt/yql/tests/sql/suites/action/subquery_merge_nested_subquery.sql16
-rw-r--r--yt/yql/tests/sql/suites/action/subquery_merge_nested_world.sql15
-rw-r--r--yt/yql/tests/sql/suites/action/subquery_opt_args.sql8
-rw-r--r--yt/yql/tests/sql/suites/action/table_content_before_from_folder.cfg2
-rw-r--r--yt/yql/tests/sql/suites/action/table_content_before_from_folder.sql7
-rw-r--r--yt/yql/tests/sql/suites/agg_apply/avg_const_interval.cfg2
-rw-r--r--yt/yql/tests/sql/suites/agg_apply/avg_const_interval.sql6
-rw-r--r--yt/yql/tests/sql/suites/agg_apply/default.cfg0
-rw-r--r--yt/yql/tests/sql/suites/agg_apply/input.txt.attr30
-rw-r--r--yt/yql/tests/sql/suites/agg_apply/table.cfg1
-rw-r--r--yt/yql/tests/sql/suites/agg_apply/table.sql5
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/avg.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/avg_distinct_expr.sql10
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/avg_if.sql14
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/bitand.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/bitor.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/bitxor.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/booland.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/boolor.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/bottom.sql24
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/bottom_by.sql21
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/corellation.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/count.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/count_if.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/default.cfg0
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/every.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/histogram.sql17
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/hll.sql18
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/input.txt.attr30
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/linear_histogram.sql18
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/list.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/list.sql18
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/log_histogram.sql18
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/logariphmic_histogram.sql18
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/max.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/max_by.sql21
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/median.sql18
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/min.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/min_by.sql21
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/mode.sql18
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/multi.cfg3
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/multi.sql22
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/some.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/stddev.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/sum_if.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/top.sql23
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/top_by.sql21
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/udaf.sql26
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/udaf_distinct_expr.sql19
-rw-r--r--yt/yql/tests/sql/suites/aggr_factory/variance.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggregate/GroupByOneField.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/GroupByOneField.sql2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/GroupByTwoFields.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/GroupByTwoFields.sql2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/agg_filter_pushdown.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/agg_filter_pushdown.sql9
-rw-r--r--yt/yql/tests/sql/suites/aggregate/agg_phases_table1.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggregate/agg_phases_table2.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggregate/agg_phases_table3.sql14
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_by_column_lookup_in_const_dict.sql10
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_by_one_column.sql2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_distinct_expr.sql9
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_distinct_expr_with_groupby_expr.sql11
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_distinct_expr_with_udf.cfg2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_distinct_expr_with_udf.sql7
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_distinct_list.sql38
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_distinct_struct_access.sql7
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_key_column.sql9
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_list_in_key.sql62
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_subquery_yql_15869.sql7
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_udf_nested.cfg5
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_udf_nested.sql7
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_with_const_yson_options.sql8
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_with_deep_aggregated_column.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_with_deep_aggregated_column.sql14
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_with_default_yson_options.sql8
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_with_lambda.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_with_lambda.sql12
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_with_lambda_inside_avg.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregate_with_lambda_inside_avg.sql10
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregation_and_order.sql2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregation_by_udf.cfg5
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregation_by_udf.sql4
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregation_with_named_node.cfg5
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggregation_with_named_node.sql10
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggrs_no_grouping.cfg3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggrs_no_grouping.sql43
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggrs_no_grouping_via_map.sql44
-rw-r--r--yt/yql/tests/sql/suites/aggregate/aggrs_no_grouping_via_map_compact.sql45
-rw-r--r--yt/yql/tests/sql/suites/aggregate/avg_and_sum.sql6
-rw-r--r--yt/yql/tests/sql/suites/aggregate/avg_and_sum_by_value.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/avg_and_sum_by_value.sql8
-rw-r--r--yt/yql/tests/sql/suites/aggregate/avg_and_sum_float.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/avg_and_sum_float.sql8
-rw-r--r--yt/yql/tests/sql/suites/aggregate/avg_interval.sql2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/avg_with_having.sql2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/columns.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/compact_distinct.cfg3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/compact_distinct.sql14
-rw-r--r--yt/yql/tests/sql/suites/aggregate/compare_by.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/compare_by.sql12
-rw-r--r--yt/yql/tests/sql/suites/aggregate/compare_by_nulls.sql19
-rw-r--r--yt/yql/tests/sql/suites/aggregate/compare_by_tuple.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/compare_by_tuple.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggregate/compare_tuple.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/compare_tuple.sql14
-rw-r--r--yt/yql/tests/sql/suites/aggregate/count_distinct_with_filter.cfg2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/count_distinct_with_filter.sql4
-rw-r--r--yt/yql/tests/sql/suites/aggregate/dedup_state_keys.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/dedup_state_keys.sql10
-rw-r--r--yt/yql/tests/sql/suites/aggregate/dedup_state_keys.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/aggregate/default.cfg4
-rw-r--r--yt/yql/tests/sql/suites/aggregate/descending.txt.attr21
-rw-r--r--yt/yql/tests/sql/suites/aggregate/disable_blocks_with_spilling.cfg5
-rw-r--r--yt/yql/tests/sql/suites/aggregate/disable_blocks_with_spilling.sql2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/ensure_count.sql1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_column.sql4
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_column_alias_reuse.sql10
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_column_alias_reuse_for_join.cfg4
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_column_alias_reuse_for_join.sql12
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_cube_duo.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_cube_duo.sql3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_cube_expr_trio.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_cube_expr_trio.sql8
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_cube_grouping.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_cube_grouping.sql6
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_cube_grouping_and_expr.sql20
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_cube_join_count.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_cube_join_count.sql5
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr.sql3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_alias_on_subexp.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_alias_on_subexp.sql11
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_and_having.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_and_having.sql3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_columns_reuse.sql10
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_dict.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_dict.sql5
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_lookup.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_lookup.sql3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_mul_col.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_mul_col.sql6
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_only_join.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_only_join.sql3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_order_by_expr.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_order_by_expr.sql3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_semi_join.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_semi_join.sql9
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_with_join.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_with_join.sql5
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_expr_with_where.sql3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_full_path.sql2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_alt_duo.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_alt_duo.sql3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_and_having.sql14
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_duo.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_duo.sql3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_few_empty.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_few_empty.sql4
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_flatten.sql12
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_flatten_columns.sql11
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_flatten_expr.sql12
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_grouping.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_grouping.sql5
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_join_aliases.sql12
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_simp.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_simp.sql3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_subselect.sql16
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_subselect_asterisk.sql15
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_with_rollup.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_gs_with_rollup.sql10
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_compact.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_compact.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_distinct.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_distinct.sql17
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_distinct_compact.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_distinct_compact.sql17
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_expr_key.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_expr_key.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_list_key.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_list_key.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_only.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_only.sql12
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_only_distinct.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_only_distinct.sql16
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_only_start.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_only_start.sql11
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_star.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_star.sql10
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_static.sql26
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_hop_static_list_key.sql26
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_mul_gb_ru.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_mul_gb_ru.sql4
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_expr_and_column.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_expr_and_column.sql12
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_gs.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_gs.sql4
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_ru.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_ru.sql4
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_mul_ru_ru.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_mul_ru_ru.sql4
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_aggr_expr.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_aggr_expr.sql17
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_ref.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_ref.sql14
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_ref_same_names.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_ref_same_names.sql14
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_reuse.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_reuse.sql17
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_duo.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_duo.sql3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_duo_opt.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_duo_opt.sql3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping.sql6
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping_hum.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping_hum.sql10
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping_hum_bind.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping_hum_bind.sql14
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_key_check.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_key_check.sql12
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_udf.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_udf.sql6
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_with_filter.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_rollup_with_filter.sql12
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_ru_join.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_ru_join.sql5
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_ru_join_agg.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_ru_join_agg.sql5
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_ru_join_grouping.sql14
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_ru_join_qualified.sql12
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_ru_join_simple.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_ru_join_simple.sql5
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_ru_join_simple_fs_multiusage.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_ru_join_simple_fs_multiusage.sql6
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_ru_join_star.sql4
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_ru_partition_by_grouping.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_ru_with_select_distinct.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_ru_with_select_distinct.sql4
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_ru_with_window_func.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_ru_with_window_func.sql3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session.sql11
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_aliases.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_aliases.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_compact.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_compact.sql11
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_distinct.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_distinct.sql12
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_distinct_compact.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_distinct_compact.sql12
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_extended.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_extended.sql21
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_extended_subset.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_extended_subset.sql20
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_nopush.cfg2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_nopush.sql14
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_only.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_only.sql8
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_only_distinct.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_only_distinct.sql8
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_star.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_session_star.sql14
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_tablerow_column.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_tablerow_column.sql7
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_tz_date.cfg2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_tz_date.sql3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_with_udf_by_aggregate.cfg3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_with_udf_by_aggregate.sql14
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_by_with_where.sql3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_compact_sorted.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_compact_sorted.sql10
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_compact_sorted_distinct.cfg2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_compact_sorted_distinct.sql11
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_compact_sorted_distinct_complex.cfg2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_compact_sorted_distinct_complex.sql11
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_compact_sorted_with_diff_order.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/group_compact_sorted_with_diff_order.sql38
-rw-r--r--yt/yql/tests/sql/suites/aggregate/having_cast.sql1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/having_distinct_expr.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/having_distinct_expr.sql3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/histogram_cdf.sql7
-rw-r--r--yt/yql/tests/sql/suites/aggregate/input5.txt.attr12
-rw-r--r--yt/yql/tests/sql/suites/aggregate/input_dict.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/aggregate/input_dsv.txt.attr32
-rw-r--r--yt/yql/tests/sql/suites/aggregate/library_error_in_aggregation_fail.cfg2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/library_error_in_aggregation_fail.sql20
-rw-r--r--yt/yql/tests/sql/suites/aggregate/list_after_group.sql4
-rw-r--r--yt/yql/tests/sql/suites/aggregate/list_nullable.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/list_nullable.sql3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/list_with_fold_map.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/list_with_fold_map.sql21
-rw-r--r--yt/yql/tests/sql/suites/aggregate/list_with_fold_map.txt.attr8
-rw-r--r--yt/yql/tests/sql/suites/aggregate/native_desc_group_compact_by.cfg2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/native_desc_group_compact_by.sql24
-rw-r--r--yt/yql/tests/sql/suites/aggregate/no_compact_distinct.cfg3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/no_compact_distinct.sql13
-rw-r--r--yt/yql/tests/sql/suites/aggregate/percentile_and_avg_grouped.cfg3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/percentile_and_avg_grouped.sql2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/percentile_and_variance.cfg3
-rw-r--r--yt/yql/tests/sql/suites/aggregate/percentile_and_variance.sql2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/percentile_interval.sql38
-rw-r--r--yt/yql/tests/sql/suites/aggregate/percentiles_containers.cfg2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/percentiles_containers.sql16
-rw-r--r--yt/yql/tests/sql/suites/aggregate/percentiles_grouped.cfg2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/percentiles_grouped.sql2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/percentiles_grouped_expr.cfg2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/percentiles_grouped_expr.sql8
-rw-r--r--yt/yql/tests/sql/suites/aggregate/percentiles_ungrouped.cfg2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/percentiles_ungrouped.sql2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/rollup_with_dict.cfg2
-rw-r--r--yt/yql/tests/sql/suites/aggregate/rollup_with_dict.sql10
-rw-r--r--yt/yql/tests/sql/suites/aggregate/session1.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/aggregate/sorted.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/aggregate/subquery_aggregation.cfg1
-rw-r--r--yt/yql/tests/sql/suites/aggregate/subquery_aggregation.sql14
-rw-r--r--yt/yql/tests/sql/suites/aggregate/table_funcs_group_by.sql11
-rw-r--r--yt/yql/tests/sql/suites/aggregate/table_row_aggregation.sql14
-rw-r--r--yt/yql/tests/sql/suites/ansi_idents/basic_columns.sql5
-rw-r--r--yt/yql/tests/sql/suites/ansi_idents/default.cfg4
-rw-r--r--yt/yql/tests/sql/suites/ansi_idents/escaped_udf_name.sql6
-rw-r--r--yt/yql/tests/sql/suites/ansi_idents/join_using.sql5
-rw-r--r--yt/yql/tests/sql/suites/ansi_idents/order_by.sql5
-rw-r--r--yt/yql/tests/sql/suites/bigdate/BigDates.txt.attr17
-rw-r--r--yt/yql/tests/sql/suites/bigdate/NarrowDates.txt.attr15
-rw-r--r--yt/yql/tests/sql/suites/bigdate/NarrowInterval.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/bigdate/Signed.txt.attr9
-rw-r--r--yt/yql/tests/sql/suites/bigdate/Unsigned.txt.attr9
-rw-r--r--yt/yql/tests/sql/suites/bigdate/default.cfg5
-rw-r--r--yt/yql/tests/sql/suites/bigdate/implicit_cast_callable.sql43
-rw-r--r--yt/yql/tests/sql/suites/bigdate/table_arithmetic.sql17
-rw-r--r--yt/yql/tests/sql/suites/bigdate/table_arithmetic_mul_div.sql35
-rw-r--r--yt/yql/tests/sql/suites/bigdate/table_arithmetic_narrow.sql25
-rw-r--r--yt/yql/tests/sql/suites/bigdate/table_arithmetic_sub.sql10
-rw-r--r--yt/yql/tests/sql/suites/bigdate/table_common_type.sql27
-rw-r--r--yt/yql/tests/sql/suites/bigdate/table_explicit_cast.sql29
-rw-r--r--yt/yql/tests/sql/suites/bigdate/table_int_cast.sql34
-rw-r--r--yt/yql/tests/sql/suites/bigdate/table_io.sql17
-rw-r--r--yt/yql/tests/sql/suites/bigdate/table_yt_key_filter-default.cfg6
-rw-r--r--yt/yql/tests/sql/suites/bigdate/table_yt_key_filter-on.cfg7
-rw-r--r--yt/yql/tests/sql/suites/bigdate/table_yt_key_filter-wo_compat.cfg8
-rw-r--r--yt/yql/tests/sql/suites/bigdate/table_yt_key_filter.sql110
-rw-r--r--yt/yql/tests/sql/suites/bigdate/table_yt_native-default.cfg3
-rw-r--r--yt/yql/tests/sql/suites/bigdate/table_yt_native-on.cfg5
-rw-r--r--yt/yql/tests/sql/suites/bigdate/table_yt_native-wo_compat.cfg5
-rw-r--r--yt/yql/tests/sql/suites/bigdate/table_yt_native.sql11
-rw-r--r--yt/yql/tests/sql/suites/bigdate/tz.txt.attr8
-rw-r--r--yt/yql/tests/sql/suites/bigdate/tz_table_fill.cfg2
-rw-r--r--yt/yql/tests/sql/suites/bigdate/tz_table_fill.sql12
-rw-r--r--yt/yql/tests/sql/suites/bigdate/tz_table_pull.cfg2
-rw-r--r--yt/yql/tests/sql/suites/bigdate/tz_table_pull.sql6
-rw-r--r--yt/yql/tests/sql/suites/bigdate/tz_table_rw.cfg2
-rw-r--r--yt/yql/tests/sql/suites/bigdate/tz_table_rw.sql6
-rw-r--r--yt/yql/tests/sql/suites/bigdate/tz_table_yt_key_filter.cfg5
-rw-r--r--yt/yql/tests/sql/suites/bigdate/tz_table_yt_key_filter.sql62
-rw-r--r--yt/yql/tests/sql/suites/binding/anon_table_binding.sql10
-rw-r--r--yt/yql/tests/sql/suites/binding/bind_select.sql5
-rw-r--r--yt/yql/tests/sql/suites/binding/default.cfg4
-rw-r--r--yt/yql/tests/sql/suites/binding/drop_binding.cfg2
-rw-r--r--yt/yql/tests/sql/suites/binding/drop_binding.sql8
-rw-r--r--yt/yql/tests/sql/suites/binding/insert_binding.cfg2
-rw-r--r--yt/yql/tests/sql/suites/binding/insert_binding.sql7
-rw-r--r--yt/yql/tests/sql/suites/binding/named_node_corr_names.sql7
-rw-r--r--yt/yql/tests/sql/suites/binding/table_concat_binding.sql9
-rw-r--r--yt/yql/tests/sql/suites/binding/table_concat_strict_binding.sql9
-rw-r--r--yt/yql/tests/sql/suites/binding/table_filter_binding.sql27
-rw-r--r--yt/yql/tests/sql/suites/binding/table_filter_strict_binding.sql28
-rw-r--r--yt/yql/tests/sql/suites/binding/table_from_binding.sql5
-rw-r--r--yt/yql/tests/sql/suites/binding/table_from_binding_inferscheme.sql8
-rw-r--r--yt/yql/tests/sql/suites/binding/table_range_binding.sql46
-rw-r--r--yt/yql/tests/sql/suites/binding/table_range_strict_binding.sql46
-rw-r--r--yt/yql/tests/sql/suites/binding/table_regexp_binding.cfg5
-rw-r--r--yt/yql/tests/sql/suites/binding/table_regexp_binding.sql17
-rw-r--r--yt/yql/tests/sql/suites/binding/table_regexp_strict_binding.cfg5
-rw-r--r--yt/yql/tests/sql/suites/binding/table_regexp_strict_binding.sql17
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_decimal.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_decimal.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_int16.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_int16.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_int32.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_int32.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_int64.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_int64.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_int8.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_int8.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_uint16.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_uint16.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_uint32.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_uint32.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_uint64.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_uint64.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_uint64_opt.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_uint64_opt.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_uint64_opt2.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_uint64_opt2.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_uint8.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/add_uint8.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/bitcast_block.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/bitcast_block.sql3
-rw-r--r--yt/yql/tests/sql/suites/blocks/bitcast_scalar.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/bitcast_scalar.sql3
-rw-r--r--yt/yql/tests/sql/suites/blocks/block_input.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/block_input.sql11
-rw-r--r--yt/yql/tests/sql/suites/blocks/block_input_sys_columns.cfg3
-rw-r--r--yt/yql/tests/sql/suites/blocks/block_input_sys_columns.sql18
-rw-r--r--yt/yql/tests/sql/suites/blocks/block_input_various_types-v3.cfg3
-rw-r--r--yt/yql/tests/sql/suites/blocks/block_input_various_types.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/block_input_various_types.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/block_input_various_types.txt.attr182
-rw-r--r--yt/yql/tests/sql/suites/blocks/block_input_various_types_v3.txt.attr77
-rw-r--r--yt/yql/tests/sql/suites/blocks/block_output_various_types.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/block_output_various_types.sql6
-rw-r--r--yt/yql/tests/sql/suites/blocks/boolean_ops.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/boolean_ops.sql27
-rw-r--r--yt/yql/tests/sql/suites/blocks/coalesce_bools.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/coalesce_bools.sql16
-rw-r--r--yt/yql/tests/sql/suites/blocks/coalesce_complex.sql37
-rw-r--r--yt/yql/tests/sql/suites/blocks/coalesce_ints.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/coalesce_ints.sql16
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_avg.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_avg.sql13
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_avg_filter.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_avg_filter.sql6
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_avg_filter_opt.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_avg_filter_opt.sql6
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_count.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_count.sql9
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_count_filter.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_count_filter.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_count_filter_opt.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_count_filter_opt.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_decimal.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_decimal.sql15
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_decimal_max.sql9
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_max.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_max.sql19
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_max_filter.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_max_filter.sql6
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_max_filter_opt.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_max_filter_opt.sql6
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_min.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_min.sql19
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_min_filter.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_min_filter.sql6
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_min_filter_opt.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_min_filter_opt.sql6
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_minmax_double.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_minmax_double.sql6
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_minmax_nested.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_minmax_nested.sql6
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_pg.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_pg.sql17
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_pg_filter.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_pg_filter.sql14
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_some.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_some.sql19
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_some_filter.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_some_filter.sql6
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_sum.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_sum.sql12
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_sum_filter.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_sum_filter.sql6
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_sum_filter_opt.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_all_sum_filter_opt.sql6
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_avg.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_avg.sql11
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_count.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_count.sql12
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_count_filter.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_count_filter.sql9
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_max.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_max.sql11
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_min.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_min.sql11
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_minmax_double.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_minmax_double.sql9
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_minmax_nested.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_minmax_nested.sql9
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_pg.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_pg.sql18
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_set.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_set.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_some.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_some.sql11
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_sum.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_sum.sql11
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_sum_many_keys.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/combine_hashed_sum_many_keys.sql46
-rw-r--r--yt/yql/tests/sql/suites/blocks/compare.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/compare.sql24
-rw-r--r--yt/yql/tests/sql/suites/blocks/compare_dates_floats_bools.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/compare_dates_floats_bools.sql59
-rw-r--r--yt/yql/tests/sql/suites/blocks/complex_scalars.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/complex_scalars.sql12
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_add_interval.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_add_interval.sql31
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_add_interval_scalar.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_add_interval_scalar.sql57
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_equals.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_equals.sql169
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_equals_scalar.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_equals_scalar.sql332
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_greater.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_greater.sql169
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_greater_or_equal.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_greater_or_equal.sql169
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_greater_or_equal_scalar.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_greater_or_equal_scalar.sql332
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_greater_scalar.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_greater_scalar.sql332
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_group_by.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_group_by.sql9
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_less.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_less.sql169
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_less_or_equal.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_less_or_equal.sql169
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_less_or_equal_scalar.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_less_or_equal_scalar.sql332
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_less_scalar.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_less_scalar.sql332
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_not_equals.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_not_equals.sql169
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_not_equals_scalar.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_not_equals_scalar.sql332
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_sub.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_sub.sql165
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_sub_interval.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_sub_interval.sql31
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_sub_interval_scalar.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_sub_interval_scalar.sql58
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_sub_scalar.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_sub_scalar.sql326
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_top_sort.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/date_top_sort.sql9
-rw-r--r--yt/yql/tests/sql/suites/blocks/dates.txt.attr27
-rw-r--r--yt/yql/tests/sql/suites/blocks/decimal_avg.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/decimal_avg.sql8
-rw-r--r--yt/yql/tests/sql/suites/blocks/decimal_comparison.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/decimal_comparison.sql25
-rw-r--r--yt/yql/tests/sql/suites/blocks/decimal_multiplicative_ops.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/decimal_multiplicative_ops.sql18
-rw-r--r--yt/yql/tests/sql/suites/blocks/decimal_op_decimal.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/decimal_op_decimal.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/decimal_op_decimal_scalar.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/decimal_op_decimal_scalar.sql16
-rw-r--r--yt/yql/tests/sql/suites/blocks/decimal_unary.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/decimal_unary.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/default.cfg4
-rw-r--r--yt/yql/tests/sql/suites/blocks/distinct_mixed_all.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/distinct_mixed_all.sql8
-rw-r--r--yt/yql/tests/sql/suites/blocks/distinct_mixed_keys.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/distinct_mixed_keys.sql10
-rw-r--r--yt/yql/tests/sql/suites/blocks/distinct_opt_state_all.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/distinct_opt_state_all.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/distinct_opt_state_keys.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/distinct_opt_state_keys.sql10
-rw-r--r--yt/yql/tests/sql/suites/blocks/distinct_pure_all.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/distinct_pure_all.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/distinct_pure_keys.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/distinct_pure_keys.sql10
-rw-r--r--yt/yql/tests/sql/suites/blocks/div_uint64.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/div_uint64.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/div_uint64_opt2.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/div_uint64_opt2.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/exists.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/exists.sql9
-rw-r--r--yt/yql/tests/sql/suites/blocks/filter_by_column_with_drop.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/filter_by_column_with_drop.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/filter_direct_col.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/filter_direct_col.sql1
-rw-r--r--yt/yql/tests/sql/suites/blocks/filter_expr.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/filter_expr.sql1
-rw-r--r--yt/yql/tests/sql/suites/blocks/filter_partial_expr.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/filter_partial_expr.sql1
-rw-r--r--yt/yql/tests/sql/suites/blocks/finalize_hashed_keys.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/finalize_hashed_keys.sql9
-rw-r--r--yt/yql/tests/sql/suites/blocks/group_by_complex_key.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/group_by_complex_key.sql16
-rw-r--r--yt/yql/tests/sql/suites/blocks/if.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/if.sql16
-rw-r--r--yt/yql/tests/sql/suites/blocks/input1.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/blocks/input2.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_allnums.txt.attr23
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_bool.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_bool_opt.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_bools.txt.attr9
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_decimal.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_double.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_exists.txt.attr8
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_from_pg_dates.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_hashed_uint32.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_hashed_uint32_opt.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_int16.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_int32.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_int32_opt.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_int32_string.txt.attr8
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_int64.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_int8.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_json_document.txt.attr9
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_nested.txt.attr8
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_pg.txt.attr8
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_pg_arr.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_strings.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_strings_opt.txt.attr8
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_struct.txt.attr10
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_to_pg_dates.txt.attr10
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_to_pg_interval.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_to_pg_numbers.txt.attr15
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_to_pg_strings.txt.attr14
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_tofrom_pg.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_top.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_tuple.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_uint16.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_uint32.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_uint32_optbool_bool.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_uint64.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_uint64_filter.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_uint64_filter_opt.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_uint64_nested_opt.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_uint64_opt.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_uint64_opt2.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_uint8.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/input_uint8_big.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_add_date.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_add_date.sql31
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_add_date_scalar.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_add_date_scalar.sql57
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_add_interval.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_add_interval.sql10
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_add_interval_scalar.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_add_interval_scalar.sql16
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_div.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_div.sql22
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_div_scalar.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_div_scalar.sql41
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_mul.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_mul.sql40
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_mul_scalar.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_mul_scalar.sql79
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_sub_interval.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_sub_interval.sql9
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_sub_interval_scalar.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/interval_sub_interval_scalar.sql16
-rw-r--r--yt/yql/tests/sql/suites/blocks/json_document_type.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/json_document_type.sql8
-rw-r--r--yt/yql/tests/sql/suites/blocks/lazy_nonstrict_basic.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/lazy_nonstrict_basic.sql17
-rw-r--r--yt/yql/tests/sql/suites/blocks/lazy_nonstrict_nested.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/lazy_nonstrict_nested.sql4
-rw-r--r--yt/yql/tests/sql/suites/blocks/lazy_nonstrict_with_scalar_ctx.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/lazy_nonstrict_with_scalar_ctx.sql10
-rw-r--r--yt/yql/tests/sql/suites/blocks/member.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/member.sql10
-rw-r--r--yt/yql/tests/sql/suites/blocks/minmax_strings.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/minmax_strings.sql21
-rw-r--r--yt/yql/tests/sql/suites/blocks/minmax_strings_filter.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/minmax_strings_filter.sql17
-rw-r--r--yt/yql/tests/sql/suites/blocks/minmax_tuple.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/minmax_tuple.sql16
-rw-r--r--yt/yql/tests/sql/suites/blocks/mod_uint64.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/mod_uint64.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/mod_uint64_opt2.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/mod_uint64_opt2.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/mul_uint64_opt2.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/mul_uint64_opt2.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/nested_optionals.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/nested_optionals.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/not.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/not.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/not_opt.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/not_opt.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/partial_blocks1.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/partial_blocks1.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg.sql9
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_call.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_call.sql6
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_from_dates.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_from_dates.sql6
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_sort.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_sort.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_to_dates.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_to_dates.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_to_interval.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_to_interval.sql6
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_to_numbers.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_to_numbers.sql10
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_to_strings.cfg2
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_to_strings.sql15
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_tofrom.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_tofrom.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_top_sort.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/pg_top_sort.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/sort_one_asc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/sort_one_asc.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/sort_one_desc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/sort_one_desc.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/sort_two_asc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/sort_two_asc.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/sort_two_desc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/sort_two_desc.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/sort_two_mix.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/sort_two_mix.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/string_as_agg_key.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/string_as_agg_key.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/string_filter.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/string_filter.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/string_len_and_cmp.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/string_len_and_cmp.sql42
-rw-r--r--yt/yql/tests/sql/suites/blocks/string_pass.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/string_pass.sql6
-rw-r--r--yt/yql/tests/sql/suites/blocks/string_with.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/string_with.sql22
-rw-r--r--yt/yql/tests/sql/suites/blocks/struct_type.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/struct_type.sql8
-rw-r--r--yt/yql/tests/sql/suites/blocks/sub_uint64_opt2.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/sub_uint64_opt2.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/top_sort_one_asc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/top_sort_one_asc.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/top_sort_one_desc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/top_sort_one_desc.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/top_sort_two_asc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/top_sort_two_asc.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/top_sort_two_desc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/top_sort_two_desc.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/top_sort_two_mix.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/top_sort_two_mix.sql7
-rw-r--r--yt/yql/tests/sql/suites/blocks/tuple_nth.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/tuple_nth.sql16
-rw-r--r--yt/yql/tests/sql/suites/blocks/tuple_type.cfg1
-rw-r--r--yt/yql/tests/sql/suites/blocks/tuple_type.sql5
-rw-r--r--yt/yql/tests/sql/suites/blocks/type_and_callable_stats.cfg4
-rw-r--r--yt/yql/tests/sql/suites/blocks/type_and_callable_stats.sql16
-rw-r--r--yt/yql/tests/sql/suites/case/case_multi_val.sql1
-rw-r--r--yt/yql/tests/sql/suites/case/case_size_eq_cast.sql1
-rw-r--r--yt/yql/tests/sql/suites/case/case_then_else.sql1
-rw-r--r--yt/yql/tests/sql/suites/case/case_val_then_else.sql1
-rw-r--r--yt/yql/tests/sql/suites/case/case_val_when_then.sql1
-rw-r--r--yt/yql/tests/sql/suites/case/case_when_then.sql1
-rw-r--r--yt/yql/tests/sql/suites/case/default.cfg4
-rw-r--r--yt/yql/tests/sql/suites/coalesce/coalesce.cfg1
-rw-r--r--yt/yql/tests/sql/suites/coalesce/coalesce.sql1
-rw-r--r--yt/yql/tests/sql/suites/coalesce/coalesce_few_opt.cfg1
-rw-r--r--yt/yql/tests/sql/suites/coalesce/coalesce_few_opt.sql24
-rw-r--r--yt/yql/tests/sql/suites/coalesce/coalesce_few_real.sql17
-rw-r--r--yt/yql/tests/sql/suites/coalesce/coalesce_sugar.sql3
-rw-r--r--yt/yql/tests/sql/suites/coalesce/default.cfg4
-rw-r--r--yt/yql/tests/sql/suites/coalesce/optional.txt.attr85
-rw-r--r--yt/yql/tests/sql/suites/column_group/default.cfg3
-rw-r--r--yt/yql/tests/sql/suites/column_group/groups-lookup.cfg4
-rw-r--r--yt/yql/tests/sql/suites/column_group/groups-max.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/groups-perusage.cfg4
-rw-r--r--yt/yql/tests/sql/suites/column_group/groups-single.cfg4
-rw-r--r--yt/yql/tests/sql/suites/column_group/groups.sql6
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint-disable.cfg8
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint-perusage.cfg8
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint-single.cfg8
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint.sql20
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_anon-disable.cfg4
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_anon-perusage.cfg4
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_anon-single.cfg4
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_anon.sql9
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_anon_groups-disable.cfg4
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_anon_groups-perusage.cfg4
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_anon_groups-single.cfg4
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_anon_groups.sql9
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_append_fail.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_append_fail.sql6
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_diff_grp_fail.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_diff_grp_fail.sql10
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_dup_col_fail.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_dup_col_fail.sql7
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_dup_def_fail.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_dup_def_fail.sql7
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_empty_grp_fail.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_empty_grp_fail.sql7
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_non_lst_yson_fail.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_non_lst_yson_fail.sql7
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_non_map_yson_fail.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_non_map_yson_fail.sql7
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_non_str_yson_fail.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_non_str_yson_fail.sql7
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_non_yson_fail.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_non_yson_fail.sql7
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_short_grp_fail.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_short_grp_fail.sql7
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_unk_col_fail.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/hint_unk_col_fail.sql8
-rw-r--r--yt/yql/tests/sql/suites/column_group/input.txt.attr10
-rw-r--r--yt/yql/tests/sql/suites/column_group/insert_diff_groups1_fail.cfg4
-rw-r--r--yt/yql/tests/sql/suites/column_group/insert_diff_groups1_fail.sql15
-rw-r--r--yt/yql/tests/sql/suites/column_group/insert_diff_groups2_fail.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/insert_diff_groups2_fail.sql15
-rw-r--r--yt/yql/tests/sql/suites/column_group/insert_diff_groups3_fail.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/insert_diff_groups3_fail.sql7
-rw-r--r--yt/yql/tests/sql/suites/column_group/length-perusage.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/length-single.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/length.sql7
-rw-r--r--yt/yql/tests/sql/suites/column_group/many_inserts.cfg4
-rw-r--r--yt/yql/tests/sql/suites/column_group/many_inserts.sql32
-rw-r--r--yt/yql/tests/sql/suites/column_group/min_group.sql8
-rw-r--r--yt/yql/tests/sql/suites/column_group/publish-perusage.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/publish-single.cfg5
-rw-r--r--yt/yql/tests/sql/suites/column_group/publish.sql8
-rw-r--r--yt/yql/tests/sql/suites/column_order/align_publish.cfg1
-rw-r--r--yt/yql/tests/sql/suites/column_order/align_publish.sql10
-rw-r--r--yt/yql/tests/sql/suites/column_order/align_publish_native.cfg1
-rw-r--r--yt/yql/tests/sql/suites/column_order/align_publish_native.sql12
-rw-r--r--yt/yql/tests/sql/suites/column_order/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/column_order/input.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/column_order/insert.cfg2
-rw-r--r--yt/yql/tests/sql/suites/column_order/insert.sql26
-rw-r--r--yt/yql/tests/sql/suites/column_order/insert_reorder_without_columnorder.cfg2
-rw-r--r--yt/yql/tests/sql/suites/column_order/insert_reorder_without_columnorder.sql14
-rw-r--r--yt/yql/tests/sql/suites/column_order/insert_tmp.sql18
-rw-r--r--yt/yql/tests/sql/suites/column_order/insert_with_desc_sort_and_native_types.sql12
-rw-r--r--yt/yql/tests/sql/suites/column_order/insert_with_new_cols.cfg2
-rw-r--r--yt/yql/tests/sql/suites/column_order/insert_with_new_cols.sql9
-rw-r--r--yt/yql/tests/sql/suites/column_order/insert_with_reorder_cols.cfg2
-rw-r--r--yt/yql/tests/sql/suites/column_order/insert_with_reorder_cols.sql20
-rw-r--r--yt/yql/tests/sql/suites/column_order/join.cfg3
-rw-r--r--yt/yql/tests/sql/suites/column_order/join.sql11
-rw-r--r--yt/yql/tests/sql/suites/column_order/join_nosimple.cfg3
-rw-r--r--yt/yql/tests/sql/suites/column_order/join_nosimple.sql12
-rw-r--r--yt/yql/tests/sql/suites/column_order/ordered_plus_native.cfg2
-rw-r--r--yt/yql/tests/sql/suites/column_order/ordered_plus_native.sql14
-rw-r--r--yt/yql/tests/sql/suites/column_order/select_action.sql8
-rw-r--r--yt/yql/tests/sql/suites/column_order/select_distinct_star.sql7
-rw-r--r--yt/yql/tests/sql/suites/column_order/select_groupby_with_star.sql8
-rw-r--r--yt/yql/tests/sql/suites/column_order/select_limit_offset.sql9
-rw-r--r--yt/yql/tests/sql/suites/column_order/select_limit_offset_reorder.sql6
-rw-r--r--yt/yql/tests/sql/suites/column_order/select_orderby.sql7
-rw-r--r--yt/yql/tests/sql/suites/column_order/select_plain.sql16
-rw-r--r--yt/yql/tests/sql/suites/column_order/select_plain_nosimple.sql17
-rw-r--r--yt/yql/tests/sql/suites/column_order/select_sample.sql7
-rw-r--r--yt/yql/tests/sql/suites/column_order/select_subquery.sql11
-rw-r--r--yt/yql/tests/sql/suites/column_order/select_where.sql7
-rw-r--r--yt/yql/tests/sql/suites/column_order/select_win_func.sql11
-rw-r--r--yt/yql/tests/sql/suites/column_order/union_all.sql15
-rw-r--r--yt/yql/tests/sql/suites/column_order/union_all_positional_columns_count_fail.cfg1
-rw-r--r--yt/yql/tests/sql/suites/column_order/union_all_positional_columns_count_fail.sql8
-rw-r--r--yt/yql/tests/sql/suites/column_order/union_all_positional_unordered_fail.cfg1
-rw-r--r--yt/yql/tests/sql/suites/column_order/union_all_positional_unordered_fail.sql7
-rw-r--r--yt/yql/tests/sql/suites/column_order/winfunc.sql9
-rw-r--r--yt/yql/tests/sql/suites/count/boolean_count.cfg1
-rw-r--r--yt/yql/tests/sql/suites/count/boolean_count.sql3
-rw-r--r--yt/yql/tests/sql/suites/count/count.cfg1
-rw-r--r--yt/yql/tests/sql/suites/count/count.sql6
-rw-r--r--yt/yql/tests/sql/suites/count/count_all.sql1
-rw-r--r--yt/yql/tests/sql/suites/count/count_all_grouped-empty.cfg1
-rw-r--r--yt/yql/tests/sql/suites/count/count_all_grouped.cfg1
-rw-r--r--yt/yql/tests/sql/suites/count/count_all_grouped.sql1
-rw-r--r--yt/yql/tests/sql/suites/count/count_all_view_concat.cfg1
-rw-r--r--yt/yql/tests/sql/suites/count/count_all_view_concat.sql3
-rw-r--r--yt/yql/tests/sql/suites/count/count_by_nulls.cfg1
-rw-r--r--yt/yql/tests/sql/suites/count/count_by_nulls.sql1
-rw-r--r--yt/yql/tests/sql/suites/count/count_const_no_grouping.sql1
-rw-r--r--yt/yql/tests/sql/suites/count/count_distinct_from_view_concat.cfg1
-rw-r--r--yt/yql/tests/sql/suites/count/count_distinct_from_view_concat.sql3
-rw-r--r--yt/yql/tests/sql/suites/count/count_input.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/count/count_no_grouping.sql1
-rw-r--r--yt/yql/tests/sql/suites/count/count_nullable.cfg1
-rw-r--r--yt/yql/tests/sql/suites/count/count_nullable.sql1
-rw-r--r--yt/yql/tests/sql/suites/count/count_nullable_sub.sql8
-rw-r--r--yt/yql/tests/sql/suites/count/default.cfg2
-rw-r--r--yt/yql/tests/sql/suites/count/view_input.txt.attr32
-rw-r--r--yt/yql/tests/sql/suites/csee/default.cfg0
-rw-r--r--yt/yql/tests/sql/suites/csee/yql-7237.cfg1
-rw-r--r--yt/yql/tests/sql/suites/csee/yql-7237.sql68
-rw-r--r--yt/yql/tests/sql/suites/datetime/date_tz_table_sort_asc.cfg2
-rw-r--r--yt/yql/tests/sql/suites/datetime/date_tz_table_sort_asc.sql12
-rw-r--r--yt/yql/tests/sql/suites/datetime/date_tz_table_sort_desc.cfg2
-rw-r--r--yt/yql/tests/sql/suites/datetime/date_tz_table_sort_desc.sql12
-rw-r--r--yt/yql/tests/sql/suites/datetime/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/distinct/default.cfg4
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_and_join.cfg1
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_and_join.sql8
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_by_tuple.sql2
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_columns.sql1
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_columns_after_group.sql4
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_count_and_avg.sql1
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_count_and_full_count.sql1
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_count_no_gouping.sql1
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_count_only.sql1
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_groupby.sql6
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_having_no_agg.sql6
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_join.sql8
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_list_after_group.sql3
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_one_count.sql1
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_star.sql9
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_star1.cfg1
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_star1.sql3
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_union_all.sql9
-rw-r--r--yt/yql/tests/sql/suites/distinct/distinct_window.sql8
-rw-r--r--yt/yql/tests/sql/suites/dq/blacklisted_pragmas.cfg3
-rw-r--r--yt/yql/tests/sql/suites/dq/blacklisted_pragmas.sql10
-rw-r--r--yt/yql/tests/sql/suites/dq/blacklisted_pragmas1.cfg3
-rw-r--r--yt/yql/tests/sql/suites/dq/blacklisted_pragmas1.sql10
-rw-r--r--yt/yql/tests/sql/suites/dq/default.cfg2
-rw-r--r--yt/yql/tests/sql/suites/dq/dq_replicate_ok.sql6
-rw-r--r--yt/yql/tests/sql/suites/dq/join_cbo_native_3_tables.cfg5
-rw-r--r--yt/yql/tests/sql/suites/dq/join_cbo_native_3_tables.sql10
-rw-r--r--yt/yql/tests/sql/suites/dq/mem_limit.cfg2
-rw-r--r--yt/yql/tests/sql/suites/dq/mem_limit.sql7
-rw-r--r--yt/yql/tests/sql/suites/dq/pool_trees_whitelist.cfg3
-rw-r--r--yt/yql/tests/sql/suites/dq/pool_trees_whitelist.sql8
-rw-r--r--yt/yql/tests/sql/suites/dq/precompute_asyncfile.cfg4
-rw-r--r--yt/yql/tests/sql/suites/dq/precompute_asyncfile.sql5
-rw-r--r--yt/yql/tests/sql/suites/dq/precompute_parallel.cfg4
-rw-r--r--yt/yql/tests/sql/suites/dq/precompute_parallel.sql7
-rw-r--r--yt/yql/tests/sql/suites/dq/precompute_parallel_indep.cfg5
-rw-r--r--yt/yql/tests/sql/suites/dq/precompute_parallel_indep.sql5
-rw-r--r--yt/yql/tests/sql/suites/dq/precompute_parallel_mix.cfg4
-rw-r--r--yt/yql/tests/sql/suites/dq/precompute_parallel_mix.sql7
-rw-r--r--yt/yql/tests/sql/suites/dq/precompute_result.sql6
-rw-r--r--yt/yql/tests/sql/suites/dq/precompute_tree.sql9
-rw-r--r--yt/yql/tests/sql/suites/dq/read_cost.sql8
-rw-r--r--yt/yql/tests/sql/suites/dq/read_cost_native.sql8
-rw-r--r--yt/yql/tests/sql/suites/dq/truncate_local.sql3
-rw-r--r--yt/yql/tests/sql/suites/dq/wrong_script.cfg2
-rw-r--r--yt/yql/tests/sql/suites/dq/wrong_script.sql13
-rw-r--r--yt/yql/tests/sql/suites/dq/wrong_script_segf.cfg2
-rw-r--r--yt/yql/tests/sql/suites/dq/wrong_script_segf.sql17
-rw-r--r--yt/yql/tests/sql/suites/dq/wrong_script_timeout.sql14
-rw-r--r--yt/yql/tests/sql/suites/epochs/default.cfg0
-rw-r--r--yt/yql/tests/sql/suites/epochs/modify.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/epochs/read_modified.cfg2
-rw-r--r--yt/yql/tests/sql/suites/epochs/read_modified.sql17
-rw-r--r--yt/yql/tests/sql/suites/epochs/reset_sortness_on_append.cfg2
-rw-r--r--yt/yql/tests/sql/suites/epochs/reset_sortness_on_append.sql18
-rw-r--r--yt/yql/tests/sql/suites/epochs/use_and_drop_anonymous.cfg4
-rw-r--r--yt/yql/tests/sql/suites/epochs/use_and_drop_anonymous.sql21
-rw-r--r--yt/yql/tests/sql/suites/epochs/use_sorted_by_complex_type.cfg3
-rw-r--r--yt/yql/tests/sql/suites/epochs/use_sorted_by_complex_type.sql15
-rw-r--r--yt/yql/tests/sql/suites/expr/as_table_emptylist.cfg1
-rw-r--r--yt/yql/tests/sql/suites/expr/as_table_emptylist.sql17
-rw-r--r--yt/yql/tests/sql/suites/expr/constraints_of.cfg1
-rw-r--r--yt/yql/tests/sql/suites/expr/constraints_of.sql10
-rw-r--r--yt/yql/tests/sql/suites/expr/default.cfg0
-rw-r--r--yt/yql/tests/sql/suites/expr/double.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/expr/double_join_with_list_from_range.cfg1
-rw-r--r--yt/yql/tests/sql/suites/expr/double_join_with_list_from_range.sql18
-rw-r--r--yt/yql/tests/sql/suites/expr/empty_iterator.cfg1
-rw-r--r--yt/yql/tests/sql/suites/expr/empty_iterator.sql20
-rw-r--r--yt/yql/tests/sql/suites/expr/empty_iterator2.cfg1
-rw-r--r--yt/yql/tests/sql/suites/expr/empty_iterator2.sql20
-rw-r--r--yt/yql/tests/sql/suites/expr/evaluate_parse_inf_nan.cfg3
-rw-r--r--yt/yql/tests/sql/suites/expr/evaluate_parse_inf_nan.sql6
-rw-r--r--yt/yql/tests/sql/suites/expr/inline_call.cfg3
-rw-r--r--yt/yql/tests/sql/suites/expr/inline_call.sql28
-rw-r--r--yt/yql/tests/sql/suites/expr/len.cfg1
-rw-r--r--yt/yql/tests/sql/suites/expr/len.sql5
-rw-r--r--yt/yql/tests/sql/suites/expr/non_persistable_group_by_column_fail.cfg2
-rw-r--r--yt/yql/tests/sql/suites/expr/non_persistable_group_by_column_fail.sql7
-rw-r--r--yt/yql/tests/sql/suites/expr/non_persistable_group_by_having_some_fail.cfg2
-rw-r--r--yt/yql/tests/sql/suites/expr/non_persistable_group_by_having_some_fail.sql10
-rw-r--r--yt/yql/tests/sql/suites/expr/non_persistable_group_by_some_fail.cfg2
-rw-r--r--yt/yql/tests/sql/suites/expr/non_persistable_group_by_some_fail.sql7
-rw-r--r--yt/yql/tests/sql/suites/expr/non_persistable_inner_select_fail.cfg2
-rw-r--r--yt/yql/tests/sql/suites/expr/non_persistable_inner_select_fail.sql10
-rw-r--r--yt/yql/tests/sql/suites/expr/non_persistable_insert_into_fail.cfg2
-rw-r--r--yt/yql/tests/sql/suites/expr/non_persistable_insert_into_fail.sql9
-rw-r--r--yt/yql/tests/sql/suites/expr/non_persistable_order_by_fail.cfg2
-rw-r--r--yt/yql/tests/sql/suites/expr/non_persistable_order_by_fail.sql7
-rw-r--r--yt/yql/tests/sql/suites/expr/tagged_runtime.sql12
-rw-r--r--yt/yql/tests/sql/suites/expr/yql-10180.sql23
-rw-r--r--yt/yql/tests/sql/suites/file/bools.lst8
-rw-r--r--yt/yql/tests/sql/suites/file/file_constness.cfg3
-rw-r--r--yt/yql/tests/sql/suites/file/file_constness.sql6
-rw-r--r--yt/yql/tests/sql/suites/file/file_list_simple.cfg4
-rw-r--r--yt/yql/tests/sql/suites/file/file_list_simple.sql4
-rw-r--r--yt/yql/tests/sql/suites/file/keyid.lst7
-rw-r--r--yt/yql/tests/sql/suites/file/parse_file_in_select_as_int.cfg3
-rw-r--r--yt/yql/tests/sql/suites/file/parse_file_in_select_as_int.sql2
-rw-r--r--yt/yql/tests/sql/suites/file/parse_file_in_select_as_str.cfg3
-rw-r--r--yt/yql/tests/sql/suites/file/parse_file_in_select_as_str.sql2
-rw-r--r--yt/yql/tests/sql/suites/file/parse_file_in_select_as_uint64.cfg3
-rw-r--r--yt/yql/tests/sql/suites/file/parse_file_in_select_as_uint64.sql2
-rw-r--r--yt/yql/tests/sql/suites/file/where_key_in_file_content.cfg3
-rw-r--r--yt/yql/tests/sql/suites/file/where_key_in_file_content.sql2
-rw-r--r--yt/yql/tests/sql/suites/file/where_key_in_file_content_typed.cfg3
-rw-r--r--yt/yql/tests/sql/suites/file/where_key_in_file_content_typed.sql2
-rw-r--r--yt/yql/tests/sql/suites/file/where_key_in_get_file_content.cfg4
-rw-r--r--yt/yql/tests/sql/suites/file/where_key_in_get_file_content.sql4
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_and_where.cfg1
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_and_where.sql5
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_by_aster_opt.sql3
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_by_opt_dict.cfg1
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_by_opt_dict.sql5
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_by_typed_table.cfg1
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_by_typed_table.sql3
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_columns.sql10
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_columns_by_aggregate.sql16
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_corr_name_column.sql15
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_dict.cfg1
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_dict.sql13
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_dict_by_opt.cfg1
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_dict_by_opt.sql5
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_expr_join.cfg4
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_expr_join.sql8
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_expr_struct.sql12
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_few_fields.cfg1
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_few_fields.sql8
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_list.cfg1
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_list.sql5
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.cfg1
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.sql22
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.txt.attr55
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_member_is_struct.cfg1
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_member_is_struct.sql12
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_mode.sql40
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_one_field.cfg1
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_one_field.sql5
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_one_field_another.cfg1
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_one_field_another.sql5
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_two_fields.cfg1
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_two_fields.sql5
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_with_group_by.cfg1
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_with_group_by.sql5
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_with_group_by_expr.cfg1
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_with_group_by_expr.sql5
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_with_join.cfg1
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_with_join.sql9
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_with_resource.cfg2
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_with_resource.sql19
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/flatten_with_subquery.sql9
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/input_opt_struct_field.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/struct_without_correlation.sql14
-rw-r--r--yt/yql/tests/sql/suites/flatten_by/typed_table.txt.attr31
-rw-r--r--yt/yql/tests/sql/suites/hor_join/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/hor_join/double_input.sql14
-rw-r--r--yt/yql/tests/sql/suites/hor_join/empty_out_hor_join.sql8
-rw-r--r--yt/yql/tests/sql/suites/hor_join/filters.cfg2
-rw-r--r--yt/yql/tests/sql/suites/hor_join/filters.sql8
-rw-r--r--yt/yql/tests/sql/suites/hor_join/fuse_multi_outs1-outlimit.cfg3
-rw-r--r--yt/yql/tests/sql/suites/hor_join/fuse_multi_outs1.cfg2
-rw-r--r--yt/yql/tests/sql/suites/hor_join/fuse_multi_outs1.sql41
-rw-r--r--yt/yql/tests/sql/suites/hor_join/fuse_multi_outs2-outlimit.cfg3
-rw-r--r--yt/yql/tests/sql/suites/hor_join/fuse_multi_outs2.cfg2
-rw-r--r--yt/yql/tests/sql/suites/hor_join/fuse_multi_outs2.sql38
-rw-r--r--yt/yql/tests/sql/suites/hor_join/fuse_multi_usage-outlimit.cfg3
-rw-r--r--yt/yql/tests/sql/suites/hor_join/fuse_multi_usage.cfg2
-rw-r--r--yt/yql/tests/sql/suites/hor_join/fuse_multi_usage.sql12
-rw-r--r--yt/yql/tests/sql/suites/hor_join/group_ranges.cfg4
-rw-r--r--yt/yql/tests/sql/suites/hor_join/group_ranges.sql13
-rw-r--r--yt/yql/tests/sql/suites/hor_join/group_sampling.cfg4
-rw-r--r--yt/yql/tests/sql/suites/hor_join/group_sampling.sql17
-rw-r--r--yt/yql/tests/sql/suites/hor_join/group_yamr.cfg4
-rw-r--r--yt/yql/tests/sql/suites/hor_join/group_yamr.sql13
-rw-r--r--yt/yql/tests/sql/suites/hor_join/input.txt.attr30
-rw-r--r--yt/yql/tests/sql/suites/hor_join/less_outs.cfg7
-rw-r--r--yt/yql/tests/sql/suites/hor_join/less_outs.sql10
-rw-r--r--yt/yql/tests/sql/suites/hor_join/max_in_tables.cfg5
-rw-r--r--yt/yql/tests/sql/suites/hor_join/max_in_tables.sql17
-rw-r--r--yt/yql/tests/sql/suites/hor_join/max_outtables.cfg7
-rw-r--r--yt/yql/tests/sql/suites/hor_join/max_outtables.sql15
-rw-r--r--yt/yql/tests/sql/suites/hor_join/merge_multiouts_all.cfg5
-rw-r--r--yt/yql/tests/sql/suites/hor_join/merge_multiouts_all.sql43
-rw-r--r--yt/yql/tests/sql/suites/hor_join/merge_multiouts_part.cfg5
-rw-r--r--yt/yql/tests/sql/suites/hor_join/merge_multiouts_part.sql39
-rw-r--r--yt/yql/tests/sql/suites/hor_join/merge_multiouts_reuse.cfg5
-rw-r--r--yt/yql/tests/sql/suites/hor_join/merge_multiouts_reuse.sql43
-rw-r--r--yt/yql/tests/sql/suites/hor_join/nonstrict.txt.attr17
-rw-r--r--yt/yql/tests/sql/suites/hor_join/out_hor_join.sql10
-rw-r--r--yt/yql/tests/sql/suites/hor_join/out_max_outtables.sql18
-rw-r--r--yt/yql/tests/sql/suites/hor_join/out_mem_limit.sql14
-rw-r--r--yt/yql/tests/sql/suites/hor_join/out_range.sql8
-rw-r--r--yt/yql/tests/sql/suites/hor_join/out_sampling.cfg1
-rw-r--r--yt/yql/tests/sql/suites/hor_join/out_sampling.sql12
-rw-r--r--yt/yql/tests/sql/suites/hor_join/out_table_record.sql13
-rw-r--r--yt/yql/tests/sql/suites/hor_join/row_num_per_sect.cfg2
-rw-r--r--yt/yql/tests/sql/suites/hor_join/row_num_per_sect.sql9
-rw-r--r--yt/yql/tests/sql/suites/hor_join/runtime_dep.sql15
-rw-r--r--yt/yql/tests/sql/suites/hor_join/skip_sampling.cfg3
-rw-r--r--yt/yql/tests/sql/suites/hor_join/skip_sampling.sql14
-rw-r--r--yt/yql/tests/sql/suites/hor_join/skip_yamr.cfg3
-rw-r--r--yt/yql/tests/sql/suites/hor_join/skip_yamr.sql10
-rw-r--r--yt/yql/tests/sql/suites/hor_join/sorted.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/hor_join/sorted_out.cfg5
-rw-r--r--yt/yql/tests/sql/suites/hor_join/sorted_out.sql17
-rw-r--r--yt/yql/tests/sql/suites/hor_join/sorted_out_mix.cfg5
-rw-r--r--yt/yql/tests/sql/suites/hor_join/sorted_out_mix.sql18
-rw-r--r--yt/yql/tests/sql/suites/hor_join/table_record.cfg2
-rw-r--r--yt/yql/tests/sql/suites/hor_join/table_record.sql11
-rw-r--r--yt/yql/tests/sql/suites/hor_join/yamred_dsv.txt.attr10
-rw-r--r--yt/yql/tests/sql/suites/hor_join/yield_off.cfg3
-rw-r--r--yt/yql/tests/sql/suites/hor_join/yield_off.sql23
-rw-r--r--yt/yql/tests/sql/suites/hor_join/yield_on.sql20
-rw-r--r--yt/yql/tests/sql/suites/hor_join/yql-12610_old_table_props.cfg2
-rw-r--r--yt/yql/tests/sql/suites/hor_join/yql-12610_old_table_props.sql13
-rw-r--r--yt/yql/tests/sql/suites/hor_join/yql-6477_table_path.sql18
-rw-r--r--yt/yql/tests/sql/suites/hor_join/yql19332_aux_cols.cfg3
-rw-r--r--yt/yql/tests/sql/suites/hor_join/yql19332_aux_cols.sql9
-rw-r--r--yt/yql/tests/sql/suites/in/basic_in.sql13
-rw-r--r--yt/yql/tests/sql/suites/in/default.cfg5
-rw-r--r--yt/yql/tests/sql/suites/in/huge_in.sql2495
-rw-r--r--yt/yql/tests/sql/suites/in/in_ansi_join.cfg2
-rw-r--r--yt/yql/tests/sql/suites/in/in_ansi_join.sql52
-rw-r--r--yt/yql/tests/sql/suites/in/in_compact_distinct-empty.cfg2
-rw-r--r--yt/yql/tests/sql/suites/in/in_compact_distinct.cfg2
-rw-r--r--yt/yql/tests/sql/suites/in/in_compact_distinct.sql6
-rw-r--r--yt/yql/tests/sql/suites/in/in_enum_single0.sql1
-rw-r--r--yt/yql/tests/sql/suites/in/in_enum_single1.sql2
-rw-r--r--yt/yql/tests/sql/suites/in/in_exists_immediate_nested_subq.cfg6
-rw-r--r--yt/yql/tests/sql/suites/in/in_exists_immediate_nested_subq.sql14
-rw-r--r--yt/yql/tests/sql/suites/in/in_immediate_subquery.sql6
-rw-r--r--yt/yql/tests/sql/suites/in/in_noansi_join.cfg2
-rw-r--r--yt/yql/tests/sql/suites/in/in_noansi_join.sql52
-rw-r--r--yt/yql/tests/sql/suites/in/in_scalar_vector_subquery.sql29
-rw-r--r--yt/yql/tests/sql/suites/in/in_sorted.cfg1
-rw-r--r--yt/yql/tests/sql/suites/in/in_sorted.sql7
-rw-r--r--yt/yql/tests/sql/suites/in/in_sorted_by_tuple.cfg2
-rw-r--r--yt/yql/tests/sql/suites/in/in_sorted_by_tuple.sql10
-rw-r--r--yt/yql/tests/sql/suites/in/in_tablesource_on_raw_list.cfg6
-rw-r--r--yt/yql/tests/sql/suites/in/in_tablesource_on_raw_list.sql7
-rw-r--r--yt/yql/tests/sql/suites/in/in_tablesource_to_equijoin.cfg1
-rw-r--r--yt/yql/tests/sql/suites/in/in_tablesource_to_equijoin.sql27
-rw-r--r--yt/yql/tests/sql/suites/in/in_tuple_table.sql4
-rw-r--r--yt/yql/tests/sql/suites/in/in_types_cast.sql2
-rw-r--r--yt/yql/tests/sql/suites/in/in_types_cast_all.sql9
-rw-r--r--yt/yql/tests/sql/suites/in/in_with_list_dict.sql7
-rw-r--r--yt/yql/tests/sql/suites/in/in_with_opt_tuple.sql8
-rw-r--r--yt/yql/tests/sql/suites/in/in_with_table_of_tuples.sql16
-rw-r--r--yt/yql/tests/sql/suites/in/in_with_tuple.sql9
-rw-r--r--yt/yql/tests/sql/suites/in/input_optkey.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/in/input_optkey1.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/in/input_with_tuples.txt.attr9
-rw-r--r--yt/yql/tests/sql/suites/in/optdict.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/in/sorted.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/in/yql-10038.sql18
-rw-r--r--yt/yql/tests/sql/suites/in/yql-14677.sql10
-rw-r--r--yt/yql/tests/sql/suites/insert/after_group_by.sql2
-rw-r--r--yt/yql/tests/sql/suites/insert/anonymous_tables.sql14
-rw-r--r--yt/yql/tests/sql/suites/insert/append-with_view.cfg4
-rw-r--r--yt/yql/tests/sql/suites/insert/append.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/append.sql5
-rw-r--r--yt/yql/tests/sql/suites/insert/append_after_replace.sql6
-rw-r--r--yt/yql/tests/sql/suites/insert/append_missing_null.sql14
-rw-r--r--yt/yql/tests/sql/suites/insert/append_proto_fail.cfg4
-rw-r--r--yt/yql/tests/sql/suites/insert/append_proto_fail.sql6
-rw-r--r--yt/yql/tests/sql/suites/insert/append_sorted-to_sorted.cfg9
-rw-r--r--yt/yql/tests/sql/suites/insert/append_sorted-to_sorted_calc.cfg9
-rw-r--r--yt/yql/tests/sql/suites/insert/append_sorted-to_sorted_desc.cfg9
-rw-r--r--yt/yql/tests/sql/suites/insert/append_sorted.cfg9
-rw-r--r--yt/yql/tests/sql/suites/insert/append_sorted.sql25
-rw-r--r--yt/yql/tests/sql/suites/insert/append_view_fail.cfg5
-rw-r--r--yt/yql/tests/sql/suites/insert/append_view_fail.sql6
-rw-r--r--yt/yql/tests/sql/suites/insert/append_with_read_udf_fail.cfg4
-rw-r--r--yt/yql/tests/sql/suites/insert/append_with_read_udf_fail.sql6
-rw-r--r--yt/yql/tests/sql/suites/insert/default.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/double_append_to_anonymous.cfg1
-rw-r--r--yt/yql/tests/sql/suites/insert/double_append_to_anonymous.sql14
-rw-r--r--yt/yql/tests/sql/suites/insert/drop_sortness-calc.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/drop_sortness-desc.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/drop_sortness.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/drop_sortness.sql5
-rw-r--r--yt/yql/tests/sql/suites/insert/erasure.txt.attr10
-rw-r--r--yt/yql/tests/sql/suites/insert/fail_read_view_after_modify.cfg3
-rw-r--r--yt/yql/tests/sql/suites/insert/fail_read_view_after_modify.sql9
-rw-r--r--yt/yql/tests/sql/suites/insert/from_erasure_to_none.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/from_erasure_to_none.sql8
-rw-r--r--yt/yql/tests/sql/suites/insert/from_two_sorted_by_calc.sql15
-rw-r--r--yt/yql/tests/sql/suites/insert/inferschema.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/insert/input.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/insert/input_proto.txt.attr32
-rw-r--r--yt/yql/tests/sql/suites/insert/input_view.txt.attr4
-rw-r--r--yt/yql/tests/sql/suites/insert/input_with_read_udf.txt.attr32
-rw-r--r--yt/yql/tests/sql/suites/insert/input_with_view.txt.attr31
-rw-r--r--yt/yql/tests/sql/suites/insert/insert_from_other.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/insert_from_other.sql4
-rw-r--r--yt/yql/tests/sql/suites/insert/insert_null.sql4
-rw-r--r--yt/yql/tests/sql/suites/insert/insert_relabeled.sql3
-rw-r--r--yt/yql/tests/sql/suites/insert/keepmeta-with_view.cfg4
-rw-r--r--yt/yql/tests/sql/suites/insert/keepmeta.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/keepmeta.sql5
-rw-r--r--yt/yql/tests/sql/suites/insert/keepmeta_nonstrict_fail.cfg3
-rw-r--r--yt/yql/tests/sql/suites/insert/keepmeta_nonstrict_fail.sql6
-rw-r--r--yt/yql/tests/sql/suites/insert/keepmeta_proto_fail.cfg4
-rw-r--r--yt/yql/tests/sql/suites/insert/keepmeta_proto_fail.sql6
-rw-r--r--yt/yql/tests/sql/suites/insert/keepmeta_view_fail.cfg5
-rw-r--r--yt/yql/tests/sql/suites/insert/keepmeta_view_fail.sql6
-rw-r--r--yt/yql/tests/sql/suites/insert/keepmeta_with_read_udf_fail.cfg4
-rw-r--r--yt/yql/tests/sql/suites/insert/keepmeta_with_read_udf_fail.sql6
-rw-r--r--yt/yql/tests/sql/suites/insert/literals_to_string.sql3
-rw-r--r--yt/yql/tests/sql/suites/insert/merge_publish.cfg3
-rw-r--r--yt/yql/tests/sql/suites/insert/merge_publish.sql20
-rw-r--r--yt/yql/tests/sql/suites/insert/multiappend_sorted.sql63
-rw-r--r--yt/yql/tests/sql/suites/insert/other.txt.attr13
-rw-r--r--yt/yql/tests/sql/suites/insert/override-from_sorted.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/override-from_sorted_calc.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/override-from_sorted_desc.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/override-proto.cfg3
-rw-r--r--yt/yql/tests/sql/suites/insert/override-with_read_udf.cfg3
-rw-r--r--yt/yql/tests/sql/suites/insert/override-with_view.cfg4
-rw-r--r--yt/yql/tests/sql/suites/insert/override.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/override.sql4
-rw-r--r--yt/yql/tests/sql/suites/insert/override_view_fail.cfg5
-rw-r--r--yt/yql/tests/sql/suites/insert/override_view_fail.sql5
-rw-r--r--yt/yql/tests/sql/suites/insert/part_sortness-desc.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/part_sortness.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/part_sortness.sql5
-rw-r--r--yt/yql/tests/sql/suites/insert/read_schema.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/insert/replace_inferred.cfg1
-rw-r--r--yt/yql/tests/sql/suites/insert/replace_inferred.sql9
-rw-r--r--yt/yql/tests/sql/suites/insert/replace_inferred_op.cfg1
-rw-r--r--yt/yql/tests/sql/suites/insert/replace_inferred_op.sql9
-rw-r--r--yt/yql/tests/sql/suites/insert/replace_ordered_by_key.sql3
-rw-r--r--yt/yql/tests/sql/suites/insert/replace_ordered_by_key_desc.sql3
-rw-r--r--yt/yql/tests/sql/suites/insert/select_after_insert_relabeled.sql6
-rw-r--r--yt/yql/tests/sql/suites/insert/select_after_replace.sql6
-rw-r--r--yt/yql/tests/sql/suites/insert/select_after_replace_unwrap.sql6
-rw-r--r--yt/yql/tests/sql/suites/insert/select_operate_with_columns.cfg3
-rw-r--r--yt/yql/tests/sql/suites/insert/select_operate_with_columns.sql4
-rw-r--r--yt/yql/tests/sql/suites/insert/select_relabel.sql3
-rw-r--r--yt/yql/tests/sql/suites/insert/select_subquery.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/select_subquery.sql6
-rw-r--r--yt/yql/tests/sql/suites/insert/select_with_sort_limit.sql3
-rw-r--r--yt/yql/tests/sql/suites/insert/sorted.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/insert/sorted_calc.txt.attr44
-rw-r--r--yt/yql/tests/sql/suites/insert/sorted_desc.txt.attr47
-rw-r--r--yt/yql/tests/sql/suites/insert/sorted_empty.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/insert/sorted_unique.txt.attr21
-rw-r--r--yt/yql/tests/sql/suites/insert/trivial_literals.sql2
-rw-r--r--yt/yql/tests/sql/suites/insert/trivial_literals_multirow.sql4
-rw-r--r--yt/yql/tests/sql/suites/insert/trivial_select.sql2
-rw-r--r--yt/yql/tests/sql/suites/insert/two_input_tables.cfg4
-rw-r--r--yt/yql/tests/sql/suites/insert/two_input_tables.sql3
-rw-r--r--yt/yql/tests/sql/suites/insert/udf_empty.cfg3
-rw-r--r--yt/yql/tests/sql/suites/insert/udf_empty.sql3
-rw-r--r--yt/yql/tests/sql/suites/insert/unique_distinct_hints.cfg10
-rw-r--r--yt/yql/tests/sql/suites/insert/unique_distinct_hints.sql15
-rw-r--r--yt/yql/tests/sql/suites/insert/use_anon_table_before_commit_fail.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/use_anon_table_before_commit_fail.sql9
-rw-r--r--yt/yql/tests/sql/suites/insert/use_anon_table_without_fill_fail.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/use_anon_table_without_fill_fail.sql6
-rw-r--r--yt/yql/tests/sql/suites/insert/values_subquery.cfg3
-rw-r--r--yt/yql/tests/sql/suites/insert/values_subquery.sql6
-rw-r--r--yt/yql/tests/sql/suites/insert/yql-13083-existig.cfg3
-rw-r--r--yt/yql/tests/sql/suites/insert/yql-13083.cfg3
-rw-r--r--yt/yql/tests/sql/suites/insert/yql-13083.sql32
-rw-r--r--yt/yql/tests/sql/suites/insert/yql-14538.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert/yql-14538.sql18
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/break_sort_fail.cfg3
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/break_sort_fail.sql6
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/break_unique_fail.cfg4
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/break_unique_fail.sql7
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/default.cfg6
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/from_empty.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/from_empty.sql5
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/input1.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/input2.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/input3.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/input4.txt.attr21
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/keep_meta.sql5
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/keep_unique.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/keep_unique.sql9
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/non_existing_fail.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/non_existing_fail.sql6
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/not_all_fail.cfg4
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/not_all_fail.sql10
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/overlaping_fail.cfg4
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/overlaping_fail.sql7
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/several1.sql8
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/several2.sql9
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/sorted.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/sorted_empty.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/sorted_unique.txt.attr21
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/to_empty.cfg2
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/to_empty.sql5
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/truncate_and_append.sql9
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/truncate_fail.cfg3
-rw-r--r--yt/yql/tests/sql/suites/insert_monotonic/truncate_fail.sql6
-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
-rw-r--r--yt/yql/tests/sql/suites/json/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/json/example.txt.attr23
-rw-r--r--yt/yql/tests/sql/suites/json/json_exists/example.cfg3
-rw-r--r--yt/yql/tests/sql/suites/json/json_exists/example.sql48
-rw-r--r--yt/yql/tests/sql/suites/json/json_exists/filter_example1.txt.attr23
-rw-r--r--yt/yql/tests/sql/suites/json/json_exists/filter_example2.txt.attr23
-rw-r--r--yt/yql/tests/sql/suites/json/json_query/example.cfg1
-rw-r--r--yt/yql/tests/sql/suites/json/json_query/example.sql47
-rw-r--r--yt/yql/tests/sql/suites/json/json_value/example.cfg1
-rw-r--r--yt/yql/tests/sql/suites/json/json_value/example.sql55
-rw-r--r--yt/yql/tests/sql/suites/json/jsondocument/input.txt.attr23
-rw-r--r--yt/yql/tests/sql/suites/json/jsondocument/insert.cfg2
-rw-r--r--yt/yql/tests/sql/suites/json/jsondocument/insert.sql5
-rw-r--r--yt/yql/tests/sql/suites/json/jsondocument/select.cfg1
-rw-r--r--yt/yql/tests/sql/suites/json/jsondocument/select.sql7
-rw-r--r--yt/yql/tests/sql/suites/key_filter/between_with_key_filter.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/between_with_key_filter.sql3
-rw-r--r--yt/yql/tests/sql/suites/key_filter/calc_dependent.sql10
-rw-r--r--yt/yql/tests/sql/suites/key_filter/calc_dependent_with_tmp.sql11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/complex.sql3
-rw-r--r--yt/yql/tests/sql/suites/key_filter/contains.sql1
-rw-r--r--yt/yql/tests/sql/suites/key_filter/contains_optional.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/contains_optional.sql1
-rw-r--r--yt/yql/tests/sql/suites/key_filter/contains_tuples.sql17
-rw-r--r--yt/yql/tests/sql/suites/key_filter/contains_tuples_no_keyfilter.sql14
-rw-r--r--yt/yql/tests/sql/suites/key_filter/convert.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/convert.sql5
-rw-r--r--yt/yql/tests/sql/suites/key_filter/datetime.sql70
-rw-r--r--yt/yql/tests/sql/suites/key_filter/decimal.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/decimal.sql37
-rw-r--r--yt/yql/tests/sql/suites/key_filter/default.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/dependent_value.sql3
-rw-r--r--yt/yql/tests/sql/suites/key_filter/dict_contains.sql2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/dict_contains_optional.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/dict_contains_optional.sql2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/dynamic.txt.attr33
-rw-r--r--yt/yql/tests/sql/suites/key_filter/empty_range.cfg13
-rw-r--r--yt/yql/tests/sql/suites/key_filter/empty_range.sql17
-rw-r--r--yt/yql/tests/sql/suites/key_filter/empty_range_over_dynamic.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/empty_range_over_dynamic.sql1
-rw-r--r--yt/yql/tests/sql/suites/key_filter/extend_over_map_with_same_schema.sql10
-rw-r--r--yt/yql/tests/sql/suites/key_filter/is_null.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/is_null.sql1
-rw-r--r--yt/yql/tests/sql/suites/key_filter/is_null_multi_key.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/is_null_multi_key.sql1
-rw-r--r--yt/yql/tests/sql/suites/key_filter/is_null_or_data.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/is_null_or_data.sql1
-rw-r--r--yt/yql/tests/sql/suites/key_filter/is_null_with_condition.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/is_null_with_condition.sql1
-rw-r--r--yt/yql/tests/sql/suites/key_filter/key_dbl.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/key_decimal.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/key_filter/key_double_opt_suffix.cfg3
-rw-r--r--yt/yql/tests/sql/suites/key_filter/key_double_opt_suffix.sql13
-rw-r--r--yt/yql/tests/sql/suites/key_filter/key_flt.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/key_i16.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/key_i32.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/key_i64.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/key_i8.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/key_opt_str.txt.attr10
-rw-r--r--yt/yql/tests/sql/suites/key_filter/key_str.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/key_tzdate.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/key_filter/key_ui16.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/key_ui32.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/key_ui64.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/key_ui8.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/key_uuid.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/key_filter/lambda_with_null_filter.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/lambda_with_null_filter.sql4
-rw-r--r--yt/yql/tests/sql/suites/key_filter/large_ui64.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/mixed_opt_bounds.cfg4
-rw-r--r--yt/yql/tests/sql/suites/key_filter/mixed_opt_bounds.sql19
-rw-r--r--yt/yql/tests/sql/suites/key_filter/mixed_sort.cfg5
-rw-r--r--yt/yql/tests/sql/suites/key_filter/mixed_sort.sql5
-rw-r--r--yt/yql/tests/sql/suites/key_filter/multiusage.cfg3
-rw-r--r--yt/yql/tests/sql/suites/key_filter/multiusage.sql31
-rw-r--r--yt/yql/tests/sql/suites/key_filter/nile_pred.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/nile_pred.sql1
-rw-r--r--yt/yql/tests/sql/suites/key_filter/no_bypass_merge.cfg3
-rw-r--r--yt/yql/tests/sql/suites/key_filter/no_bypass_merge.sql8
-rw-r--r--yt/yql/tests/sql/suites/key_filter/num_key.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/optional.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/part_key_over_dynamic.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/part_key_over_dynamic.sql3
-rw-r--r--yt/yql/tests/sql/suites/key_filter/pushdown_keyextract_passthrough.sql13
-rw-r--r--yt/yql/tests/sql/suites/key_filter/pushdown_keyextract_type_adjust.sql13
-rw-r--r--yt/yql/tests/sql/suites/key_filter/r1.txt.attr12
-rw-r--r--yt/yql/tests/sql/suites/key_filter/r2.txt.attr13
-rw-r--r--yt/yql/tests/sql/suites/key_filter/range_union.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/range_union.sql67
-rw-r--r--yt/yql/tests/sql/suites/key_filter/range_union_lower_excluded.sql2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/ranges.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/ranges.sql9
-rw-r--r--yt/yql/tests/sql/suites/key_filter/sorted1.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/sorted2.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/sorted3.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/sorted4.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/split_input_with_key_filter1.cfg3
-rw-r--r--yt/yql/tests/sql/suites/key_filter/split_input_with_key_filter1.sql10
-rw-r--r--yt/yql/tests/sql/suites/key_filter/split_input_with_key_filter2.cfg3
-rw-r--r--yt/yql/tests/sql/suites/key_filter/split_input_with_key_filter2.sql10
-rw-r--r--yt/yql/tests/sql/suites/key_filter/string_with.sql5
-rw-r--r--yt/yql/tests/sql/suites/key_filter/string_with_ff.sql13
-rw-r--r--yt/yql/tests/sql/suites/key_filter/string_with_legacy.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/string_with_legacy.sql11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/tzdate.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/tzdate.sql35
-rw-r--r--yt/yql/tests/sql/suites/key_filter/utf8.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/key_filter/utf8_with_legacy.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/utf8_with_legacy.sql15
-rw-r--r--yt/yql/tests/sql/suites/key_filter/uuid.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/uuid.sql41
-rw-r--r--yt/yql/tests/sql/suites/key_filter/yql-14157.cfg3
-rw-r--r--yt/yql/tests/sql/suites/key_filter/yql-14157.sql12
-rw-r--r--yt/yql/tests/sql/suites/key_filter/yql-8117-table_key_filter.cfg4
-rw-r--r--yt/yql/tests/sql/suites/key_filter/yql-8117-table_key_filter.sql16
-rw-r--r--yt/yql/tests/sql/suites/key_filter/yql-8663-dedup_ranges.cfg2
-rw-r--r--yt/yql/tests/sql/suites/key_filter/yql-8663-dedup_ranges.sql4
-rw-r--r--yt/yql/tests/sql/suites/key_filter/yql_5895_or.sql4
-rw-r--r--yt/yql/tests/sql/suites/lambda/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/lambda/lambda_simple.sql13
-rw-r--r--yt/yql/tests/sql/suites/lambda/lambda_udf.cfg2
-rw-r--r--yt/yql/tests/sql/suites/lambda/lambda_udf.sql16
-rw-r--r--yt/yql/tests/sql/suites/lambda/lambda_use_labmda_as_arg.sql14
-rw-r--r--yt/yql/tests/sql/suites/lambda/lambda_with_tie.sql10
-rw-r--r--yt/yql/tests/sql/suites/library/p_package_cluster.json1
-rw-r--r--yt/yql/tests/sql/suites/library/package.cfg5
-rw-r--r--yt/yql/tests/sql/suites/library/package.sql9
-rw-r--r--yt/yql/tests/sql/suites/library/package_override.cfg5
-rw-r--r--yt/yql/tests/sql/suites/library/package_override.sql8
-rw-r--r--yt/yql/tests/sql/suites/like/default.cfg2
-rw-r--r--yt/yql/tests/sql/suites/like/ilike_clause.sql2
-rw-r--r--yt/yql/tests/sql/suites/like/like_clause.sql2
-rw-r--r--yt/yql/tests/sql/suites/like/like_clause_escape.sql5
-rw-r--r--yt/yql/tests/sql/suites/like/like_clause_no_pattern.sql9
-rw-r--r--yt/yql/tests/sql/suites/like/regexp_clause.cfg5
-rw-r--r--yt/yql/tests/sql/suites/like/regexp_clause.sql4
-rw-r--r--yt/yql/tests/sql/suites/limit/default.cfg2
-rw-r--r--yt/yql/tests/sql/suites/limit/dynamic.txt.attr33
-rw-r--r--yt/yql/tests/sql/suites/limit/dynamic_limit.cfg4
-rw-r--r--yt/yql/tests/sql/suites/limit/dynamic_limit.sql6
-rw-r--r--yt/yql/tests/sql/suites/limit/dynamic_sort_limit.cfg4
-rw-r--r--yt/yql/tests/sql/suites/limit/dynamic_sort_limit.sql19
-rw-r--r--yt/yql/tests/sql/suites/limit/empty_input_after_limit.sql8
-rw-r--r--yt/yql/tests/sql/suites/limit/empty_read_after_limit.sql3
-rw-r--r--yt/yql/tests/sql/suites/limit/empty_sort_after_limit.sql2
-rw-r--r--yt/yql/tests/sql/suites/limit/empty_sort_calc_after_limit.sql2
-rw-r--r--yt/yql/tests/sql/suites/limit/empty_sort_desc_after_limit.sql2
-rw-r--r--yt/yql/tests/sql/suites/limit/insert_with_limit-dynamic.cfg2
-rw-r--r--yt/yql/tests/sql/suites/limit/insert_with_limit.cfg2
-rw-r--r--yt/yql/tests/sql/suites/limit/insert_with_limit.sql3
-rw-r--r--yt/yql/tests/sql/suites/limit/limit-dynamic.cfg1
-rw-r--r--yt/yql/tests/sql/suites/limit/limit.cfg1
-rw-r--r--yt/yql/tests/sql/suites/limit/limit.sql2
-rw-r--r--yt/yql/tests/sql/suites/limit/limit_offset.sql1
-rw-r--r--yt/yql/tests/sql/suites/limit/limit_over_sort_desc_in_subquery.cfg2
-rw-r--r--yt/yql/tests/sql/suites/limit/limit_over_sort_desc_in_subquery.sql19
-rw-r--r--yt/yql/tests/sql/suites/limit/limit_skip_take.sql2
-rw-r--r--yt/yql/tests/sql/suites/limit/many_top_sorts.sql10
-rw-r--r--yt/yql/tests/sql/suites/limit/sort_calc_limit.cfg2
-rw-r--r--yt/yql/tests/sql/suites/limit/sort_calc_limit.sql8
-rw-r--r--yt/yql/tests/sql/suites/limit/sorted_desc.txt.attr47
-rw-r--r--yt/yql/tests/sql/suites/limit/yql-7900_empty_sorted_without_keys.sql11
-rw-r--r--yt/yql/tests/sql/suites/limit/yql-8046_empty_sorted_desc.cfg4
-rw-r--r--yt/yql/tests/sql/suites/limit/yql-8046_empty_sorted_desc.sql45
-rw-r--r--yt/yql/tests/sql/suites/limit/yql-8611_calc_peephole.cfg6
-rw-r--r--yt/yql/tests/sql/suites/limit/yql-8611_calc_peephole.sql31
-rw-r--r--yt/yql/tests/sql/suites/limit/yql-9617_empty_lambda.sql7
-rw-r--r--yt/yql/tests/sql/suites/limit/zero_limit.sql6
-rw-r--r--yt/yql/tests/sql/suites/lineage/default.cfg4
-rw-r--r--yt/yql/tests/sql/suites/lineage/error_type.cfg5
-rw-r--r--yt/yql/tests/sql/suites/lineage/error_type.sql14
-rw-r--r--yt/yql/tests/sql/suites/lineage/flatten_by.cfg1
-rw-r--r--yt/yql/tests/sql/suites/lineage/flatten_by.sql21
-rw-r--r--yt/yql/tests/sql/suites/lineage/flatten_list_nested_lambda.cfg4
-rw-r--r--yt/yql/tests/sql/suites/lineage/flatten_list_nested_lambda.sql19
-rw-r--r--yt/yql/tests/sql/suites/lineage/flatten_where.sql11
-rw-r--r--yt/yql/tests/sql/suites/lineage/group_by_asstruct_key.sql10
-rw-r--r--yt/yql/tests/sql/suites/lineage/grouping_sets.cfg1
-rw-r--r--yt/yql/tests/sql/suites/lineage/grouping_sets.sql17
-rw-r--r--yt/yql/tests/sql/suites/lineage/if_struct.sql4
-rw-r--r--yt/yql/tests/sql/suites/lineage/input.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/lineage/input_list.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/lineage/input_list_2.txt.attr10
-rw-r--r--yt/yql/tests/sql/suites/lineage/input_optional.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/lineage/isolated.sql8
-rw-r--r--yt/yql/tests/sql/suites/lineage/join_as_struct.sql15
-rw-r--r--yt/yql/tests/sql/suites/lineage/list_literal1.sql8
-rw-r--r--yt/yql/tests/sql/suites/lineage/list_literal2.sql10
-rw-r--r--yt/yql/tests/sql/suites/lineage/list_literal3.sql12
-rw-r--r--yt/yql/tests/sql/suites/lineage/list_literal4.sql13
-rw-r--r--yt/yql/tests/sql/suites/lineage/member_over_if_struct.sql4
-rw-r--r--yt/yql/tests/sql/suites/lineage/nested_lambda_fields.sql18
-rw-r--r--yt/yql/tests/sql/suites/lineage/process.sql8
-rw-r--r--yt/yql/tests/sql/suites/lineage/reduce.sql7
-rw-r--r--yt/yql/tests/sql/suites/lineage/reduce_all.sql8
-rw-r--r--yt/yql/tests/sql/suites/lineage/reduce_all_row.sql9
-rw-r--r--yt/yql/tests/sql/suites/lineage/scalar_context.cfg4
-rw-r--r--yt/yql/tests/sql/suites/lineage/scalar_context.sql12
-rw-r--r--yt/yql/tests/sql/suites/lineage/select_all.sql3
-rw-r--r--yt/yql/tests/sql/suites/lineage/select_all_filter.sql4
-rw-r--r--yt/yql/tests/sql/suites/lineage/select_field.sql3
-rw-r--r--yt/yql/tests/sql/suites/lineage/select_field_filter.sql4
-rw-r--r--yt/yql/tests/sql/suites/lineage/select_field_limit_offset.sql6
-rw-r--r--yt/yql/tests/sql/suites/lineage/select_field_order_by.sql4
-rw-r--r--yt/yql/tests/sql/suites/lineage/select_field_rename.sql3
-rw-r--r--yt/yql/tests/sql/suites/lineage/select_group_by_all.sql3
-rw-r--r--yt/yql/tests/sql/suites/lineage/select_group_by_key.sql3
-rw-r--r--yt/yql/tests/sql/suites/lineage/select_join.sql5
-rw-r--r--yt/yql/tests/sql/suites/lineage/select_mix_fields.sql3
-rw-r--r--yt/yql/tests/sql/suites/lineage/select_nested_table_row.sql3
-rw-r--r--yt/yql/tests/sql/suites/lineage/select_table_row.sql3
-rw-r--r--yt/yql/tests/sql/suites/lineage/select_union_all.sql5
-rw-r--r--yt/yql/tests/sql/suites/lineage/some_tablerow.sql6
-rw-r--r--yt/yql/tests/sql/suites/lineage/topsort.sql8
-rw-r--r--yt/yql/tests/sql/suites/lineage/union_all_tablerow.sql11
-rw-r--r--yt/yql/tests/sql/suites/lineage/unordered_subquery.sql9
-rw-r--r--yt/yql/tests/sql/suites/lineage/window_asstruct.sql6
-rw-r--r--yt/yql/tests/sql/suites/lineage/window_many.sql4
-rw-r--r--yt/yql/tests/sql/suites/lineage/window_member_struct.sql4
-rw-r--r--yt/yql/tests/sql/suites/lineage/window_one.sql2
-rw-r--r--yt/yql/tests/sql/suites/lineage/window_session.sql4
-rw-r--r--yt/yql/tests/sql/suites/lineage/window_tablerow.sql6
-rw-r--r--yt/yql/tests/sql/suites/lineage/with_inline.sql8
-rw-r--r--yt/yql/tests/sql/suites/optimizers/aggregate_over_aggregate.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/aggregate_over_aggregate.sql5
-rw-r--r--yt/yql/tests/sql/suites/optimizers/combinebykey_fields_subset.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/combinebykey_fields_subset.sql3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/combinebykey_fields_subset_range.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/combinebykey_fields_subset_range.sql5
-rw-r--r--yt/yql/tests/sql/suites/optimizers/default.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/direct_row_after_merge.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/direct_row_after_merge.sql8
-rw-r--r--yt/yql/tests/sql/suites/optimizers/field_subset_for_multiusage.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/field_subset_for_multiusage.sql15
-rw-r--r--yt/yql/tests/sql/suites/optimizers/flatmap_with_non_struct_out.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/flatmap_with_non_struct_out.sql6
-rw-r--r--yt/yql/tests/sql/suites/optimizers/group_visit_lambdas.cfg6
-rw-r--r--yt/yql/tests/sql/suites/optimizers/group_visit_lambdas.sql13
-rw-r--r--yt/yql/tests/sql/suites/optimizers/input1.txt.attr42
-rw-r--r--yt/yql/tests/sql/suites/optimizers/input3.txt.attr30
-rw-r--r--yt/yql/tests/sql/suites/optimizers/input4.txt.attr10
-rw-r--r--yt/yql/tests/sql/suites/optimizers/input5.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/optimizers/input_other.txt.attr8
-rw-r--r--yt/yql/tests/sql/suites/optimizers/input_view.txt.attr4
-rw-r--r--yt/yql/tests/sql/suites/optimizers/length_over_merge.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/length_over_merge.sql12
-rw-r--r--yt/yql/tests/sql/suites/optimizers/length_over_merge_fs_multiusage.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/length_over_merge_fs_multiusage.sql14
-rw-r--r--yt/yql/tests/sql/suites/optimizers/multi_to_empty_constraint.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/multi_to_empty_constraint.sql8
-rw-r--r--yt/yql/tests/sql/suites/optimizers/nonselected_direct_row.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/nonselected_direct_row.sql8
-rw-r--r--yt/yql/tests/sql/suites/optimizers/opt_key.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/optimizers/passthrough_sortness_over_map.sql31
-rw-r--r--yt/yql/tests/sql/suites/optimizers/pushdown_nonsep_over_aggregate.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/pushdown_nonsep_over_aggregate.sql12
-rw-r--r--yt/yql/tests/sql/suites/optimizers/reduce_with_aux_sort_column.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/reduce_with_aux_sort_column.sql12
-rw-r--r--yt/yql/tests/sql/suites/optimizers/simplified_path_constraint.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/simplified_path_constraint.sql11
-rw-r--r--yt/yql/tests/sql/suites/optimizers/sort_by_nonstrict_const.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/sort_by_nonstrict_const.sql5
-rw-r--r--yt/yql/tests/sql/suites/optimizers/sort_constraint_in_left.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/sort_constraint_in_left.sql19
-rw-r--r--yt/yql/tests/sql/suites/optimizers/sort_over_sorted_prefix_keys.sql14
-rw-r--r--yt/yql/tests/sql/suites/optimizers/sort_over_sorted_same_keys.sql14
-rw-r--r--yt/yql/tests/sql/suites/optimizers/sorted.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/optimizers/sorted_desc.txt.attr47
-rw-r--r--yt/yql/tests/sql/suites/optimizers/sorted_scalar_content.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/sorted_scalar_content.sql13
-rw-r--r--yt/yql/tests/sql/suites/optimizers/sorted_sql_in.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/sorted_sql_in.sql13
-rw-r--r--yt/yql/tests/sql/suites/optimizers/test_fuse_map_predicate_limit.sql12
-rw-r--r--yt/yql/tests/sql/suites/optimizers/test_fuse_map_take.sql10
-rw-r--r--yt/yql/tests/sql/suites/optimizers/test_lmap_opts.cfg5
-rw-r--r--yt/yql/tests/sql/suites/optimizers/test_lmap_opts.sql47
-rw-r--r--yt/yql/tests/sql/suites/optimizers/test_no_aggregate_split.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/test_no_aggregate_split.sql15
-rw-r--r--yt/yql/tests/sql/suites/optimizers/unused_columns_group.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/unused_columns_group.sql9
-rw-r--r--yt/yql/tests/sql/suites/optimizers/unused_columns_group_one_of_multi.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/unused_columns_group_one_of_multi.sql8
-rw-r--r--yt/yql/tests/sql/suites/optimizers/unused_columns_window.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/unused_columns_window.sql9
-rw-r--r--yt/yql/tests/sql/suites/optimizers/unused_columns_window.txt.attr8
-rw-r--r--yt/yql/tests/sql/suites/optimizers/unused_columns_window_no_payloads.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/unused_columns_window_no_payloads.sql9
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-10042_disable_flow_fuse_depends_on.sql6
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-10070_extract_members_over_calcoverwindow.sql23
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-10737_lost_passthrough.sql15
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-11171_unordered_over_sorted_fill.cfg4
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-11171_unordered_over_sorted_fill.sql18
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-12620_stage_multiuse.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-12620_stage_multiuse.sql7
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-14279_keyextract_with_world_dep.cfg4
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-14279_keyextract_with_world_dep.sql12
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-14581_fuseflatmaps_with_external_lambda.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-14581_fuseflatmaps_with_external_lambda.sql28
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-15210_sqlin.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-15210_sqlin.sql10
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-17413-topsort.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-17413-topsort.sql10
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-17715_concat_sort_desc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-17715_concat_sort_desc.sql43
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-18300-flatmap-over-extend.sql19
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-18408_filter_multiusage_pushdown.sql84
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-18733_no_filter_multiusage_pushdown.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-18733_no_filter_multiusage_pushdown.sql6
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-2171_aggregate_desc_sort_and_extract.cfg4
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-2171_aggregate_desc_sort_and_extract.sql16
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-2582_limit_for_join_input.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-2582_limit_for_join_input.sql11
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-2582_limit_for_join_input_other.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-2582_limit_for_join_input_other.sql12
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-3455_filter_sorted.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-3455_filter_sorted.sql18
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-4240-aggregate_whole_struct.sql16
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-5833-table_content.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-5833-table_content.sql13
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-5978_fill_multi_usage.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-5978_fill_multi_usage.sql29
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-6008_limit_after_map.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-6008_limit_after_map.sql11
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-6038_direct_row.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-6038_direct_row.sql25
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-6133_skip_deps.cfg4
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-6133_skip_deps.sql28
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-7324_duplicate_arg.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-7324_duplicate_arg.sql23
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-7532_wrong_field_subset_for_calcoverwindow.sql23
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-7767_key_filter_with_view.cfg5
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-7767_key_filter_with_view.sql10
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-8041-fuse_with_desc_map.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-8041-fuse_with_desc_map.sql17
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-8223_direct_row_and_skipnullmembers.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-8223_direct_row_and_skipnullmembers.sql25
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-8953_logical_fuse_with_table_props.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-8953_logical_fuse_with_table_props.sql10
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-9297_publish_ytcopy.cfg3
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql-9297_publish_ytcopy.sql22
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql_5830_fuse_outer_with_extra_deps.cfg2
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql_5830_fuse_outer_with_extra_deps.sql14
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql_6179_merge_chunks_of_outputs.cfg1
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yql_6179_merge_chunks_of_outputs.sql15
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yt_shuffle_by_keys.cfg4
-rw-r--r--yt/yql/tests/sql/suites/optimizers/yt_shuffle_by_keys.sql23
-rw-r--r--yt/yql/tests/sql/suites/order_by/SortByOneField.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/SortByOneField.sql1
-rw-r--r--yt/yql/tests/sql/suites/order_by/SortByOneFieldDesc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/SortByOneFieldDesc.sql1
-rw-r--r--yt/yql/tests/sql/suites/order_by/SortByTwoFields.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/SortByTwoFields.sql1
-rw-r--r--yt/yql/tests/sql/suites/order_by/SortByTwoFieldsDesc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/SortByTwoFieldsDesc.sql1
-rw-r--r--yt/yql/tests/sql/suites/order_by/assume_cut_prefix.cfg2
-rw-r--r--yt/yql/tests/sql/suites/order_by/assume_cut_prefix.sql8
-rw-r--r--yt/yql/tests/sql/suites/order_by/assume_over_input.cfg2
-rw-r--r--yt/yql/tests/sql/suites/order_by/assume_over_input.sql7
-rw-r--r--yt/yql/tests/sql/suites/order_by/assume_over_input_desc.cfg2
-rw-r--r--yt/yql/tests/sql/suites/order_by/assume_over_input_desc.sql9
-rw-r--r--yt/yql/tests/sql/suites/order_by/assume_with_filter.cfg2
-rw-r--r--yt/yql/tests/sql/suites/order_by/assume_with_filter.sql13
-rw-r--r--yt/yql/tests/sql/suites/order_by/assume_with_transform_desc.cfg2
-rw-r--r--yt/yql/tests/sql/suites/order_by/assume_with_transform_desc.sql13
-rw-r--r--yt/yql/tests/sql/suites/order_by/changed_sort_with_limit.cfg3
-rw-r--r--yt/yql/tests/sql/suites/order_by/changed_sort_with_limit.sql11
-rw-r--r--yt/yql/tests/sql/suites/order_by/columns.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/order_by/complex_type.txt.attr13
-rw-r--r--yt/yql/tests/sql/suites/order_by/decimals.txt.attr8
-rw-r--r--yt/yql/tests/sql/suites/order_by/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/descending.txt.attr21
-rw-r--r--yt/yql/tests/sql/suites/order_by/extract_members_over_sort_desc.cfg2
-rw-r--r--yt/yql/tests/sql/suites/order_by/extract_members_over_sort_desc.sql12
-rw-r--r--yt/yql/tests/sql/suites/order_by/input_sorted.txt.attr53
-rw-r--r--yt/yql/tests/sql/suites/order_by/limit.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/limit.sql1
-rw-r--r--yt/yql/tests/sql/suites/order_by/literal.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/literal.sql8
-rw-r--r--yt/yql/tests/sql/suites/order_by/literal_complex.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/literal_complex.sql9
-rw-r--r--yt/yql/tests/sql/suites/order_by/literal_desc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/literal_desc.sql9
-rw-r--r--yt/yql/tests/sql/suites/order_by/literal_empty_list_sort.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/literal_empty_list_sort.sql9
-rw-r--r--yt/yql/tests/sql/suites/order_by/literal_single_item_sort.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/literal_single_item_sort.sql11
-rw-r--r--yt/yql/tests/sql/suites/order_by/literal_take_zero_sort.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/literal_take_zero_sort.sql15
-rw-r--r--yt/yql/tests/sql/suites/order_by/literal_with_assume.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/literal_with_assume.sql15
-rw-r--r--yt/yql/tests/sql/suites/order_by/literal_with_assume_desc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/literal_with_assume_desc.sql11
-rw-r--r--yt/yql/tests/sql/suites/order_by/native_desc_assume_with_transform.cfg3
-rw-r--r--yt/yql/tests/sql/suites/order_by/native_desc_assume_with_transform.sql13
-rw-r--r--yt/yql/tests/sql/suites/order_by/native_desc_publish.cfg3
-rw-r--r--yt/yql/tests/sql/suites/order_by/native_desc_publish.sql11
-rw-r--r--yt/yql/tests/sql/suites/order_by/native_desc_sort-over_sorted.cfg3
-rw-r--r--yt/yql/tests/sql/suites/order_by/native_desc_sort.cfg3
-rw-r--r--yt/yql/tests/sql/suites/order_by/native_desc_sort.sql7
-rw-r--r--yt/yql/tests/sql/suites/order_by/native_desc_sort_calc.cfg3
-rw-r--r--yt/yql/tests/sql/suites/order_by/native_desc_sort_calc.sql7
-rw-r--r--yt/yql/tests/sql/suites/order_by/native_desc_sort_with_limit.cfg3
-rw-r--r--yt/yql/tests/sql/suites/order_by/native_desc_sort_with_limit.sql7
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_dot_column.sql3
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_dynum.sql3
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_dynum_desc.sql4
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_expr.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_expr.sql2
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_expr_mul_cols.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_expr_mul_cols.sql2
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_expr_over_sorted_table.cfg2
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_expr_over_sorted_table.sql2
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_expr_simple.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_expr_simple.sql2
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_expr_with_deps.sql8
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_list_of_strings.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_list_of_strings.sql3
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_missing_project_column.sql11
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_mul_columns.sql1
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_num_key_and_subkey.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_num_key_and_subkey.sql2
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_num_key_and_subkey_desc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_num_key_and_subkey_desc.sql2
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_tablepath_column.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_tablepath_column.sql5
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_tablerecord_column.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_tablerecord_column.sql6
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_tablerow_column.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_tablerow_column.sql5
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_tuple.sql6
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_tuple_and_member.sql6
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_tuple_expr.sql10
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_udf.cfg2
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_udf.sql4
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_udf_duo.cfg2
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_udf_duo.sql5
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_by_value_desc.sql1
-rw-r--r--yt/yql/tests/sql/suites/order_by/order_with_null.sql11
-rw-r--r--yt/yql/tests/sql/suites/order_by/ordered_fill.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/ordered_fill.sql10
-rw-r--r--yt/yql/tests/sql/suites/order_by/presort_order_by_table.sql15
-rw-r--r--yt/yql/tests/sql/suites/order_by/read_schema.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/order_by/singular.sql12
-rw-r--r--yt/yql/tests/sql/suites/order_by/sort.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/sort.sql1
-rw-r--r--yt/yql/tests/sql/suites/order_by/sort_decimals.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/sort_decimals.sql4
-rw-r--r--yt/yql/tests/sql/suites/order_by/sort_simple.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/sort_simple.sql6
-rw-r--r--yt/yql/tests/sql/suites/order_by/sort_with_take.cfg2
-rw-r--r--yt/yql/tests/sql/suites/order_by/sort_with_take.sql6
-rw-r--r--yt/yql/tests/sql/suites/order_by/sort_with_take_limit.cfg2
-rw-r--r--yt/yql/tests/sql/suites/order_by/sort_with_take_limit.sql6
-rw-r--r--yt/yql/tests/sql/suites/order_by/sorted_table1.txt.attr12
-rw-r--r--yt/yql/tests/sql/suites/order_by/union_all.cfg2
-rw-r--r--yt/yql/tests/sql/suites/order_by/union_all.sql21
-rw-r--r--yt/yql/tests/sql/suites/order_by/unsorted.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/order_by/warn_offset_wo_sort.cfg1
-rw-r--r--yt/yql/tests/sql/suites/order_by/warn_offset_wo_sort.sql7
-rw-r--r--yt/yql/tests/sql/suites/params/complex_yson.cfg1
-rw-r--r--yt/yql/tests/sql/suites/params/complex_yson.sql4
-rw-r--r--yt/yql/tests/sql/suites/params/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/params/p_bool.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_date.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_datetime.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_decimal.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_dict.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_dict2.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_double.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_int64.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_interval.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_json.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_list.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_null.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_number_list.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_string.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_string_bin.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_string_ru.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_struct.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_timestamp.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_tuple1.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_tuple2.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_tzdate.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_tzdatetime.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_tztimestamp.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_uint64.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_uuid.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_variant1.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_variant2.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_variant3.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_variant4.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_variant5.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_yson.json1
-rw-r--r--yt/yql/tests/sql/suites/params/p_yson2.json101
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/call_center.txt.attr37
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/catalog_page.txt.attr15
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/catalog_returns.txt.attr33
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/catalog_sales.txt.attr40
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/customer.txt.attr24
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/customer_address.txt.attr19
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/customer_demographics.txt.attr15
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/date_dim.txt.attr34
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/default.cfg24
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/household_demographics.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/income_band.txt.attr9
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/inventory.txt.attr10
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/item.txt.attr28
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/promotion.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q01.sql28
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q02.sql63
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q03.sql24
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q04.sql119
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q05.sql131
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q06.sql29
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q07.sql24
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q08.sql111
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q09.sql54
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q10.sql62
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q11.sql84
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q12.sql37
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q13.sql55
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q14.sql213
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q15.sql23
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q16.sql34
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q17.sql48
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q18.sql37
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q19.sql28
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q20.sql33
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q21.sql33
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q22.sql23
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q23.sql110
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q24.sql110
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q25.sql51
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q26.sql24
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q27.sql26
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q28.sql56
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q29.sql50
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q30.sql34
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q31.sql55
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q32.sql31
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q33.sql78
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q34.sql34
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q35.sql61
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q36.sql33
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q37.sql20
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q38.sql26
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q39.sql57
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q40.sql31
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q41.sql55
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q42.sql25
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q43.sql22
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q44.sql38
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q45.sql23
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q46.sql38
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q47.sql54
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q48.sql70
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q49.sql132
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q50.sql62
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q51.sql48
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q52.sql25
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q53.sql31
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q54.sql59
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q55.sql17
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q56.sql72
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q57.sql51
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q58.sql68
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q59.sql47
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q60.sql81
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q61.sql47
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q62.sql38
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q63.sql32
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q64.sql124
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q65.sql32
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q66.sql223
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q67.sql47
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q68.sql45
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q69.sql50
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q70.sql41
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q71.sql43
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q72.sql32
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q73.sql31
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q74.sql64
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q75.sql73
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q76.sql27
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q77.sql111
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q78.sql61
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q79.sql26
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q80.sql99
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q81.sql34
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q82.sql20
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q83.sql70
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q84.sql24
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q85.sql87
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q86.sql29
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q87.sql26
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q88.sql97
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q89.sql31
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q90.sql25
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q91.sql34
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q92.sql33
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q93.sql21
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q94.sql32
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q95.sql35
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q96.sql19
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q97.sql28
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q98.sql36
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/q99.sql38
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/reason.txt.attr9
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/ship_mode.txt.attr12
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/store.txt.attr35
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/store_returns.txt.attr26
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/store_sales.txt.attr29
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/time_dim.txt.attr16
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/warehouse.txt.attr20
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/web_page.txt.attr20
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/web_returns.txt.attr30
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/web_sales.txt.attr40
-rw-r--r--yt/yql/tests/sql/suites/pg-tpcds/web_site.txt.attr32
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/customer.txt.attr14
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/default.cfg8
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/lineitem.txt.attr22
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/nation.txt.attr10
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/orders.txt.attr15
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/part.txt.attr15
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/partsupp.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q01.sql25
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q02.sql49
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q03.sql27
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q04.sql26
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q05.sql28
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q06.sql13
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q07.sql41
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q08.sql41
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q09.sql35
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q10.sql36
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q11.sql32
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q12.sql32
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q13.sql25
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q14.sql17
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q15.sql36
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q16.sql34
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q17.sql22
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q18.sql38
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q19.sql39
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q20.sql41
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q21.sql44
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/q22.sql40
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/region.txt.attr9
-rw-r--r--yt/yql/tests/sql/suites/pg-tpch/supplier.txt.attr13
-rw-r--r--yt/yql/tests/sql/suites/pg/aggregate_combine.cfg1
-rw-r--r--yt/yql/tests/sql/suites/pg/aggregate_combine.sql4
-rw-r--r--yt/yql/tests/sql/suites/pg/aggregate_combine_all.cfg1
-rw-r--r--yt/yql/tests/sql/suites/pg/aggregate_combine_all.sql3
-rw-r--r--yt/yql/tests/sql/suites/pg/aggregate_minus_zero.cfg1
-rw-r--r--yt/yql/tests/sql/suites/pg/aggregate_minus_zero.sql6
-rw-r--r--yt/yql/tests/sql/suites/pg/all_data.cfg1
-rw-r--r--yt/yql/tests/sql/suites/pg/all_data.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/all_data.txt.attr35
-rw-r--r--yt/yql/tests/sql/suites/pg/default.cfg3
-rw-r--r--yt/yql/tests/sql/suites/pg/doubles_search_path.sql3
-rw-r--r--yt/yql/tests/sql/suites/pg/drop_table.cfg1
-rw-r--r--yt/yql/tests/sql/suites/pg/drop_table.sql17
-rw-r--r--yt/yql/tests/sql/suites/pg/in_mixed.cfg1
-rw-r--r--yt/yql/tests/sql/suites/pg/in_mixed.sql21
-rw-r--r--yt/yql/tests/sql/suites/pg/input.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/pg/input2.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/pg/input3.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/pg/input4.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/pg/input5.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/pg/inputC.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/pg/inputZ.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/pg/input_1.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/pg/input_2.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/pg/input_3.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/pg/input_name.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/pg/input_pg.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/pg/input_pg_int_and_text.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/pg/insert.cfg2
-rw-r--r--yt/yql/tests/sql/suites/pg/insert.sql3
-rw-r--r--yt/yql/tests/sql/suites/pg/join_using_multiple2.cfg3
-rw-r--r--yt/yql/tests/sql/suites/pg/join_using_multiple2.sql9
-rw-r--r--yt/yql/tests/sql/suites/pg/join_using_tables1.sql6
-rw-r--r--yt/yql/tests/sql/suites/pg/join_using_tables2.sql6
-rw-r--r--yt/yql/tests/sql/suites/pg/join_using_tables3.sql6
-rw-r--r--yt/yql/tests/sql/suites/pg/join_using_tables4.sql6
-rw-r--r--yt/yql/tests/sql/suites/pg/name.cfg2
-rw-r--r--yt/yql/tests/sql/suites/pg/name.sql6
-rw-r--r--yt/yql/tests/sql/suites/pg/nulls.sql39
-rw-r--r--yt/yql/tests/sql/suites/pg/nulls_native.sql40
-rw-r--r--yt/yql/tests/sql/suites/pg/param_text1.json1
-rw-r--r--yt/yql/tests/sql/suites/pg/param_text2.json1
-rw-r--r--yt/yql/tests/sql/suites/pg/pg_column_case.cfg2
-rw-r--r--yt/yql/tests/sql/suites/pg/pg_column_case.sql7
-rw-r--r--yt/yql/tests/sql/suites/pg/pg_types_orderby.cfg2
-rw-r--r--yt/yql/tests/sql/suites/pg/pg_types_orderby.sql32
-rw-r--r--yt/yql/tests/sql/suites/pg/point.sql3
-rw-r--r--yt/yql/tests/sql/suites/pg/select_alias_partial.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/select_columnref1.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/select_columnref2.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/select_common_type_unionall.cfg1
-rw-r--r--yt/yql/tests/sql/suites/pg/select_common_type_unionall.sql21
-rw-r--r--yt/yql/tests/sql/suites/pg/select_from_columns.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/select_from_columns_qstar.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/select_from_columns_star.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/select_limit.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/select_qstarref1.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/select_qstarref2.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/select_starref1.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/select_starref2.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/select_subquery.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/select_subquery2.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/select_subquery2_qstar.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/select_table1.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/select_table2.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/select_unionall_self.sql6
-rw-r--r--yt/yql/tests/sql/suites/pg/select_where.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg/select_yql_type.cfg1
-rw-r--r--yt/yql/tests/sql/suites/pg/select_yql_type.sql15
-rw-r--r--yt/yql/tests/sql/suites/pg/table_func.sql15
-rw-r--r--yt/yql/tests/sql/suites/pg/wide_sort.cfg1
-rw-r--r--yt/yql/tests/sql/suites/pg/wide_sort.sql5
-rw-r--r--yt/yql/tests/sql/suites/pg/wide_top_sort.cfg1
-rw-r--r--yt/yql/tests/sql/suites/pg/wide_top_sort.sql5
-rw-r--r--yt/yql/tests/sql/suites/pg_catalog/default.cfg0
-rw-r--r--yt/yql/tests/sql/suites/pg_catalog/input_pg.txt.attr5
-rw-r--r--yt/yql/tests/sql/suites/pg_catalog/lambda.cfg2
-rw-r--r--yt/yql/tests/sql/suites/pg_catalog/lambda.sql2
-rw-r--r--yt/yql/tests/sql/suites/pg_duplicated/default.cfg0
-rw-r--r--yt/yql/tests/sql/suites/pg_duplicated/duplicated_rowspec.cfg1
-rw-r--r--yt/yql/tests/sql/suites/pg_duplicated/duplicated_rowspec.sql3
-rw-r--r--yt/yql/tests/sql/suites/pg_duplicated/duplicated_rowspec.txt.attr36
-rw-r--r--yt/yql/tests/sql/suites/pragma/config_exec.cfg2
-rw-r--r--yt/yql/tests/sql/suites/pragma/config_exec.sql10
-rw-r--r--yt/yql/tests/sql/suites/pragma/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/pragma/file.sql1
-rw-r--r--yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull.cfg2
-rw-r--r--yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull.sql23
-rw-r--r--yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_fail.cfg3
-rw-r--r--yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_fail.sql24
-rw-r--r--yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_single_thread.cfg2
-rw-r--r--yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_single_thread.sql23
-rw-r--r--yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_single_thread_fail.cfg3
-rw-r--r--yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_single_thread_fail.sql25
-rw-r--r--yt/yql/tests/sql/suites/produce/default.cfg7
-rw-r--r--yt/yql/tests/sql/suites/produce/descending.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/produce/discard_process_with_lambda.sql8
-rw-r--r--yt/yql/tests/sql/suites/produce/discard_reduce_lambda.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/discard_reduce_lambda.sql9
-rw-r--r--yt/yql/tests/sql/suites/produce/fuse_reduces_with_presort.cfg1
-rw-r--r--yt/yql/tests/sql/suites/produce/fuse_reduces_with_presort.sql69
-rw-r--r--yt/yql/tests/sql/suites/produce/input_sorted.txt.attr15
-rw-r--r--yt/yql/tests/sql/suites/produce/native_desc_reduce_with_presort.cfg4
-rw-r--r--yt/yql/tests/sql/suites/produce/native_desc_reduce_with_presort.sql23
-rw-r--r--yt/yql/tests/sql/suites/produce/process_and_filter.sql2
-rw-r--r--yt/yql/tests/sql/suites/produce/process_lambda_opt_args.sql14
-rw-r--r--yt/yql/tests/sql/suites/produce/process_multi_in.cfg4
-rw-r--r--yt/yql/tests/sql/suites/produce/process_multi_in.sql22
-rw-r--r--yt/yql/tests/sql/suites/produce/process_multi_in_single_out.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/process_multi_in_single_out.sql25
-rw-r--r--yt/yql/tests/sql/suites/produce/process_multi_in_trivial_lambda.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/process_multi_in_trivial_lambda.sql12
-rw-r--r--yt/yql/tests/sql/suites/produce/process_multi_out.cfg4
-rw-r--r--yt/yql/tests/sql/suites/produce/process_multi_out.sql24
-rw-r--r--yt/yql/tests/sql/suites/produce/process_multi_out_bad_count_fail.cfg4
-rw-r--r--yt/yql/tests/sql/suites/produce/process_multi_out_bad_count_fail.sql23
-rw-r--r--yt/yql/tests/sql/suites/produce/process_pure_with_sort.sql32
-rw-r--r--yt/yql/tests/sql/suites/produce/process_row_and_columns.sql19
-rw-r--r--yt/yql/tests/sql/suites/produce/process_rows_and_filter.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/process_rows_and_filter.sql23
-rw-r--r--yt/yql/tests/sql/suites/produce/process_rows_sorted_desc_multi_out.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/process_rows_sorted_desc_multi_out.sql30
-rw-r--r--yt/yql/tests/sql/suites/produce/process_rows_sorted_multi_out.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/process_rows_sorted_multi_out.sql30
-rw-r--r--yt/yql/tests/sql/suites/produce/process_sorted_desc_multi_out.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/process_sorted_desc_multi_out.sql28
-rw-r--r--yt/yql/tests/sql/suites/produce/process_sorted_multi_out.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/process_sorted_multi_out.sql28
-rw-r--r--yt/yql/tests/sql/suites/produce/process_streaming.sql22
-rw-r--r--yt/yql/tests/sql/suites/produce/process_streaming_count.sql19
-rw-r--r--yt/yql/tests/sql/suites/produce/process_streaming_inline_bash.sql14
-rw-r--r--yt/yql/tests/sql/suites/produce/process_trivial_as_struct.sql2
-rw-r--r--yt/yql/tests/sql/suites/produce/process_with_assume.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/process_with_assume.sql12
-rw-r--r--yt/yql/tests/sql/suites/produce/process_with_lambda.sql8
-rw-r--r--yt/yql/tests/sql/suites/produce/process_with_lambda_outstream.sql27
-rw-r--r--yt/yql/tests/sql/suites/produce/process_with_python.sql10
-rw-r--r--yt/yql/tests/sql/suites/produce/process_with_python_as_struct.sql10
-rw-r--r--yt/yql/tests/sql/suites/produce/process_with_python_stream-empty.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/process_with_python_stream.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/process_with_python_stream.sql23
-rw-r--r--yt/yql/tests/sql/suites/produce/process_with_udf.sql2
-rw-r--r--yt/yql/tests/sql/suites/produce/process_with_udf_rows.sql17
-rw-r--r--yt/yql/tests/sql/suites/produce/process_with_udf_validate.sql7
-rw-r--r--yt/yql/tests/sql/suites/produce/process_with_udf_validate_ignore_broken.sql8
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_all.sql16
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_all_expr.sql16
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_all_list.sql18
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_all_list_stream.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_all_list_stream.sql25
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_all_multi_in.sql15
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_all_opt.sql16
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_all_with_python_input_stream-dq_fail.cfg4
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_all_with_python_input_stream.cfg5
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_all_with_python_input_stream.sql14
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_by_struct.sql16
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_lambda.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_lambda.sql11
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_lambda_list_mem.sql11
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_lambda_list_table.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_lambda_list_table.sql11
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_lambda_presort_twin.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_lambda_presort_twin.sql13
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_lambda_presort_twin_list.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_lambda_presort_twin_list.sql13
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in-empty.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in-sorted.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in.sql22
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype.sql22
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype_assume.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype_assume.sql46
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype_assume_keytuple.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype_assume_keytuple.sql45
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_keytuple.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_keytuple.sql21
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_keytuple_difftype.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_keytuple_difftype.sql22
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_presort.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_presort.sql22
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_ref.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_ref.sql24
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_sampling-sorted.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_sampling.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_sampling.sql23
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_stage_and_flatmap.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_in_stage_and_flatmap.sql24
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_out.cfg4
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_multi_out.sql18
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_subfields-sorted.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_subfields.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_subfields.sql25
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_typeinfo.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_typeinfo.sql18
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_assume.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_assume.sql11
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_assume_in_subquery.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_assume_in_subquery.sql13
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_flat_lambda.sql9
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_flat_python_stream.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_flat_python_stream.sql30
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_presort_diff_order.cfg2
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_presort_diff_order.sql32
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python.sql16
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_few_keys.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_few_keys.sql15
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_few_keys_stream.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_few_keys_stream.sql19
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_filter_and_having.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_filter_and_having.sql14
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_having.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_having.sql14
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_input_stream.cfg4
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_input_stream.sql14
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_presort.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_presort.sql15
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_presort_stream.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_presort_stream.sql15
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_row.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_row.sql17
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_row_repack.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_python_row_repack.sql16
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_trivial_remaps.cfg3
-rw-r--r--yt/yql/tests/sql/suites/produce/reduce_with_trivial_remaps.sql15
-rw-r--r--yt/yql/tests/sql/suites/produce/sorted.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/produce/sorted1.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/produce/sorted2.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/result_types/containers.sql45
-rw-r--r--yt/yql/tests/sql/suites/result_types/data.sql56
-rw-r--r--yt/yql/tests/sql/suites/result_types/default.cfg0
-rw-r--r--yt/yql/tests/sql/suites/result_types/pg.sql33
-rw-r--r--yt/yql/tests/sql/suites/result_types/singular.sql24
-rw-r--r--yt/yql/tests/sql/suites/sampling/bind_default.sql8
-rw-r--r--yt/yql/tests/sql/suites/sampling/bind_expr.sql10
-rw-r--r--yt/yql/tests/sql/suites/sampling/bind_expr_subquery.sql7
-rw-r--r--yt/yql/tests/sql/suites/sampling/bind_expr_udf.cfg3
-rw-r--r--yt/yql/tests/sql/suites/sampling/bind_expr_udf.sql7
-rw-r--r--yt/yql/tests/sql/suites/sampling/bind_join_left.sql11
-rw-r--r--yt/yql/tests/sql/suites/sampling/bind_join_right.sql11
-rw-r--r--yt/yql/tests/sql/suites/sampling/bind_multiple_sample.sql16
-rw-r--r--yt/yql/tests/sql/suites/sampling/bind_small_rate.sql7
-rw-r--r--yt/yql/tests/sql/suites/sampling/bind_topsort.sql7
-rw-r--r--yt/yql/tests/sql/suites/sampling/default.cfg2
-rw-r--r--yt/yql/tests/sql/suites/sampling/direct_read-dynamic.cfg2
-rw-r--r--yt/yql/tests/sql/suites/sampling/direct_read.cfg2
-rw-r--r--yt/yql/tests/sql/suites/sampling/direct_read.sql4
-rw-r--r--yt/yql/tests/sql/suites/sampling/dynamic.txt.attr33
-rw-r--r--yt/yql/tests/sql/suites/sampling/insert.cfg2
-rw-r--r--yt/yql/tests/sql/suites/sampling/insert.sql10
-rw-r--r--yt/yql/tests/sql/suites/sampling/join_left_sample.sql9
-rw-r--r--yt/yql/tests/sql/suites/sampling/join_right_sample.sql9
-rw-r--r--yt/yql/tests/sql/suites/sampling/map-dynamic.cfg2
-rw-r--r--yt/yql/tests/sql/suites/sampling/map-keyfilter.cfg2
-rw-r--r--yt/yql/tests/sql/suites/sampling/map.cfg2
-rw-r--r--yt/yql/tests/sql/suites/sampling/map.sql3
-rw-r--r--yt/yql/tests/sql/suites/sampling/mapjoin_left_sample.sql9
-rw-r--r--yt/yql/tests/sql/suites/sampling/mapjoin_right_sample.sql10
-rw-r--r--yt/yql/tests/sql/suites/sampling/orderedjoin_left_sample.sql11
-rw-r--r--yt/yql/tests/sql/suites/sampling/orderedjoin_right_sample.sql11
-rw-r--r--yt/yql/tests/sql/suites/sampling/read-dynamic.cfg2
-rw-r--r--yt/yql/tests/sql/suites/sampling/read.cfg2
-rw-r--r--yt/yql/tests/sql/suites/sampling/read.sql3
-rw-r--r--yt/yql/tests/sql/suites/sampling/reduce-with_premap.cfg3
-rw-r--r--yt/yql/tests/sql/suites/sampling/reduce.cfg3
-rw-r--r--yt/yql/tests/sql/suites/sampling/reduce.sql11
-rw-r--r--yt/yql/tests/sql/suites/sampling/reduce_with_presort.cfg4
-rw-r--r--yt/yql/tests/sql/suites/sampling/reduce_with_presort.sql11
-rw-r--r--yt/yql/tests/sql/suites/sampling/sample.sql5
-rw-r--r--yt/yql/tests/sql/suites/sampling/sort.sql3
-rw-r--r--yt/yql/tests/sql/suites/sampling/sorted.txt.attr13
-rw-r--r--yt/yql/tests/sql/suites/sampling/sorted_desc.txt.attr47
-rw-r--r--yt/yql/tests/sql/suites/sampling/subquery_default.sql5
-rw-r--r--yt/yql/tests/sql/suites/sampling/subquery_expr.sql7
-rw-r--r--yt/yql/tests/sql/suites/sampling/subquery_filter.sql5
-rw-r--r--yt/yql/tests/sql/suites/sampling/subquery_limit.sql5
-rw-r--r--yt/yql/tests/sql/suites/sampling/subquery_mapjoin.sql14
-rw-r--r--yt/yql/tests/sql/suites/sampling/subquery_multiple_sample.sql5
-rw-r--r--yt/yql/tests/sql/suites/sampling/subquery_sort.sql6
-rw-r--r--yt/yql/tests/sql/suites/sampling/system_sampling-io_block_size.cfg5
-rw-r--r--yt/yql/tests/sql/suites/sampling/system_sampling.cfg4
-rw-r--r--yt/yql/tests/sql/suites/sampling/system_sampling.sql12
-rw-r--r--yt/yql/tests/sql/suites/sampling/table_content.cfg2
-rw-r--r--yt/yql/tests/sql/suites/sampling/table_content.sql7
-rw-r--r--yt/yql/tests/sql/suites/sampling/take_with_sampling.sql3
-rw-r--r--yt/yql/tests/sql/suites/sampling/topsort.sql3
-rw-r--r--yt/yql/tests/sql/suites/sampling/yql-14664_deps.sql20
-rw-r--r--yt/yql/tests/sql/suites/sampling/zero_percentage.cfg2
-rw-r--r--yt/yql/tests/sql/suites/sampling/zero_percentage.sql2
-rw-r--r--yt/yql/tests/sql/suites/schema/append_to_desc.cfg2
-rw-r--r--yt/yql/tests/sql/suites/schema/append_to_desc.sql6
-rw-r--r--yt/yql/tests/sql/suites/schema/append_to_desc_with_remap.cfg2
-rw-r--r--yt/yql/tests/sql/suites/schema/append_to_desc_with_remap.sql7
-rw-r--r--yt/yql/tests/sql/suites/schema/concat.cfg2
-rw-r--r--yt/yql/tests/sql/suites/schema/concat.sql4
-rw-r--r--yt/yql/tests/sql/suites/schema/copy-other.cfg2
-rw-r--r--yt/yql/tests/sql/suites/schema/copy-read_schema.cfg2
-rw-r--r--yt/yql/tests/sql/suites/schema/copy-schema.cfg2
-rw-r--r--yt/yql/tests/sql/suites/schema/copy-yamred_dsv_raw.cfg2
-rw-r--r--yt/yql/tests/sql/suites/schema/copy.sql3
-rw-r--r--yt/yql/tests/sql/suites/schema/def_values.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/def_values.sql1
-rw-r--r--yt/yql/tests/sql/suites/schema/def_values.txt.attr19
-rw-r--r--yt/yql/tests/sql/suites/schema/def_values_job.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/def_values_job.sql1
-rw-r--r--yt/yql/tests/sql/suites/schema/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/descending.txt.attr21
-rw-r--r--yt/yql/tests/sql/suites/schema/diffrerent_schemas.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/diffrerent_schemas.sql5
-rw-r--r--yt/yql/tests/sql/suites/schema/empty.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/schema/empty_no_schema.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/schema/fake_column.sql11
-rw-r--r--yt/yql/tests/sql/suites/schema/inferschema.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/schema/inferschema2.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/schema/inferschema_extra_field.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/schema/inferschema_no_fields.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/schema/input_bad.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/schema/input_good.txt.attr15
-rw-r--r--yt/yql/tests/sql/suites/schema/input_no_schema.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/schema/insert-read_schema.cfg2
-rw-r--r--yt/yql/tests/sql/suites/schema/insert-row_spec.cfg2
-rw-r--r--yt/yql/tests/sql/suites/schema/insert-schema.cfg2
-rw-r--r--yt/yql/tests/sql/suites/schema/insert.sql4
-rw-r--r--yt/yql/tests/sql/suites/schema/insert_sorted-read_schema.cfg2
-rw-r--r--yt/yql/tests/sql/suites/schema/insert_sorted-row_spec.cfg2
-rw-r--r--yt/yql/tests/sql/suites/schema/insert_sorted-schema.cfg2
-rw-r--r--yt/yql/tests/sql/suites/schema/insert_sorted.sql4
-rw-r--r--yt/yql/tests/sql/suites/schema/limit_directread.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/limit_directread.sql4
-rw-r--r--yt/yql/tests/sql/suites/schema/limit_simple.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/limit_simple.sql2
-rw-r--r--yt/yql/tests/sql/suites/schema/other.cfg3
-rw-r--r--yt/yql/tests/sql/suites/schema/other.sql1
-rw-r--r--yt/yql/tests/sql/suites/schema/other1.txt.attr17
-rw-r--r--yt/yql/tests/sql/suites/schema/other2.txt.attr17
-rw-r--r--yt/yql/tests/sql/suites/schema/other_job.cfg3
-rw-r--r--yt/yql/tests/sql/suites/schema/other_job.sql1
-rw-r--r--yt/yql/tests/sql/suites/schema/patched1.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/schema/patched2.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/schema/patched3.txt.attr15
-rw-r--r--yt/yql/tests/sql/suites/schema/patched4.txt.attr15
-rw-r--r--yt/yql/tests/sql/suites/schema/patched5.txt.attr22
-rw-r--r--yt/yql/tests/sql/suites/schema/patched6.txt.attr15
-rw-r--r--yt/yql/tests/sql/suites/schema/patchtype.cfg6
-rw-r--r--yt/yql/tests/sql/suites/schema/patchtype.sql8
-rw-r--r--yt/yql/tests/sql/suites/schema/read_schema.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/schema/read_schema_change_other.cfg2
-rw-r--r--yt/yql/tests/sql/suites/schema/read_schema_change_other.sql2
-rw-r--r--yt/yql/tests/sql/suites/schema/read_schema_no_any.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/schema/read_schema_other.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/read_schema_other.sql1
-rw-r--r--yt/yql/tests/sql/suites/schema/read_schema_other.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/schema/read_schema_partial.txt.attr6
-rw-r--r--yt/yql/tests/sql/suites/schema/remap_desc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/remap_desc.sql5
-rw-r--r--yt/yql/tests/sql/suites/schema/row_spec.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/schema/row_spec_diff_sort.txt.attr18
-rw-r--r--yt/yql/tests/sql/suites/schema/row_spec_diff_sort2.txt.attr19
-rw-r--r--yt/yql/tests/sql/suites/schema/row_spec_diff_sort_desc.txt.attr25
-rw-r--r--yt/yql/tests/sql/suites/schema/row_spec_extra_sort.txt.attr18
-rw-r--r--yt/yql/tests/sql/suites/schema/row_spec_hide_sort.txt.attr12
-rw-r--r--yt/yql/tests/sql/suites/schema/row_spec_part.txt.attr12
-rw-r--r--yt/yql/tests/sql/suites/schema/row_spec_with_default_values.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/row_spec_with_default_values.sql1
-rw-r--r--yt/yql/tests/sql/suites/schema/row_spec_with_default_values.txt.attr19
-rw-r--r--yt/yql/tests/sql/suites/schema/schema.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all-read_schema.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all-row_spec.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all-row_spec_diff_sort.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all-row_spec_diff_sort2.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all-row_spec_diff_sort_desc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all-row_spec_extra_sort.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all-row_spec_hide_sort.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all-row_spec_part.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all-schema.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all-yamred_dsv.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all-yamred_dsv_raw.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all.sql1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_forceinferschema.cfg4
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_forceinferschema.sql3
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_inferschema-extra_field.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_inferschema-no_fields.cfg-disabled1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_inferschema.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_inferschema.sql1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_inferschema2.cfg2
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_inferschema2.sql2
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_inferschema_limit.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_inferschema_limit.sql1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_inferschema_op.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_inferschema_op.sql5
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_inferschema_op_custom_tmp.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_inferschema_op_custom_tmp.sql6
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_inferschema_range.cfg3
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_inferschema_range.sql2
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_inferschema_range_empty_fail.cfg4
-rw-r--r--yt/yql/tests/sql/suites/schema/select_all_inferschema_range_empty_fail.sql3
-rw-r--r--yt/yql/tests/sql/suites/schema/select_field-read_schema.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_field-row_spec.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_field-schema.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_field.sql1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_fields_inferschema.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_fields_inferschema.sql1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_operate_with_columns_simple.sql1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_reordered.sql1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_simple.sql1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_with_map-partial_read_schema.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_with_map-sorted_desc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_with_map.sql1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_yamr_fields.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/select_yamr_fields.sql1
-rw-r--r--yt/yql/tests/sql/suites/schema/skip_complex_type.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/skip_complex_type.sql5
-rw-r--r--yt/yql/tests/sql/suites/schema/skip_complex_type.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/schema/skip_complex_type2.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/skip_complex_type2.sql5
-rw-r--r--yt/yql/tests/sql/suites/schema/skip_complex_type2.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/schema/sorted.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/schema/sorted_desc.txt.attr46
-rw-r--r--yt/yql/tests/sql/suites/schema/unsorted.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_append.cfg3
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_append.sql6
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_bind.sql8
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_directread.sql8
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_empty_table_ranges.sql16
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_existing_column.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_existing_column.sql4
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_missing_column.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_missing_column.sql4
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_mix1.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_mix1.sql6
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_mix2.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_mix2.sql6
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_mix3.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_mix3.sql6
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_no_infer.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_no_infer.sql5
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_override.cfg2
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_override.sql5
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_patch_columns.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_patch_columns.sql5
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_with_sort.cfg2
-rw-r--r--yt/yql/tests/sql/suites/schema/user_schema_with_sort.sql6
-rw-r--r--yt/yql/tests/sql/suites/schema/yamred_dsv.txt.attr4
-rw-r--r--yt/yql/tests/sql/suites/schema/yamred_dsv_raw.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/schema/yamred_dsv_select_from_dict.cfg1
-rw-r--r--yt/yql/tests/sql/suites/schema/yamred_dsv_select_from_dict.sql2
-rw-r--r--yt/yql/tests/sql/suites/select/anon_clash.cfg1
-rw-r--r--yt/yql/tests/sql/suites/select/anon_clash.sql9
-rw-r--r--yt/yql/tests/sql/suites/select/append_to_value.cfg1
-rw-r--r--yt/yql/tests/sql/suites/select/append_to_value.sql2
-rw-r--r--yt/yql/tests/sql/suites/select/append_to_value_1000.cfg2
-rw-r--r--yt/yql/tests/sql/suites/select/append_to_value_1000.sql3
-rw-r--r--yt/yql/tests/sql/suites/select/autoextract_source_value.sql7
-rw-r--r--yt/yql/tests/sql/suites/select/backtick_with_escapes.sql3
-rw-r--r--yt/yql/tests/sql/suites/select/bit_ops.sql11
-rw-r--r--yt/yql/tests/sql/suites/select/boolean_where.cfg1
-rw-r--r--yt/yql/tests/sql/suites/select/boolean_where.sql2
-rw-r--r--yt/yql/tests/sql/suites/select/boolean_where.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/select/braces.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/calculated_values.sql3
-rw-r--r--yt/yql/tests/sql/suites/select/cast_double_to_uint32.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/column_labels.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/complex_filter_with_order.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/complex_view_input.txt.attr32
-rw-r--r--yt/yql/tests/sql/suites/select/const_subrequest_and_select_by_all.sql9
-rw-r--r--yt/yql/tests/sql/suites/select/corr_name_in_select.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/corr_name_in_select_seq.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/create_structures.sql2
-rw-r--r--yt/yql/tests/sql/suites/select/create_tuples.sql2
-rw-r--r--yt/yql/tests/sql/suites/select/deep_udf_call.cfg5
-rw-r--r--yt/yql/tests/sql/suites/select/deep_udf_call.sql11
-rw-r--r--yt/yql/tests/sql/suites/select/default.cfg4
-rw-r--r--yt/yql/tests/sql/suites/select/dict_lookup.sql10
-rw-r--r--yt/yql/tests/sql/suites/select/dict_lookup_by_key.sql14
-rw-r--r--yt/yql/tests/sql/suites/select/dict_lookup_by_key_with_def.sql14
-rw-r--r--yt/yql/tests/sql/suites/select/dict_lookup_column_names.sql5
-rw-r--r--yt/yql/tests/sql/suites/select/dict_with_few_keys.sql15
-rw-r--r--yt/yql/tests/sql/suites/select/discard.sql9
-rw-r--r--yt/yql/tests/sql/suites/select/dot_in_alias.sql6
-rw-r--r--yt/yql/tests/sql/suites/select/dot_name_subrequest.sql8
-rw-r--r--yt/yql/tests/sql/suites/select/exists_false.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/exists_true.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/from_in_front.sql2
-rw-r--r--yt/yql/tests/sql/suites/select/from_in_front_sub.sql9
-rw-r--r--yt/yql/tests/sql/suites/select/hits_count.cfg3
-rw-r--r--yt/yql/tests/sql/suites/select/hits_count.sql33
-rw-r--r--yt/yql/tests/sql/suites/select/host_count.cfg3
-rw-r--r--yt/yql/tests/sql/suites/select/host_count.sql33
-rw-r--r--yt/yql/tests/sql/suites/select/host_input1.txt.attr16
-rw-r--r--yt/yql/tests/sql/suites/select/host_input2.txt.attr16
-rw-r--r--yt/yql/tests/sql/suites/select/if.sql6
-rw-r--r--yt/yql/tests/sql/suites/select/input_struct_field.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/select/literal_bool.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/literal_negative.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/logical_ops.sql6
-rw-r--r--yt/yql/tests/sql/suites/select/match_clause.cfg5
-rw-r--r--yt/yql/tests/sql/suites/select/match_clause.sql4
-rw-r--r--yt/yql/tests/sql/suites/select/missing_with_nonpersist.cfg2
-rw-r--r--yt/yql/tests/sql/suites/select/missing_with_nonpersist.sql10
-rw-r--r--yt/yql/tests/sql/suites/select/multi_source_issue.sql17
-rw-r--r--yt/yql/tests/sql/suites/select/one_labeled_column.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/one_unlabeled_column.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/opt_list_access.sql7
-rw-r--r--yt/yql/tests/sql/suites/select/optional_as_warn.sql18
-rw-r--r--yt/yql/tests/sql/suites/select/optional_in_job.cfg1
-rw-r--r--yt/yql/tests/sql/suites/select/optional_in_job.sql34
-rw-r--r--yt/yql/tests/sql/suites/select/optional_pull.cfg1
-rw-r--r--yt/yql/tests/sql/suites/select/optional_pull.sql32
-rw-r--r--yt/yql/tests/sql/suites/select/qualified_all_and_group_by.sql16
-rw-r--r--yt/yql/tests/sql/suites/select/quoted_ids.sql2
-rw-r--r--yt/yql/tests/sql/suites/select/quoted_ids_with_escapes.sql2
-rw-r--r--yt/yql/tests/sql/suites/select/read_schema.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/select/refselect-1000.cfg2
-rw-r--r--yt/yql/tests/sql/suites/select/refselect.cfg2
-rw-r--r--yt/yql/tests/sql/suites/select/refselect.sql4
-rw-r--r--yt/yql/tests/sql/suites/select/result_rows_limit.cfg2
-rw-r--r--yt/yql/tests/sql/suites/select/result_rows_limit.sql7
-rw-r--r--yt/yql/tests/sql/suites/select/result_size_limit.cfg2
-rw-r--r--yt/yql/tests/sql/suites/select/result_size_limit.sql7
-rw-r--r--yt/yql/tests/sql/suites/select/result_size_limit_with_fill.cfg2
-rw-r--r--yt/yql/tests/sql/suites/select/result_size_limit_with_fill.sql9
-rw-r--r--yt/yql/tests/sql/suites/select/reuse_named_node.sql5
-rw-r--r--yt/yql/tests/sql/suites/select/sampleselect-1000.cfg1
-rw-r--r--yt/yql/tests/sql/suites/select/sampleselect.cfg1
-rw-r--r--yt/yql/tests/sql/suites/select/sampleselect.sql3
-rw-r--r--yt/yql/tests/sql/suites/select/scalar_subquery.sql6
-rw-r--r--yt/yql/tests/sql/suites/select/scalar_subquery_with_star.sql7
-rw-r--r--yt/yql/tests/sql/suites/select/select_all.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/select_all_filtered.sql2
-rw-r--r--yt/yql/tests/sql/suites/select/select_all_from_concat.sql2
-rw-r--r--yt/yql/tests/sql/suites/select/select_all_from_concat_anon.sql10
-rw-r--r--yt/yql/tests/sql/suites/select/select_all_group_by_column.cfg1
-rw-r--r--yt/yql/tests/sql/suites/select/select_all_group_by_column.sql2
-rw-r--r--yt/yql/tests/sql/suites/select/select_all_ordered.sql3
-rw-r--r--yt/yql/tests/sql/suites/select/select_concrete_detailed_columns.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/shift_columns.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/simple_struct_field_access.cfg1
-rw-r--r--yt/yql/tests/sql/suites/select/simple_struct_field_access.sql3
-rw-r--r--yt/yql/tests/sql/suites/select/struct_access_without_table_name.cfg1
-rw-r--r--yt/yql/tests/sql/suites/select/struct_access_without_table_name.sql18
-rw-r--r--yt/yql/tests/sql/suites/select/struct_members.sql4
-rw-r--r--yt/yql/tests/sql/suites/select/substring.sql6
-rw-r--r--yt/yql/tests/sql/suites/select/substring_v1.sql7
-rw-r--r--yt/yql/tests/sql/suites/select/sum_to_string.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/swap_columns.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/table_content_from_double_opt.sql11
-rw-r--r--yt/yql/tests/sql/suites/select/table_content_from_sort_desc.sql11
-rw-r--r--yt/yql/tests/sql/suites/select/table_content_with_tmp_folder.cfg1
-rw-r--r--yt/yql/tests/sql/suites/select/table_content_with_tmp_folder.sql11
-rw-r--r--yt/yql/tests/sql/suites/select/table_funcs_spec.sql15
-rw-r--r--yt/yql/tests/sql/suites/select/tablename_with_table_row.sql11
-rw-r--r--yt/yql/tests/sql/suites/select/tablepathprefix.sql9
-rw-r--r--yt/yql/tests/sql/suites/select/to_dict.sql17
-rw-r--r--yt/yql/tests/sql/suites/select/trivial_between.sql3
-rw-r--r--yt/yql/tests/sql/suites/select/trivial_group_by.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/trivial_having.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/trivial_order_by.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/trivial_where-many.cfg1
-rw-r--r--yt/yql/tests/sql/suites/select/trivial_where-one.cfg1
-rw-r--r--yt/yql/tests/sql/suites/select/trivial_where.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/two_selects_with_diff_fields.sql3
-rw-r--r--yt/yql/tests/sql/suites/select/type_assert.sql11
-rw-r--r--yt/yql/tests/sql/suites/select/uncorrelated_subqueries.cfg3
-rw-r--r--yt/yql/tests/sql/suites/select/uncorrelated_subqueries.sql7
-rw-r--r--yt/yql/tests/sql/suites/select/unlabeled.cfg1
-rw-r--r--yt/yql/tests/sql/suites/select/unlabeled.sql2
-rw-r--r--yt/yql/tests/sql/suites/select/unlabeled_1000.cfg1
-rw-r--r--yt/yql/tests/sql/suites/select/unlabeled_1000.sql3
-rw-r--r--yt/yql/tests/sql/suites/select/use_cluster.sql2
-rw-r--r--yt/yql/tests/sql/suites/select/where_cast.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/where_in.sql7
-rw-r--r--yt/yql/tests/sql/suites/select/where_not_null.cfg1
-rw-r--r--yt/yql/tests/sql/suites/select/where_not_null.sql1
-rw-r--r--yt/yql/tests/sql/suites/select/where_with_lambda.cfg1
-rw-r--r--yt/yql/tests/sql/suites/select/where_with_lambda.sql11
-rw-r--r--yt/yql/tests/sql/suites/seq_mode/action_shared_subquery_expr_after_commit.sql12
-rw-r--r--yt/yql/tests/sql/suites/seq_mode/default.cfg0
-rw-r--r--yt/yql/tests/sql/suites/seq_mode/shared_subquery_expr_after_commit.sql9
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/no_simple_columns_tablerow.sql17
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_base.sql4
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_base_fail.cfg2
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_base_fail.sql13
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_all.sql12
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_all_1.sql14
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_all_2.sql14
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_bug8923.sql16
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_qualified_all_disable.sql14
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_qualified_all_enable.sql14
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_without_1.sql18
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_without_2.sql18
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_without_left_semi_1.sql8
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_without_left_semi_2.sql8
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_fail.cfg2
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_fail.sql13
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_qualified.sql13
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_subreq_all_key_without.sql14
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_subreq_same_key.sql13
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_subreq_same_key_by_all.sql12
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_subreq_same_key_without.sql15
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_without_resolve_dublicates.sql16
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_join_without_resolve_dublicates_mult.sql17
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_qualified_all_and_group_by.sql14
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_subreq.sql9
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_subreq_all.sql9
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_tablerow.sql17
-rw-r--r--yt/yql/tests/sql/suites/simple_columns/simple_columns_union_all_qualified_star.sql18
-rw-r--r--yt/yql/tests/sql/suites/stream_lookup_join/default.cfg4
-rw-r--r--yt/yql/tests/sql/suites/stream_lookup_join/event.txt.attr10
-rw-r--r--yt/yql/tests/sql/suites/stream_lookup_join/host.txt.attr8
-rw-r--r--yt/yql/tests/sql/suites/stream_lookup_join/input.txt.attr13
-rw-r--r--yt/yql/tests/sql/suites/stream_lookup_join/lookup_join.sql9
-rw-r--r--yt/yql/tests/sql/suites/stream_lookup_join/lookup_join_narrow.sql9
-rw-r--r--yt/yql/tests/sql/suites/table_range/concat_empty_sorted_with_key_diff.cfg2
-rw-r--r--yt/yql/tests/sql/suites/table_range/concat_empty_sorted_with_key_diff.sql3
-rw-r--r--yt/yql/tests/sql/suites/table_range/concat_sorted_max_sorted_tables.cfg4
-rw-r--r--yt/yql/tests/sql/suites/table_range/concat_sorted_max_sorted_tables.sql14
-rw-r--r--yt/yql/tests/sql/suites/table_range/concat_sorted_max_tables.cfg2
-rw-r--r--yt/yql/tests/sql/suites/table_range/concat_sorted_max_tables.sql13
-rw-r--r--yt/yql/tests/sql/suites/table_range/concat_sorted_with_key_diff.cfg2
-rw-r--r--yt/yql/tests/sql/suites/table_range/concat_sorted_with_key_diff.sql3
-rw-r--r--yt/yql/tests/sql/suites/table_range/concat_with_view.cfg4
-rw-r--r--yt/yql/tests/sql/suites/table_range/concat_with_view.sql3
-rw-r--r--yt/yql/tests/sql/suites/table_range/doc_view.txt.attr4
-rw-r--r--yt/yql/tests/sql/suites/table_range/each_with_non_existing.cfg3
-rw-r--r--yt/yql/tests/sql/suites/table_range/each_with_non_existing.sql4
-rw-r--r--yt/yql/tests/sql/suites/table_range/each_with_non_existing_all_fail.cfg4
-rw-r--r--yt/yql/tests/sql/suites/table_range/each_with_non_existing_all_fail.sql5
-rw-r--r--yt/yql/tests/sql/suites/table_range/empty_int64.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/table_range/empty_uint32.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/table_range/limit_with_table_path_over_sorted_range.cfg2
-rw-r--r--yt/yql/tests/sql/suites/table_range/limit_with_table_path_over_sorted_range.sql7
-rw-r--r--yt/yql/tests/sql/suites/table_range/merge_non_strict.cfg2
-rw-r--r--yt/yql/tests/sql/suites/table_range/merge_non_strict.sql6
-rw-r--r--yt/yql/tests/sql/suites/table_range/range_over_desc.cfg2
-rw-r--r--yt/yql/tests/sql/suites/table_range/range_over_desc.sql7
-rw-r--r--yt/yql/tests/sql/suites/table_range/range_over_filter.cfg3
-rw-r--r--yt/yql/tests/sql/suites/table_range/range_over_filter.sql12
-rw-r--r--yt/yql/tests/sql/suites/table_range/range_over_filter_udf.cfg3
-rw-r--r--yt/yql/tests/sql/suites/table_range/range_over_filter_udf.sql16
-rw-r--r--yt/yql/tests/sql/suites/table_range/range_over_like.cfg2
-rw-r--r--yt/yql/tests/sql/suites/table_range/range_over_like.sql4
-rw-r--r--yt/yql/tests/sql/suites/table_range/range_over_regexp.cfg2
-rw-r--r--yt/yql/tests/sql/suites/table_range/range_over_regexp.sql5
-rw-r--r--yt/yql/tests/sql/suites/table_range/range_slash.cfg3
-rw-r--r--yt/yql/tests/sql/suites/table_range/range_slash.sql9
-rw-r--r--yt/yql/tests/sql/suites/table_range/range_tables_with_view.cfg1
-rw-r--r--yt/yql/tests/sql/suites/table_range/range_tables_with_view.sql3
-rw-r--r--yt/yql/tests/sql/suites/table_range/range_with_view.cfg4
-rw-r--r--yt/yql/tests/sql/suites/table_range/range_with_view.sql3
-rw-r--r--yt/yql/tests/sql/suites/table_range/sorted1.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/table_range/sorted2.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/table_range/sorted_desc.txt.attr47
-rw-r--r--yt/yql/tests/sql/suites/table_range/sorted_non_strict.txt.attr15
-rw-r--r--yt/yql/tests/sql/suites/table_range/table_funcs_expr.cfg5
-rw-r--r--yt/yql/tests/sql/suites/table_range/table_funcs_expr.sql16
-rw-r--r--yt/yql/tests/sql/suites/table_range/tablepath_with_non_existing.cfg3
-rw-r--r--yt/yql/tests/sql/suites/table_range/tablepath_with_non_existing.sql6
-rw-r--r--yt/yql/tests/sql/suites/table_range/view_input.txt.attr32
-rw-r--r--yt/yql/tests/sql/suites/tpch/customer.txt.attr56
-rw-r--r--yt/yql/tests/sql/suites/tpch/default.cfg8
-rw-r--r--yt/yql/tests/sql/suites/tpch/lineitem.txt.attr114
-rw-r--r--yt/yql/tests/sql/suites/tpch/nation.txt.attr32
-rw-r--r--yt/yql/tests/sql/suites/tpch/orders.txt.attr65
-rw-r--r--yt/yql/tests/sql/suites/tpch/part.txt.attr62
-rw-r--r--yt/yql/tests/sql/suites/tpch/partsupp.txt.attr39
-rw-r--r--yt/yql/tests/sql/suites/tpch/q1.sql26
-rw-r--r--yt/yql/tests/sql/suites/tpch/q10.sql87
-rw-r--r--yt/yql/tests/sql/suites/tpch/q11.sql62
-rw-r--r--yt/yql/tests/sql/suites/tpch/q12.sql45
-rw-r--r--yt/yql/tests/sql/suites/tpch/q13.sql33
-rw-r--r--yt/yql/tests/sql/suites/tpch/q14.sql21
-rw-r--r--yt/yql/tests/sql/suites/tpch/q15.sql56
-rw-r--r--yt/yql/tests/sql/suites/tpch/q16.sql44
-rw-r--r--yt/yql/tests/sql/suites/tpch/q17.sql41
-rw-r--r--yt/yql/tests/sql/suites/tpch/q18.sql53
-rw-r--r--yt/yql/tests/sql/suites/tpch/q19.sql40
-rw-r--r--yt/yql/tests/sql/suites/tpch/q2.sql68
-rw-r--r--yt/yql/tests/sql/suites/tpch/q20.sql83
-rw-r--r--yt/yql/tests/sql/suites/tpch/q21.sql51
-rw-r--r--yt/yql/tests/sql/suites/tpch/q22.sql58
-rw-r--r--yt/yql/tests/sql/suites/tpch/q3.sql55
-rw-r--r--yt/yql/tests/sql/suites/tpch/q4.sql29
-rw-r--r--yt/yql/tests/sql/suites/tpch/q5.sql102
-rw-r--r--yt/yql/tests/sql/suites/tpch/q6.sql16
-rw-r--r--yt/yql/tests/sql/suites/tpch/q7.sql87
-rw-r--r--yt/yql/tests/sql/suites/tpch/q8.sql110
-rw-r--r--yt/yql/tests/sql/suites/tpch/q9.sql59
-rw-r--r--yt/yql/tests/sql/suites/tpch/region.txt.attr26
-rw-r--r--yt/yql/tests/sql/suites/tpch/supplier.txt.attr50
-rw-r--r--yt/yql/tests/sql/suites/type_literal/create_table.sql80
-rw-r--r--yt/yql/tests/sql/suites/type_literal/declare.sql82
-rw-r--r--yt/yql/tests/sql/suites/type_literal/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/type_v3/append_diff_flags.cfg2
-rw-r--r--yt/yql/tests/sql/suites/type_v3/append_diff_flags.sql12
-rw-r--r--yt/yql/tests/sql/suites/type_v3/append_diff_layout1.cfg4
-rw-r--r--yt/yql/tests/sql/suites/type_v3/append_diff_layout1.sql41
-rw-r--r--yt/yql/tests/sql/suites/type_v3/append_diff_layout2.cfg6
-rw-r--r--yt/yql/tests/sql/suites/type_v3/append_diff_layout2.sql44
-rw-r--r--yt/yql/tests/sql/suites/type_v3/append_struct.sql21
-rw-r--r--yt/yql/tests/sql/suites/type_v3/decimal.txt.attr37
-rw-r--r--yt/yql/tests/sql/suites/type_v3/decimal_yt.cfg2
-rw-r--r--yt/yql/tests/sql/suites/type_v3/decimal_yt.sql8
-rw-r--r--yt/yql/tests/sql/suites/type_v3/decimal_yt_llvm.cfg1
-rw-r--r--yt/yql/tests/sql/suites/type_v3/decimal_yt_llvm.sql24
-rw-r--r--yt/yql/tests/sql/suites/type_v3/decimal_yt_nollvm.cfg1
-rw-r--r--yt/yql/tests/sql/suites/type_v3/decimal_yt_nollvm.sql24
-rw-r--r--yt/yql/tests/sql/suites/type_v3/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/type_v3/float.cfg1
-rw-r--r--yt/yql/tests/sql/suites/type_v3/float.sql16
-rw-r--r--yt/yql/tests/sql/suites/type_v3/float.txt.attr17
-rw-r--r--yt/yql/tests/sql/suites/type_v3/ignore_v3_hint-opt.cfg3
-rw-r--r--yt/yql/tests/sql/suites/type_v3/ignore_v3_hint-protofield.cfg3
-rw-r--r--yt/yql/tests/sql/suites/type_v3/ignore_v3_hint-tag_opt.cfg3
-rw-r--r--yt/yql/tests/sql/suites/type_v3/ignore_v3_hint.cfg2
-rw-r--r--yt/yql/tests/sql/suites/type_v3/ignore_v3_hint.sql8
-rw-r--r--yt/yql/tests/sql/suites/type_v3/ignore_v3_pragma.cfg2
-rw-r--r--yt/yql/tests/sql/suites/type_v3/ignore_v3_pragma.sql10
-rw-r--r--yt/yql/tests/sql/suites/type_v3/insert_struct_v3_with_native.cfg3
-rw-r--r--yt/yql/tests/sql/suites/type_v3/insert_struct_v3_with_native.sql25
-rw-r--r--yt/yql/tests/sql/suites/type_v3/insert_struct_v3_wo_native.cfg3
-rw-r--r--yt/yql/tests/sql/suites/type_v3/insert_struct_v3_wo_native.sql25
-rw-r--r--yt/yql/tests/sql/suites/type_v3/json.cfg1
-rw-r--r--yt/yql/tests/sql/suites/type_v3/json.sql16
-rw-r--r--yt/yql/tests/sql/suites/type_v3/mergejoin_with_sort.cfg2
-rw-r--r--yt/yql/tests/sql/suites/type_v3/mergejoin_with_sort.sql11
-rw-r--r--yt/yql/tests/sql/suites/type_v3/mixed.txt.attr40
-rw-r--r--yt/yql/tests/sql/suites/type_v3/mixed_with_columns.cfg1
-rw-r--r--yt/yql/tests/sql/suites/type_v3/mixed_with_columns.sql5
-rw-r--r--yt/yql/tests/sql/suites/type_v3/native.txt.attr36
-rw-r--r--yt/yql/tests/sql/suites/type_v3/native1.txt.attr36
-rw-r--r--yt/yql/tests/sql/suites/type_v3/native_opt.txt.attr39
-rw-r--r--yt/yql/tests/sql/suites/type_v3/native_proto.txt.attr37
-rw-r--r--yt/yql/tests/sql/suites/type_v3/native_sorted.txt.attr37
-rw-r--r--yt/yql/tests/sql/suites/type_v3/native_sorted1.txt.attr37
-rw-r--r--yt/yql/tests/sql/suites/type_v3/native_tag_opt.txt.attr43
-rw-r--r--yt/yql/tests/sql/suites/type_v3/non_strict.cfg2
-rw-r--r--yt/yql/tests/sql/suites/type_v3/non_strict.sql12
-rw-r--r--yt/yql/tests/sql/suites/type_v3/other.txt.attr17
-rw-r--r--yt/yql/tests/sql/suites/type_v3/replace_diff_layout.cfg4
-rw-r--r--yt/yql/tests/sql/suites/type_v3/replace_diff_layout.sql40
-rw-r--r--yt/yql/tests/sql/suites/type_v3/singulars.cfg1
-rw-r--r--yt/yql/tests/sql/suites/type_v3/singulars.sql12
-rw-r--r--yt/yql/tests/sql/suites/type_v3/split.cfg5
-rw-r--r--yt/yql/tests/sql/suites/type_v3/split.sql6
-rw-r--r--yt/yql/tests/sql/suites/type_v3/type_subset.cfg6
-rw-r--r--yt/yql/tests/sql/suites/type_v3/type_subset.sql15
-rw-r--r--yt/yql/tests/sql/suites/type_v3/uuid.cfg1
-rw-r--r--yt/yql/tests/sql/suites/type_v3/uuid.sql23
-rw-r--r--yt/yql/tests/sql/suites/type_v3/with_datetime.txt.attr29
-rw-r--r--yt/yql/tests/sql/suites/udf/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/udf/named_args_for_script.cfg3
-rw-r--r--yt/yql/tests/sql/suites/udf/named_args_for_script.sql18
-rw-r--r--yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs.cfg2
-rw-r--r--yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs.sql18
-rw-r--r--yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs2.cfg2
-rw-r--r--yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs2.sql18
-rw-r--r--yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs_reuse_args_fail.cfg3
-rw-r--r--yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs_reuse_args_fail.sql17
-rw-r--r--yt/yql/tests/sql/suites/udf/python_script.cfg2
-rw-r--r--yt/yql/tests/sql/suites/udf/python_script.py2
-rw-r--r--yt/yql/tests/sql/suites/udf/python_script.sql11
-rw-r--r--yt/yql/tests/sql/suites/udf/python_script_from_file.cfg4
-rw-r--r--yt/yql/tests/sql/suites/udf/python_script_from_file.sql7
-rw-r--r--yt/yql/tests/sql/suites/udf/python_struct.cfg3
-rw-r--r--yt/yql/tests/sql/suites/udf/python_struct.sql23
-rw-r--r--yt/yql/tests/sql/suites/udf/regexp_udf.cfg2
-rw-r--r--yt/yql/tests/sql/suites/udf/regexp_udf.sql3
-rw-r--r--yt/yql/tests/sql/suites/udf/two_regexps.cfg2
-rw-r--r--yt/yql/tests/sql/suites/udf/two_regexps.sql5
-rw-r--r--yt/yql/tests/sql/suites/udf/udaf.cfg2
-rw-r--r--yt/yql/tests/sql/suites/udf/udaf.sql49
-rw-r--r--yt/yql/tests/sql/suites/udf/udaf_distinct.cfg2
-rw-r--r--yt/yql/tests/sql/suites/udf/udaf_distinct.sql53
-rw-r--r--yt/yql/tests/sql/suites/udf/udaf_lambda.sql18
-rw-r--r--yt/yql/tests/sql/suites/udf/udaf_short.cfg2
-rw-r--r--yt/yql/tests/sql/suites/udf/udaf_short.sql27
-rw-r--r--yt/yql/tests/sql/suites/udf/udf.cfg2
-rw-r--r--yt/yql/tests/sql/suites/udf/udf.sql2
-rw-r--r--yt/yql/tests/sql/suites/udf/udf_call_with_group_and_limit.cfg2
-rw-r--r--yt/yql/tests/sql/suites/udf/udf_call_with_group_and_limit.sql6
-rw-r--r--yt/yql/tests/sql/suites/union/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/union/union_multiin.cfg2
-rw-r--r--yt/yql/tests/sql/suites/union/union_multiin.sql4
-rw-r--r--yt/yql/tests/sql/suites/union/union_trivial.sql4
-rw-r--r--yt/yql/tests/sql/suites/union_all/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/union_all/infer_3.sql8
-rw-r--r--yt/yql/tests/sql/suites/union_all/inner_union_all_with_limits.sql21
-rw-r--r--yt/yql/tests/sql/suites/union_all/input_infer.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/union_all/mix_map_and_project-trivial_map.cfg2
-rw-r--r--yt/yql/tests/sql/suites/union_all/mix_map_and_project.cfg2
-rw-r--r--yt/yql/tests/sql/suites/union_all/mix_map_and_project.sql13
-rw-r--r--yt/yql/tests/sql/suites/union_all/mix_map_and_read.sql9
-rw-r--r--yt/yql/tests/sql/suites/union_all/path_and_record.sql11
-rw-r--r--yt/yql/tests/sql/suites/union_all/union_all_fields.sql7
-rw-r--r--yt/yql/tests/sql/suites/union_all/union_all_multiin.cfg2
-rw-r--r--yt/yql/tests/sql/suites/union_all/union_all_multiin.sql9
-rw-r--r--yt/yql/tests/sql/suites/union_all/union_all_multiple.sql9
-rw-r--r--yt/yql/tests/sql/suites/union_all/union_all_subexpr.sql7
-rw-r--r--yt/yql/tests/sql/suites/union_all/union_all_trivial.sql3
-rw-r--r--yt/yql/tests/sql/suites/union_all/union_all_with_discard_into_result_ansi.sql14
-rw-r--r--yt/yql/tests/sql/suites/union_all/union_all_with_limits.sql3
-rw-r--r--yt/yql/tests/sql/suites/union_all/union_all_with_parenthesis.sql4
-rw-r--r--yt/yql/tests/sql/suites/union_all/union_all_with_top_level_limits_ansi.sql28
-rw-r--r--yt/yql/tests/sql/suites/view/all_from_view.cfg1
-rw-r--r--yt/yql/tests/sql/suites/view/all_from_view.sql3
-rw-r--r--yt/yql/tests/sql/suites/view/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/view/file_eval.cfg2
-rw-r--r--yt/yql/tests/sql/suites/view/file_eval.sql6
-rw-r--r--yt/yql/tests/sql/suites/view/file_inner.cfg2
-rw-r--r--yt/yql/tests/sql/suites/view/file_inner.sql5
-rw-r--r--yt/yql/tests/sql/suites/view/file_inner_library.cfg2
-rw-r--r--yt/yql/tests/sql/suites/view/file_inner_library.sql5
-rw-r--r--yt/yql/tests/sql/suites/view/file_inner_udf.cfg4
-rw-r--r--yt/yql/tests/sql/suites/view/file_inner_udf.sql8
-rw-r--r--yt/yql/tests/sql/suites/view/file_outer.cfg3
-rw-r--r--yt/yql/tests/sql/suites/view/file_outer.sql4
-rw-r--r--yt/yql/tests/sql/suites/view/file_outer_library.cfg4
-rw-r--r--yt/yql/tests/sql/suites/view/file_outer_library.sql7
-rw-r--r--yt/yql/tests/sql/suites/view/init_view_after_eval.sql10
-rw-r--r--yt/yql/tests/sql/suites/view/input_lambda.txt.attr32
-rw-r--r--yt/yql/tests/sql/suites/view/input_library.txt.attr32
-rw-r--r--yt/yql/tests/sql/suites/view/secure.cfg2
-rw-r--r--yt/yql/tests/sql/suites/view/secure.sql4
-rw-r--r--yt/yql/tests/sql/suites/view/secure_eval.cfg2
-rw-r--r--yt/yql/tests/sql/suites/view/secure_eval.sql4
-rw-r--r--yt/yql/tests/sql/suites/view/secure_eval_dyn.cfg2
-rw-r--r--yt/yql/tests/sql/suites/view/secure_eval_dyn.sql4
-rw-r--r--yt/yql/tests/sql/suites/view/standalone_view_lambda.cfg3
-rw-r--r--yt/yql/tests/sql/suites/view/standalone_view_lambda.sql8
-rw-r--r--yt/yql/tests/sql/suites/view/standalone_view_lambda.txt.attr4
-rw-r--r--yt/yql/tests/sql/suites/view/system_udf.cfg2
-rw-r--r--yt/yql/tests/sql/suites/view/system_udf.sql5
-rw-r--r--yt/yql/tests/sql/suites/view/trivial_view.cfg1
-rw-r--r--yt/yql/tests/sql/suites/view/trivial_view.sql4
-rw-r--r--yt/yql/tests/sql/suites/view/trivial_view_concat.cfg1
-rw-r--r--yt/yql/tests/sql/suites/view/trivial_view_concat.sql4
-rw-r--r--yt/yql/tests/sql/suites/view/view_file.txt.attr33
-rw-r--r--yt/yql/tests/sql/suites/view/view_file_inner_library.txt.attr31
-rw-r--r--yt/yql/tests/sql/suites/view/view_file_inner_udf.txt.attr32
-rw-r--r--yt/yql/tests/sql/suites/view/view_file_outer_library.txt.attr31
-rw-r--r--yt/yql/tests/sql/suites/view/view_input.txt.attr32
-rw-r--r--yt/yql/tests/sql/suites/view/view_secure.txt.attr33
-rw-r--r--yt/yql/tests/sql/suites/view/view_system_udf.txt.attr31
-rw-r--r--yt/yql/tests/sql/suites/view/view_with_lambda.cfg2
-rw-r--r--yt/yql/tests/sql/suites/view/view_with_lambda.sql2
-rw-r--r--yt/yql/tests/sql/suites/view/view_with_lambda_process.cfg2
-rw-r--r--yt/yql/tests/sql/suites/view/view_with_lambda_process.sql2
-rw-r--r--yt/yql/tests/sql/suites/view/view_with_library.cfg3
-rw-r--r--yt/yql/tests/sql/suites/view/view_with_library.sql2
-rw-r--r--yt/yql/tests/sql/suites/weak_field/default.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/few_source_different_columns.cfg2
-rw-r--r--yt/yql/tests/sql/suites/weak_field/few_source_different_columns.sql12
-rw-r--r--yt/yql/tests/sql/suites/weak_field/hor_join_with_mix_weak_access.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/hor_join_with_mix_weak_access.sql7
-rw-r--r--yt/yql/tests/sql/suites/weak_field/infer_scheme.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/weak_field/input_other_yson.txt.attr17
-rw-r--r--yt/yql/tests/sql/suites/weak_field/input_other_yson_esc.txt.attr17
-rw-r--r--yt/yql/tests/sql/suites/weak_field/input_rest.txt.attr11
-rw-r--r--yt/yql/tests/sql/suites/weak_field/input_tutorial_email_short_as_other.txt.attr12
-rw-r--r--yt/yql/tests/sql/suites/weak_field/optimize_weak_fields.txt.attr3
-rw-r--r--yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_combine.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_combine.sql4
-rw-r--r--yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_filter_combine.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_filter_combine.sql4
-rw-r--r--yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_map.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_map.sql4
-rw-r--r--yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_map_combine.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_map_combine.sql4
-rw-r--r--yt/yql/tests/sql/suites/weak_field/optional.txt.attr85
-rw-r--r--yt/yql/tests/sql/suites/weak_field/other1.txt.attr17
-rw-r--r--yt/yql/tests/sql/suites/weak_field/other2.txt.attr17
-rw-r--r--yt/yql/tests/sql/suites/weak_field/other3.txt.attr17
-rw-r--r--yt/yql/tests/sql/suites/weak_field/other4.txt.attr17
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field.cfg2
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field.sql9
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_aggregation.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_aggregation.sql10
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_data.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_data.sql3
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_esc_string.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_esc_string.sql7
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_esc_yson.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_esc_yson.sql10
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_in_group_by.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_in_group_by.sql9
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_infer_scheme.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_infer_scheme.sql6
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_join.cfg2
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_join.sql10
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_join_condition.cfg2
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_join_condition.sql11
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_join_where.cfg2
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_join_where.sql13
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_long_fields.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_long_fields.sql8
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_long_name.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_long_name.sql7
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_num_access.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_num_access.sql10
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_opt.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_opt.sql3
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_real_col.sql11
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_rest.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_rest.sql14
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_strict.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_strict.sql10
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_to_yson.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_to_yson.sql5
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_type.sql7
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_wrong_types_fail.cfg2
-rw-r--r--yt/yql/tests/sql/suites/weak_field/weak_field_wrong_types_fail.sql5
-rw-r--r--yt/yql/tests/sql/suites/weak_field/yql-7888_input.txt.attr22
-rw-r--r--yt/yql/tests/sql/suites/weak_field/yql-7888_mapfieldsubset.cfg1
-rw-r--r--yt/yql/tests/sql/suites/weak_field/yql-7888_mapfieldsubset.sql27
-rw-r--r--yt/yql/tests/sql/suites/window/all_columns_hide_window_special_ones.sql14
-rw-r--r--yt/yql/tests/sql/suites/window/current/aggregations.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/current/aggregations.sql16
-rw-r--r--yt/yql/tests/sql/suites/window/current/aggregations_leadlag.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/current/aggregations_leadlag.sql15
-rw-r--r--yt/yql/tests/sql/suites/window/current/ansi_current.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/current/ansi_current.sql15
-rw-r--r--yt/yql/tests/sql/suites/window/current/ansi_current_mixed.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/current/ansi_current_mixed.sql25
-rw-r--r--yt/yql/tests/sql/suites/window/current/ansi_current_with_win.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/current/ansi_current_with_win.sql16
-rw-r--r--yt/yql/tests/sql/suites/window/current/session.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/current/session.sql15
-rw-r--r--yt/yql/tests/sql/suites/window/current/session_aliases.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/current/session_aliases.sql21
-rw-r--r--yt/yql/tests/sql/suites/window/current/session_extended.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/current/session_extended.sql29
-rw-r--r--yt/yql/tests/sql/suites/window/current/session_incompat_sort.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/current/session_incompat_sort.sql16
-rw-r--r--yt/yql/tests/sql/suites/window/default.cfg2
-rw-r--r--yt/yql/tests/sql/suites/window/distinct_over_window.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/distinct_over_window.sql20
-rw-r--r--yt/yql/tests/sql/suites/window/distinct_over_window_full_frames.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/distinct_over_window_full_frames.sql22
-rw-r--r--yt/yql/tests/sql/suites/window/distinct_over_window_struct.sql37
-rw-r--r--yt/yql/tests/sql/suites/window/empty/aggregations.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/empty/aggregations.sql18
-rw-r--r--yt/yql/tests/sql/suites/window/empty/aggregations_leadlag.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/empty/aggregations_leadlag.sql17
-rw-r--r--yt/yql/tests/sql/suites/window/full/aggregations.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/full/aggregations.sql16
-rw-r--r--yt/yql/tests/sql/suites/window/full/aggregations_compact.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/full/aggregations_compact.sql16
-rw-r--r--yt/yql/tests/sql/suites/window/full/aggregations_leadlag.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/full/aggregations_leadlag.sql15
-rw-r--r--yt/yql/tests/sql/suites/window/full/aggregations_leadlag_compact.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/full/aggregations_leadlag_compact.sql15
-rw-r--r--yt/yql/tests/sql/suites/window/full/leadlag.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/full/leadlag.sql17
-rw-r--r--yt/yql/tests/sql/suites/window/full/leadlag_compact.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/full/leadlag_compact.sql17
-rw-r--r--yt/yql/tests/sql/suites/window/full/noncompact_with_nulls.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/full/noncompact_with_nulls.sql23
-rw-r--r--yt/yql/tests/sql/suites/window/full/noncompact_with_nulls_tuple_key.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/full/noncompact_with_nulls_tuple_key.sql23
-rw-r--r--yt/yql/tests/sql/suites/window/full/noncompact_with_tablerow.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/full/noncompact_with_tablerow.sql14
-rw-r--r--yt/yql/tests/sql/suites/window/full/session.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/full/session.sql21
-rw-r--r--yt/yql/tests/sql/suites/window/full/session_aliases.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/full/session_aliases.sql19
-rw-r--r--yt/yql/tests/sql/suites/window/full/session_aliases_compact.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/full/session_aliases_compact.sql19
-rw-r--r--yt/yql/tests/sql/suites/window/full/session_compact.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/full/session_compact.sql16
-rw-r--r--yt/yql/tests/sql/suites/window/full/session_incompat_sort.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/full/session_incompat_sort.sql21
-rw-r--r--yt/yql/tests/sql/suites/window/full/syscolumns.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/full/syscolumns.sql15
-rw-r--r--yt/yql/tests/sql/suites/window/generic/aggregations_after_current.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/generic/aggregations_after_current.sql16
-rw-r--r--yt/yql/tests/sql/suites/window/generic/aggregations_before_current.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/generic/aggregations_before_current.sql16
-rw-r--r--yt/yql/tests/sql/suites/window/generic/aggregations_include_current.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/generic/aggregations_include_current.sql16
-rw-r--r--yt/yql/tests/sql/suites/window/generic/aggregations_mixed.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/generic/aggregations_mixed.sql16
-rw-r--r--yt/yql/tests/sql/suites/window/generic/aggregations_mixed_leadlag.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/generic/aggregations_mixed_leadlag.sql15
-rw-r--r--yt/yql/tests/sql/suites/window/generic/session.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/generic/session.sql16
-rw-r--r--yt/yql/tests/sql/suites/window/generic/session_aliases.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/generic/session_aliases.sql23
-rw-r--r--yt/yql/tests/sql/suites/window/input_optkey1.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/window/input_optkey2.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/window/lagging/aggregations.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/lagging/aggregations.sql16
-rw-r--r--yt/yql/tests/sql/suites/window/lagging/aggregations_leadlag.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/lagging/aggregations_leadlag.sql15
-rw-r--r--yt/yql/tests/sql/suites/window/leading/aggregations.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/leading/aggregations.sql16
-rw-r--r--yt/yql/tests/sql/suites/window/leading/aggregations_leadlag.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/leading/aggregations_leadlag.sql15
-rw-r--r--yt/yql/tests/sql/suites/window/mixed/aggregations.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/mixed/aggregations.sql17
-rw-r--r--yt/yql/tests/sql/suites/window/p_int32.json1
-rw-r--r--yt/yql/tests/sql/suites/window/presort_window_order_by_table.sql16
-rw-r--r--yt/yql/tests/sql/suites/window/presort_window_partition_by_table.sql7
-rw-r--r--yt/yql/tests/sql/suites/window/rank/opt.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/rank/opt.sql23
-rw-r--r--yt/yql/tests/sql/suites/window/rank/plain.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/rank/plain.sql23
-rw-r--r--yt/yql/tests/sql/suites/window/rank/unordered.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/rank/unordered.sql20
-rw-r--r--yt/yql/tests/sql/suites/window/row_number_no_part_from_subq.sql6
-rw-r--r--yt/yql/tests/sql/suites/window/row_number_no_part_multi_input.sql25
-rw-r--r--yt/yql/tests/sql/suites/window/row_number_to_map.sql18
-rw-r--r--yt/yql/tests/sql/suites/window/row_number_to_map_multiple.sql15
-rw-r--r--yt/yql/tests/sql/suites/window/row_number_to_map_noncompact.sql12
-rw-r--r--yt/yql/tests/sql/suites/window/session1.txt.attr7
-rw-r--r--yt/yql/tests/sql/suites/window/udaf_window.cfg2
-rw-r--r--yt/yql/tests/sql/suites/window/udaf_window.sql51
-rw-r--r--yt/yql/tests/sql/suites/window/win_by_all_aggregate.cfg4
-rw-r--r--yt/yql/tests/sql/suites/window/win_by_all_aggregate.sql38
-rw-r--r--yt/yql/tests/sql/suites/window/win_by_all_avg_interval.sql19
-rw-r--r--yt/yql/tests/sql/suites/window/win_by_all_percentile_interval.sql36
-rw-r--r--yt/yql/tests/sql/suites/window/win_expr_bounds.cfg2
-rw-r--r--yt/yql/tests/sql/suites/window/win_expr_bounds.sql13
-rw-r--r--yt/yql/tests/sql/suites/window/win_extract_members.sql21
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_4func.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_4func.sql9
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_4func_no_part.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_4func_no_part.sql8
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_4func_no_part_sorted.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_4func_no_part_sorted.sql9
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_4func_sort.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_4func_sort.sql9
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_4func_sort_desc.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_4func_sort_desc.sql9
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_hist.cfg2
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_hist.sql5
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_stat.cfg2
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_stat.sql8
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_with_qualified_all.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_with_qualified_all.sql6
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_with_qualified_all_no_simple_columns.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_aggr_with_qualified_all_no_simple_columns.sql7
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_auto_arg.sql17
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_auto_arg_selective_rank.sql18
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_auto_arg_two_sort.sql18
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_first_last.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_first_last.sql10
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_first_last_over_nonopt.sql19
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_first_last_rev.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_first_last_rev.sql10
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_first_last_with_part.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_first_last_with_part.sql14
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_in_lib.cfg2
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_in_lib.sql6
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_into_udf.cfg2
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_into_udf.sql6
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_lead_lag_opt.cfg2
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_lead_lag_opt.sql23
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_lead_lag_worm.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_lead_lag_worm.sql21
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_lead_lag_worm_with_part.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_lead_lag_worm_with_part.sql22
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_lead_lag_worm_with_part_other.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_lead_lag_worm_with_part_other.sql22
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_on_cloned_source.sql15
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_order_by_udf_empty_rank.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_order_by_udf_empty_rank.sql17
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_over_group_by.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_over_group_by.sql17
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_over_group_by_compl.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_over_group_by_compl.sql25
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_over_group_by_list_names.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_over_group_by_list_names.sql27
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_over_group_by_list_names_order_prefix.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_over_group_by_list_names_order_prefix.sql24
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_part_by_expr.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_part_by_expr.sql14
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_part_by_expr_new.sql9
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_rank_by_all.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_rank_by_all.sql13
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_rank_by_opt_all.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_rank_by_opt_all.sql13
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_rank_by_opt_part.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_rank_by_opt_part.sql15
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_rank_by_part.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_rank_by_part.sql15
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_rank_with_order_by_aggr_key.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_rank_with_order_by_aggr_key.sql9
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_spec_with_part.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_spec_with_part.sql14
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_special.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_special.sql11
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_with_struct_access.sql21
-rw-r--r--yt/yql/tests/sql/suites/window/win_func_with_struct_access_full_access.sql21
-rw-r--r--yt/yql/tests/sql/suites/window/win_fuse_window.sql25
-rw-r--r--yt/yql/tests/sql/suites/window/win_inline_spec.sql9
-rw-r--r--yt/yql/tests/sql/suites/window/win_lead_in_mem.sql10
-rw-r--r--yt/yql/tests/sql/suites/window/win_multiaggr.sql6
-rw-r--r--yt/yql/tests/sql/suites/window/win_multiaggr_library.cfg3
-rw-r--r--yt/yql/tests/sql/suites/window/win_multiaggr_library.sql7
-rw-r--r--yt/yql/tests/sql/suites/window/win_multiaggr_list.sql6
-rw-r--r--yt/yql/tests/sql/suites/window/win_multiaggr_tuple.sql6
-rw-r--r--yt/yql/tests/sql/suites/window/win_over_few_partitions.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_over_few_partitions.sql15
-rw-r--r--yt/yql/tests/sql/suites/window/win_over_few_partitions_other.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_over_few_partitions_other.sql15
-rw-r--r--yt/yql/tests/sql/suites/window/win_with_cur_row.cfg1
-rw-r--r--yt/yql/tests/sql/suites/window/win_with_cur_row.sql8
-rw-r--r--yt/yql/tests/sql/suites/window/yql-14479.sql8
-rw-r--r--yt/yql/tests/sql/suites/window/yql-14738.sql12
-rw-r--r--yt/yql/tests/sql/suites/window/yql-15636.sql37
-rw-r--r--yt/yql/tests/sql/suites/ypath/complex.sql3
-rw-r--r--yt/yql/tests/sql/suites/ypath/default.cfg2
-rw-r--r--yt/yql/tests/sql/suites/ypath/direct_read_from_dynamic.cfg2
-rw-r--r--yt/yql/tests/sql/suites/ypath/direct_read_from_dynamic.sql4
-rw-r--r--yt/yql/tests/sql/suites/ypath/dynamic.txt.attr33
-rw-r--r--yt/yql/tests/sql/suites/ypath/empty_range-dynamic.cfg3
-rw-r--r--yt/yql/tests/sql/suites/ypath/empty_range.cfg3
-rw-r--r--yt/yql/tests/sql/suites/ypath/empty_range.sql2
-rw-r--r--yt/yql/tests/sql/suites/ypath/input.txt.attr13
-rw-r--r--yt/yql/tests/sql/suites/ypath/limit_with_key.sql3
-rw-r--r--yt/yql/tests/sql/suites/ypath/limit_with_range.sql3
-rw-r--r--yt/yql/tests/sql/suites/ypath/multi_key.sql3
-rw-r--r--yt/yql/tests/sql/suites/ypath/multi_range.sql3
3807 files changed, 44668 insertions, 0 deletions
diff --git a/yt/yql/tests/sql/suites/action/action_eval_cluster_and_table.sql b/yt/yql/tests/sql/suites/action/action_eval_cluster_and_table.sql
new file mode 100644
index 0000000000..414f54ac9d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/action_eval_cluster_and_table.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+/* postgres can not */
+$cluster = "pla" || "to";
+$name = "In" || "put";
+
+SELECT
+ count(*)
+FROM yt:$cluster.$name;
diff --git a/yt/yql/tests/sql/suites/action/action_eval_cluster_table.cfg b/yt/yql/tests/sql/suites/action/action_eval_cluster_table.cfg
new file mode 100644
index 0000000000..386ab9ac7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/action_eval_cluster_table.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output output.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/action/action_eval_cluster_table.sql b/yt/yql/tests/sql/suites/action/action_eval_cluster_table.sql
new file mode 100644
index 0000000000..67e2af6063
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/action_eval_cluster_table.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+/* postgres can not */
+$foo = CAST(Unicode::ToLower("PLATO"u) AS String);
+
+insert into yt:$foo.Output
+select *
+from yt:$foo.Input
+where key < "100"
+order by key;
diff --git a/yt/yql/tests/sql/suites/action/action_eval_cluster_table_for.cfg b/yt/yql/tests/sql/suites/action/action_eval_cluster_table_for.cfg
new file mode 100644
index 0000000000..386ab9ac7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/action_eval_cluster_table_for.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output output.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/action/action_eval_cluster_table_for.sql b/yt/yql/tests/sql/suites/action/action_eval_cluster_table_for.sql
new file mode 100644
index 0000000000..56554226fe
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/action_eval_cluster_table_for.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+define action $a($x) as
+ $foo = CAST(Unicode::ToLower($x) AS String);
+
+ insert into yt:$foo.Output
+ select *
+ from yt:$foo.Input
+ where key < "100"
+ order by key;
+
+end define;
+
+evaluate for $i in AsList("PLATO"u) do $a($i);
diff --git a/yt/yql/tests/sql/suites/action/action_eval_cluster_use.cfg b/yt/yql/tests/sql/suites/action/action_eval_cluster_use.cfg
new file mode 100644
index 0000000000..386ab9ac7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/action_eval_cluster_use.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output output.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/action/action_eval_cluster_use.sql b/yt/yql/tests/sql/suites/action/action_eval_cluster_use.sql
new file mode 100644
index 0000000000..7635ba2d17
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/action_eval_cluster_use.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+$foo = CAST(Unicode::ToLower("PLATO"u) AS String);
+use yt:$foo;
+
+insert into Output
+select *
+from Input
+where key < "100"
+order by key;
diff --git a/yt/yql/tests/sql/suites/action/action_eval_cluster_use_compact_named_exprs.cfg b/yt/yql/tests/sql/suites/action/action_eval_cluster_use_compact_named_exprs.cfg
new file mode 100644
index 0000000000..fccca71d35
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/action_eval_cluster_use_compact_named_exprs.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output output.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/action/action_eval_cluster_use_compact_named_exprs.sql b/yt/yql/tests/sql/suites/action/action_eval_cluster_use_compact_named_exprs.sql
new file mode 100644
index 0000000000..08994c5615
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/action_eval_cluster_use_compact_named_exprs.sql
@@ -0,0 +1,20 @@
+/* yt can not */
+pragma CompactNamedExprs;
+$foo = CAST(Unicode::ToLower("PLATO"u) AS String);
+
+insert into yt:$foo.Output
+select *
+from yt:$foo.Input
+where key < "100"
+order by key;
+
+define action $bar() as
+ $x = CAST(Unicode::ToLower("PLaTO"u) AS String);
+ insert into yt:$x.Output
+ select *
+ from yt:$foo.Input
+ where key < "100"
+ order by key;
+end define;
+
+do $bar();
diff --git a/yt/yql/tests/sql/suites/action/action_nested_query.sql b/yt/yql/tests/sql/suites/action/action_nested_query.sql
new file mode 100644
index 0000000000..0d6e87d794
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/action_nested_query.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+define action $action() as
+ $sub = (select * from Input);
+ select * from $sub order by key;
+end define;
+
+do $action();
diff --git a/yt/yql/tests/sql/suites/action/combine_subqueries_with_table_param.sql b/yt/yql/tests/sql/suites/action/combine_subqueries_with_table_param.sql
new file mode 100644
index 0000000000..542493b3af
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/combine_subqueries_with_table_param.sql
@@ -0,0 +1,22 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$combineQueries = ($query, $list) -> {
+ RETURN EvaluateCode(LambdaCode(($world) -> {
+ $queries = ListMap($list, ($arg)->{
+ RETURN FuncCode("Apply", QuoteCode($query), $world, ReprCode($arg))
+ });
+
+ RETURN FuncCode("UnionAll", $queries);
+ }));
+};
+
+DEFINE SUBQUERY $calc($table) AS
+ SELECT *
+ FROM $table;
+END DEFINE;
+
+$fullQuery = $combineQueries($calc, AsList("Input", "Input"));
+
+SELECT count(*) FROM $fullQuery();
diff --git a/yt/yql/tests/sql/suites/action/default.cfg b/yt/yql/tests/sql/suites/action/default.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/default.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/action/dep_world_action_quote.sql b/yt/yql/tests/sql/suites/action/dep_world_action_quote.sql
new file mode 100644
index 0000000000..6375e06aee
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/dep_world_action_quote.sql
@@ -0,0 +1,20 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+DEFINE ACTION $aaa($z) as
+
+$table = $z.0;
+$k = (select min(key || $z.1) from $table);
+
+DEFINE ACTION $bbb($n) AS
+ SELECT $n || $k FROM $table;
+END DEFINE;
+
+$ccc = EvaluateCode(QuoteCode($bbb));
+DO $ccc("1");
+
+END DEFINE;
+
+EVALUATE FOR $z IN AsList(AsTuple("Input","foo"),AsTuple("Input","bar"))
+ DO $aaa($z);
diff --git a/yt/yql/tests/sql/suites/action/dep_world_quote_code.sql b/yt/yql/tests/sql/suites/action/dep_world_quote_code.sql
new file mode 100644
index 0000000000..6188630666
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/dep_world_quote_code.sql
@@ -0,0 +1,31 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$combineQueries = ($query, $list) -> {
+ RETURN EvaluateCode(LambdaCode(($world) -> {
+ $queries = ListMap($list, ($arg) -> {
+ RETURN FuncCode("Apply", QuoteCode($query), $world, ReprCode($arg))
+ });
+
+ RETURN FuncCode("Extend", $queries);
+ }));
+};
+
+DEFINE ACTION $aaa($z) as
+
+$k = (select count(*) from $z);
+
+DEFINE SUBQUERY $sub($n) AS
+ SELECT $n + $k FROM $z;
+END DEFINE;
+
+$fullQuery = $combineQueries($sub, ListFromRange(0, 10));
+SELECT * FROM $fullQuery();
+
+END DEFINE;
+
+EVALUATE FOR $z IN AsList("Input")
+ DO $aaa($z);
+
+DO $aaa("Input");
diff --git a/yt/yql/tests/sql/suites/action/discard.sql b/yt/yql/tests/sql/suites/action/discard.sql
new file mode 100644
index 0000000000..ccdac00de8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/discard.sql
@@ -0,0 +1,32 @@
+/* syntax version 1 */
+/* postgres can not */
+define subquery $a() as
+$_x = select 1;
+discard
+select ensure(1, true);
+select 2;
+$_y = select 2;
+end define;
+
+process $a();
+
+
+define subquery $b() as
+$f1 = ($row)->(<|a:1,b:$row.value|>);
+$f2 = ($row)->(<|a:2,b:$row.value|>);
+discard
+process plato.Input using $f1(TableRow());
+process plato.Input using $f2(TableRow());
+end define;
+
+select * from $b() order by b limit 1;
+
+define subquery $c() as
+$f1 = ($key,$_)->(<|a:1,b:$key|>);
+$f2 = ($key,$_)->(<|a:2,b:$key|>);
+discard
+reduce plato.Input on key using $f1(TableRow());
+reduce plato.Input on key using $f2(TableRow());
+end define;
+
+select * from $c() order by b limit 1;
diff --git a/yt/yql/tests/sql/suites/action/empty_do.sql b/yt/yql/tests/sql/suites/action/empty_do.sql
new file mode 100644
index 0000000000..3b30a5803c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/empty_do.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+do empty_action();
+
+$action1 = empty_action;
+
+do $action1();
+
+$action2 = ($a,$_b)->{
+ return $a;
+};
+
+do $action2(12);
diff --git a/yt/yql/tests/sql/suites/action/eval_anon_table.cfg b/yt/yql/tests/sql/suites/action/eval_anon_table.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_anon_table.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/action/eval_anon_table.sql b/yt/yql/tests/sql/suites/action/eval_anon_table.sql
new file mode 100644
index 0000000000..449fbd3b83
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_anon_table.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$a = CAST(Unicode::ToUpper("T"u) AS String) || "able";
+$b = CAST(Unicode::ToUpper("T"u) AS String) || "able";
+
+insert into @$a
+select 1 as x;
+
+commit;
+
+select * from @$b;
diff --git a/yt/yql/tests/sql/suites/action/eval_atom_wrong_type_expr.cfg b/yt/yql/tests/sql/suites/action/eval_atom_wrong_type_expr.cfg
new file mode 100644
index 0000000000..bc27f4ed21
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_atom_wrong_type_expr.cfg
@@ -0,0 +1,3 @@
+xfail
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/action/eval_atom_wrong_type_expr.sql b/yt/yql/tests/sql/suites/action/eval_atom_wrong_type_expr.sql
new file mode 100644
index 0000000000..eeda7684a3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_atom_wrong_type_expr.sql
@@ -0,0 +1,8 @@
+/* yt can not */
+/* custom error: Expected data or optional of data, but got: List<String> */
+use plato;
+
+$n = ["foo"];
+
+select * from $n;
+
diff --git a/yt/yql/tests/sql/suites/action/eval_atom_wrong_type_param.cfg b/yt/yql/tests/sql/suites/action/eval_atom_wrong_type_param.cfg
new file mode 100644
index 0000000000..bc27f4ed21
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_atom_wrong_type_param.cfg
@@ -0,0 +1,3 @@
+xfail
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/action/eval_atom_wrong_type_param.sql b/yt/yql/tests/sql/suites/action/eval_atom_wrong_type_param.sql
new file mode 100644
index 0000000000..78990decb9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_atom_wrong_type_param.sql
@@ -0,0 +1,8 @@
+/* yt can not */
+/* custom error: Expected data or optional of data, but got optional of: List<String> */
+use plato;
+
+declare $n as List<String>?;
+
+select * from $n;
+
diff --git a/yt/yql/tests/sql/suites/action/eval_column.cfg b/yt/yql/tests/sql/suites/action/eval_column.cfg
new file mode 100644
index 0000000000..c6596e362c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_column.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/action/eval_column.sql b/yt/yql/tests/sql/suites/action/eval_column.sql
new file mode 100644
index 0000000000..98838fb5fe
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_column.sql
@@ -0,0 +1,34 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$x = CAST(Unicode::ToLower("foo"u) AS String);
+select AsStruct("1" as foo, 2 as bar).$x;
+
+$x = CAST(Unicode::ToLower("value"u) AS String);
+select key, t.$x from Input as t order by key;
+
+$x = CAST(Unicode::ToLower("value"u) AS String);
+select key, TableRow().$x from Input order by key;
+
+
+$x = CAST(Unicode::ToLower("value"u) AS String);
+select * from Input as t order by t.$x;
+
+$x = CAST(Unicode::ToLower("value"u) AS String);
+$y = CAST(Unicode::ToLower("key"u) AS String);
+
+select x,count(*) from Input as t group by t.$x as x
+having min(t.$y) != ""
+order by x;
+
+select a.$x as x,b.$y as y from Input as a join Input as b on (a.$x = b.$x)
+order by x;
+
+select a.$x as x,b.$y as y from Input as a join Input as b using ($x)
+order by x;
+
+select p, value, lag(value) over w as lag
+from Input
+window w as (partition by TableRow().$y as p order by TableRow().$x)
+order by p, value;
diff --git a/yt/yql/tests/sql/suites/action/eval_drop.cfg b/yt/yql/tests/sql/suites/action/eval_drop.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_drop.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/action/eval_drop.sql b/yt/yql/tests/sql/suites/action/eval_drop.sql
new file mode 100644
index 0000000000..c5275e2801
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_drop.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$path = (select min(Path) from folder(""));
+
+drop table $path; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/action/eval_each_input_table.sql b/yt/yql/tests/sql/suites/action/eval_each_input_table.sql
new file mode 100644
index 0000000000..45514cb512
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_each_input_table.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+$a = ListMap(ListFromRange(0,2), ($_x)->(CAST(Unicode::ToUpper("i"u) AS String) || "nput"));
+select count(*) FROM each($a view raw);
+
+$a = ListMap(ListFromRange(0,1), ($_x)->(CAST(Unicode::ToUpper("i"u) AS String) || "nput"));
+select count(*) FROM each_strict($a);
diff --git a/yt/yql/tests/sql/suites/action/eval_filter.cfg b/yt/yql/tests/sql/suites/action/eval_filter.cfg
new file mode 100644
index 0000000000..c6596e362c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_filter.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/action/eval_filter.sql b/yt/yql/tests/sql/suites/action/eval_filter.sql
new file mode 100644
index 0000000000..7fb11ebe59
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_filter.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$arg1 = "" || "";
+$arg2 = ($_item)->{return true};
+$arg3 = "" || "";
+$arg4 = "" || "raw";
+
+SELECT
+ count(*)
+FROM FILTER($arg1,$arg2,$arg3,$arg4);
diff --git a/yt/yql/tests/sql/suites/action/eval_folder.cfg b/yt/yql/tests/sql/suites/action/eval_folder.cfg
new file mode 100644
index 0000000000..9d0a494107
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_folder.cfg
@@ -0,0 +1 @@
+in Input input_attrs.txt
diff --git a/yt/yql/tests/sql/suites/action/eval_folder.sql b/yt/yql/tests/sql/suites/action/eval_folder.sql
new file mode 100644
index 0000000000..fbe663bcac
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_folder.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+SELECT * FROM Folder(``,"foo;bar");
diff --git a/yt/yql/tests/sql/suites/action/eval_folder_via_file.cfg b/yt/yql/tests/sql/suites/action/eval_folder_via_file.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_folder_via_file.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/action/eval_folder_via_file.sql b/yt/yql/tests/sql/suites/action/eval_folder_via_file.sql
new file mode 100644
index 0000000000..2121ea69c2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_folder_via_file.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+pragma yt.FolderInlineItemsLimit="0";
+
+$list = (
+ select aggregate_list(Path) from (
+ select Path from folder("")
+ where Type = "table"
+ limit 30
+ )
+);
+
+select
+ count(*)
+from
+ each($list)
diff --git a/yt/yql/tests/sql/suites/action/eval_folder_via_file_in_job.cfg b/yt/yql/tests/sql/suites/action/eval_folder_via_file_in_job.cfg
new file mode 100644
index 0000000000..289c4251bb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_folder_via_file_in_job.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf python3_udf
diff --git a/yt/yql/tests/sql/suites/action/eval_folder_via_file_in_job.sql b/yt/yql/tests/sql/suites/action/eval_folder_via_file_in_job.sql
new file mode 100644
index 0000000000..10ed2ec09c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_folder_via_file_in_job.sql
@@ -0,0 +1,25 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+pragma yt.FolderInlineItemsLimit="0";
+
+$script = @@
+def f(s):
+ return True
+@@;
+
+$callable = Python3::f(Callable<(String)->Bool>,$script);
+
+$list = (
+ select aggregate_list(Path) from (
+ select Path from folder("")
+ where Type = "table" and $callable(Path)
+ limit 30
+ )
+);
+
+select
+ count(*)
+from
+ each($list)
diff --git a/yt/yql/tests/sql/suites/action/eval_for.sql b/yt/yql/tests/sql/suites/action/eval_for.sql
new file mode 100644
index 0000000000..71427f2fde
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_for.sql
@@ -0,0 +1,21 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+define action $action1($x) as
+ select $x;
+end define;
+
+$f = ($i)->{
+ return CAST(Unicode::ToUpper(cast($i as Utf8)) AS String);
+};
+
+evaluate for $i in ListMap(ListFromRange(0,3),$f) do $action1($i);
+
+evaluate for $i in ListMap(ListFromRange(0,0),$f) do $action1($i) else do $action1(100);
+
+evaluate for $i in ListMap(ListFromRange(0,0),$f) do $action1($i);
+
+evaluate for $i in Yql::Map(1/1,($x)->{return AsList($x)}) do $action1($i);
+
+evaluate for $i in Yql::Map(1/0,($x)->{return AsList($x)}) do $action1($i);
diff --git a/yt/yql/tests/sql/suites/action/eval_for_over_subquery.sql b/yt/yql/tests/sql/suites/action/eval_for_over_subquery.sql
new file mode 100644
index 0000000000..198b80b9a5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_for_over_subquery.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$list = (
+ select aggregate_list(key) from Input
+);
+
+define action $echo($x) as
+ select $x;
+end define;
+
+evaluate for $a in $list do $echo($a);
diff --git a/yt/yql/tests/sql/suites/action/eval_if.sql b/yt/yql/tests/sql/suites/action/eval_if.sql
new file mode 100644
index 0000000000..f64665fd69
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_if.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+define action $action1($x) as
+ select $x;
+end define;
+
+evaluate if CAST(Unicode::ToUpper("i"u) AS String) == "I"
+ do $action1(1)
+else
+ do $action1(2);
+
+evaluate if CAST(Unicode::ToUpper("i"u) AS String) != "I"
+ do $action1(3);
+
+evaluate if CAST(Unicode::ToUpper("i"u) AS String) == "I"
+ do $action1(4);
diff --git a/yt/yql/tests/sql/suites/action/eval_if_guard.sql b/yt/yql/tests/sql/suites/action/eval_if_guard.sql
new file mode 100644
index 0000000000..4a11e6933e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_if_guard.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$list = ListTake(AsList("Input"),0);
+define action $process() as
+ select count(*) FROM each($list);
+end define;
+
+evaluate if ListLength($list)>0 do $process();
diff --git a/yt/yql/tests/sql/suites/action/eval_input_output_table.cfg b/yt/yql/tests/sql/suites/action/eval_input_output_table.cfg
new file mode 100644
index 0000000000..386ab9ac7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_input_output_table.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output output.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/action/eval_input_output_table.sql b/yt/yql/tests/sql/suites/action/eval_input_output_table.sql
new file mode 100644
index 0000000000..e8bbd374f9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_input_output_table.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$a = CAST(Unicode::ToUpper("o"u) AS String) || "utput";
+$b = CAST(Unicode::ToUpper("i"u) AS String) || "nput";
+INSERT INTO $a
+SELECT
+ key as key,
+ "" as subkey,
+ "value:" || value as value
+FROM $b
+WHERE key < "100"
+ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/action/eval_input_output_table_subquery.cfg b/yt/yql/tests/sql/suites/action/eval_input_output_table_subquery.cfg
new file mode 100644
index 0000000000..386ab9ac7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_input_output_table_subquery.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output output.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/action/eval_input_output_table_subquery.sql b/yt/yql/tests/sql/suites/action/eval_input_output_table_subquery.sql
new file mode 100644
index 0000000000..429b27f11c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_input_output_table_subquery.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$a = (SELECT CAST(Unicode::ToUpper("o"u) AS String) || "utpu");
+$b = (SELECT CAST(Unicode::ToUpper("i"u) AS String) || "npu");
+$a = $a || CAST(Unicode::ToLower("T"u) AS String);
+$b = $b || CAST(Unicode::ToLower("T"u) AS String);
+INSERT INTO $a
+SELECT
+ key as key,
+ "" as subkey,
+ "value:" || value as value
+FROM $b
+WHERE key < "100"
+ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/action/eval_like.cfg b/yt/yql/tests/sql/suites/action/eval_like.cfg
new file mode 100644
index 0000000000..c6596e362c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_like.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/action/eval_like.sql b/yt/yql/tests/sql/suites/action/eval_like.sql
new file mode 100644
index 0000000000..24132ebd39
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_like.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$arg1 = "" || "";
+$arg2 = CAST(Unicode::ToUpper("i"u) AS String) || "npu_";
+$arg3 = "" || "";
+$arg4 = "" || "raw";
+
+SELECT
+ count(*)
+FROM LIKE($arg1,$arg2,$arg3,$arg4);
diff --git a/yt/yql/tests/sql/suites/action/eval_on_modif_table_fail.cfg b/yt/yql/tests/sql/suites/action/eval_on_modif_table_fail.cfg
new file mode 100644
index 0000000000..a26fadcaa7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_on_modif_table_fail.cfg
@@ -0,0 +1,3 @@
+xfail
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/action/eval_on_modif_table_fail.sql b/yt/yql/tests/sql/suites/action/eval_on_modif_table_fail.sql
new file mode 100644
index 0000000000..4cd9a1ba98
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_on_modif_table_fail.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+/* custom error: Table "Output" is used before commit */
+USE plato;
+
+insert into Output
+select "key" as field
+union all
+select "subkey" as field;
+
+commit;
+
+$whitelist = select aggregate_list(field)
+from Output;
+
+select ForceSpreadMembers([("key", key)],Unwrap($whitelist)) from Input;
diff --git a/yt/yql/tests/sql/suites/action/eval_pragma.cfg b/yt/yql/tests/sql/suites/action/eval_pragma.cfg
new file mode 100644
index 0000000000..386ab9ac7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_pragma.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output output.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/action/eval_pragma.sql b/yt/yql/tests/sql/suites/action/eval_pragma.sql
new file mode 100644
index 0000000000..87f4fb3b4a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_pragma.sql
@@ -0,0 +1,4 @@
+/* syntax version 1 */
+/* postgres can not */
+$a = "1" || CAST(Unicode::ToUpper("m") AS String);
+pragma yt.DataSizePerJob=$a;
diff --git a/yt/yql/tests/sql/suites/action/eval_range.cfg b/yt/yql/tests/sql/suites/action/eval_range.cfg
new file mode 100644
index 0000000000..c6596e362c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_range.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/action/eval_range.sql b/yt/yql/tests/sql/suites/action/eval_range.sql
new file mode 100644
index 0000000000..9ab6494943
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_range.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$arg1 = "" || "";
+$arg2 = CAST(Unicode::ToUpper("i"u) AS String) || "nput";
+$arg3 = CAST(Unicode::ToUpper("i"u) AS String) || "nput";
+$arg4 = "" || "";
+$arg5 = "" || "raw";
+
+SELECT
+ count(*)
+FROM RANGE($arg1,$arg2,$arg3,$arg4,$arg5);
diff --git a/yt/yql/tests/sql/suites/action/eval_regexp.cfg b/yt/yql/tests/sql/suites/action/eval_regexp.cfg
new file mode 100644
index 0000000000..c6596e362c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_regexp.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/action/eval_regexp.sql b/yt/yql/tests/sql/suites/action/eval_regexp.sql
new file mode 100644
index 0000000000..6e3fcf0ad6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_regexp.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+$arg1 = "" || "";
+$arg2 = (Unicode::ToUpper("i") ?? "") || "npu.";
+$arg3 = "" || "";
+$arg4 = "" || "raw";
+
+SELECT
+ count(*)
+FROM REGEXP($arg1,$arg2,$arg3,$arg4);
diff --git a/yt/yql/tests/sql/suites/action/eval_sample.cfg b/yt/yql/tests/sql/suites/action/eval_sample.cfg
new file mode 100644
index 0000000000..a654f9117d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_sample.cfg
@@ -0,0 +1 @@
+in Input input1.txt
diff --git a/yt/yql/tests/sql/suites/action/eval_sample.sql b/yt/yql/tests/sql/suites/action/eval_sample.sql
new file mode 100644
index 0000000000..2fc0464387
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_sample.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+$x = 1.0 / 3;
+SELECT *
+FROM plato.Input
+SAMPLE $x;
diff --git a/yt/yql/tests/sql/suites/action/eval_skip_take.cfg b/yt/yql/tests/sql/suites/action/eval_skip_take.cfg
new file mode 100644
index 0000000000..c6596e362c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_skip_take.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/action/eval_skip_take.sql b/yt/yql/tests/sql/suites/action/eval_skip_take.sql
new file mode 100644
index 0000000000..06d56e5b25
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_skip_take.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+select * from Input
+order by key
+limit length(CAST(Unicode::ToUpper("a"u) AS String))
+offset length(CAST(Unicode::ToUpper("bc"u) AS String));
diff --git a/yt/yql/tests/sql/suites/action/eval_table_with_view.sql b/yt/yql/tests/sql/suites/action/eval_table_with_view.sql
new file mode 100644
index 0000000000..2c27b55d58
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_table_with_view.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+$x = "Input";
+SELECT *
+FROM $x VIEW raw LIMIT 1; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/action/eval_typeof_output_table.cfg b/yt/yql/tests/sql/suites/action/eval_typeof_output_table.cfg
new file mode 100644
index 0000000000..1d0f17aef1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_typeof_output_table.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output output.txt
+xfail
diff --git a/yt/yql/tests/sql/suites/action/eval_typeof_output_table.sql b/yt/yql/tests/sql/suites/action/eval_typeof_output_table.sql
new file mode 100644
index 0000000000..80428193e3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_typeof_output_table.sql
@@ -0,0 +1,26 @@
+/* syntax version 1 */
+/* postgres can not */
+/* custom error: Table "Output" does not exist */
+USE plato;
+
+INSERT INTO Output
+SELECT
+ key || "foo" as key2
+FROM Input;
+
+COMMIT;
+
+$input = PROCESS Output;
+$c = EvaluateCode(ReprCode(FormatType(TypeOf($input))));
+select $c;
+
+INSERT INTO Output WITH TRUNCATE
+SELECT
+ key || "foo" as key3
+FROM Input;
+
+COMMIT;
+
+$input = PROCESS Output;
+$c = EvaluateCode(ReprCode(FormatType(TypeOf($input))));
+select $c;
diff --git a/yt/yql/tests/sql/suites/action/eval_unresolved_type_arg.sql b/yt/yql/tests/sql/suites/action/eval_unresolved_type_arg.sql
new file mode 100644
index 0000000000..1ebfe07d30
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_unresolved_type_arg.sql
@@ -0,0 +1,25 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$myAddSuffix = ($row, $value) -> {
+ $type = TypeOf($row);
+ --$type=Struct<key:String,subkey:String,value:String>;
+ $lambda = EvaluateCode(LambdaCode(($r)->{
+ return FuncCode("AsStruct",
+ ListMap(StructTypeComponents(TypeHandle($type)),
+ ($i)->{ return ListCode(
+ AtomCode($i.Name),
+ FuncCode("Concat",
+ FuncCode("Member",$r,AtomCode($i.Name)),
+ ReprCode($value)
+ )) }));
+
+ }));
+
+ return $lambda($row);
+};
+
+SELECT
+ $myAddSuffix(TableRow(), "*")
+FROM Input;
diff --git a/yt/yql/tests/sql/suites/action/eval_values_output_table_subquery.cfg b/yt/yql/tests/sql/suites/action/eval_values_output_table_subquery.cfg
new file mode 100644
index 0000000000..386ab9ac7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_values_output_table_subquery.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output output.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/action/eval_values_output_table_subquery.sql b/yt/yql/tests/sql/suites/action/eval_values_output_table_subquery.sql
new file mode 100644
index 0000000000..240f4d2263
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/eval_values_output_table_subquery.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$a = (SELECT CAST(Unicode::ToUpper("o"u) AS String) || "utpu");
+$a = $a || CAST(Unicode::ToLower("T"u) AS String);
+INSERT INTO $a (key, subkey, value)
+VALUES (1, "foo", false);
diff --git a/yt/yql/tests/sql/suites/action/evaluate_match_type.sql b/yt/yql/tests/sql/suites/action/evaluate_match_type.sql
new file mode 100644
index 0000000000..bca34d037a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/evaluate_match_type.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$keep_only_last = ($row) -> {
+ $members = ListFilter(StructMembers($row), ($x) -> (FIND($x, "key") IS NOT NULL));
+ return ChooseMembers($row, $members)
+};
+
+
+select * from
+(select $keep_only_last(TableRow()) from Input) \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/action/evaluate_pure.cfg b/yt/yql/tests/sql/suites/action/evaluate_pure.cfg
new file mode 100644
index 0000000000..72eff595f4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/evaluate_pure.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf datetime_udf
diff --git a/yt/yql/tests/sql/suites/action/evaluate_pure.sql b/yt/yql/tests/sql/suites/action/evaluate_pure.sql
new file mode 100644
index 0000000000..b89afe26bc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/evaluate_pure.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+select EvaluateExpr(YQL::RandomNumber()), YQL::RandomNumber();
+select key, EvaluateExpr(cast(CurrentUtcDate() as string)) as `date` from Input;
+select YQL::String(EvaluateAtom("foo" || "bar"));
+select EvaluateExpr(CurrentUtcTimestamp()), CurrentUtcTimestamp();
+$y = Yson("{a=7u;c=[<d=%true>1;#;\"привет\";-3.4]}");
+select Yson::Equals(EvaluateExpr($y), $y);
+select EvaluateExpr(TzDate("2000-01-01,Europe/Moscow"));
+select EvaluateExpr(TzDatetime("2000-01-01T01:02:03,Europe/Moscow"));
+select EvaluateExpr(TzTimestamp("2000-01-01T01:02:03.456789,Europe/Moscow"));
diff --git a/yt/yql/tests/sql/suites/action/evaluate_queries.cfg b/yt/yql/tests/sql/suites/action/evaluate_queries.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/evaluate_queries.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/action/evaluate_queries.sql b/yt/yql/tests/sql/suites/action/evaluate_queries.sql
new file mode 100644
index 0000000000..8671f14def
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/evaluate_queries.sql
@@ -0,0 +1,28 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$s = (select count(*) from Input);
+select EvaluateExpr($s);
+/*
+$s = (select key from Input);
+select EvaluateExpr($s);
+
+$s = (select key || "foo" from Input);
+select EvaluateExpr($s);
+
+$s = (select aggregate_list(key) from Input);
+select EvaluateExpr($s);
+
+$s = (select v from (select key,min(value) as v from Input group by key order by key limit 1));
+select EvaluateExpr($s);
+
+$s = (select key from Input order by key limit 1);
+select EvaluateExpr($s);
+
+$s = (select lag(key) over w from Input window w as ());
+select EvaluateExpr($s);
+
+$s = (select a.key from Input as a join Input as b using(key));
+select EvaluateExpr($s);
+*/
diff --git a/yt/yql/tests/sql/suites/action/export_action.cfg b/yt/yql/tests/sql/suites/action/export_action.cfg
new file mode 100644
index 0000000000..d8349c7037
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/export_action.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+file lib1.sql lib1.sql.txt
diff --git a/yt/yql/tests/sql/suites/action/export_action.sql b/yt/yql/tests/sql/suites/action/export_action.sql
new file mode 100644
index 0000000000..59ecc86d5b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/export_action.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+/* postgres can not */
+/* kikimr can not - range not supported */
+pragma library("lib1.sql");
+import lib1 symbols $action;
+do $action("Input");
diff --git a/yt/yql/tests/sql/suites/action/input_attrs.txt.attr b/yt/yql/tests/sql/suites/action/input_attrs.txt.attr
new file mode 100644
index 0000000000..d2659911d1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/input_attrs.txt.attr
@@ -0,0 +1,32 @@
+{
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ };
+ "foo" = 1;
+ "bar" = "text";
+}
diff --git a/yt/yql/tests/sql/suites/action/insert_after_eval.cfg b/yt/yql/tests/sql/suites/action/insert_after_eval.cfg
new file mode 100644
index 0000000000..b1f9d81471
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/insert_after_eval.cfg
@@ -0,0 +1 @@
+out Output modify.txt
diff --git a/yt/yql/tests/sql/suites/action/insert_after_eval.sql b/yt/yql/tests/sql/suites/action/insert_after_eval.sql
new file mode 100644
index 0000000000..60ab74c109
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/insert_after_eval.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+/* postgres can not */
+/* multirun can not */
+USE plato;
+
+$s1 = (select count(*) from Output);
+$s2 = (select max(key) from Output);
+insert into Output with truncate
+select EvaluateExpr($s1) as a, EvaluateExpr($s2) as b;
diff --git a/yt/yql/tests/sql/suites/action/insert_after_eval_xlock.cfg b/yt/yql/tests/sql/suites/action/insert_after_eval_xlock.cfg
new file mode 100644
index 0000000000..b1f9d81471
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/insert_after_eval_xlock.cfg
@@ -0,0 +1 @@
+out Output modify.txt
diff --git a/yt/yql/tests/sql/suites/action/insert_after_eval_xlock.sql b/yt/yql/tests/sql/suites/action/insert_after_eval_xlock.sql
new file mode 100644
index 0000000000..c31b9e04eb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/insert_after_eval_xlock.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+/* postgres can not */
+/* multirun can not */
+USE plato;
+
+$s1 = (select count(*) from Output with xlock);
+$s2 = (select max(key) from Output with xlock);
+insert into Output with truncate
+select EvaluateExpr($s1) as a, EvaluateExpr($s2) as b;
diff --git a/yt/yql/tests/sql/suites/action/insert_each_from_folder.cfg b/yt/yql/tests/sql/suites/action/insert_each_from_folder.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/insert_each_from_folder.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/action/insert_each_from_folder.sql b/yt/yql/tests/sql/suites/action/insert_each_from_folder.sql
new file mode 100644
index 0000000000..dc06200679
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/insert_each_from_folder.sql
@@ -0,0 +1,19 @@
+/* syntax version 1 */
+/* postgres can not */
+/* multirun can not */
+use plato;
+
+$list = (
+ select aggregate_list(Path) from (
+ select Path from folder("")
+ where Type = "table" and Path like "Input%"
+ order by Path desc
+ limit 30
+ )
+);
+
+insert into Output with truncate
+select
+ count(*)
+from
+ each($list)
diff --git a/yt/yql/tests/sql/suites/action/mixed_eval_typeof_world1.cfg b/yt/yql/tests/sql/suites/action/mixed_eval_typeof_world1.cfg
new file mode 100644
index 0000000000..dbda958ebd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/mixed_eval_typeof_world1.cfg
@@ -0,0 +1,6 @@
+xfail
+in Input input.txt
+out Output1 output1.txt
+out Output2 output2.txt
+out Output3 output3.txt
+
diff --git a/yt/yql/tests/sql/suites/action/mixed_eval_typeof_world1.sql b/yt/yql/tests/sql/suites/action/mixed_eval_typeof_world1.sql
new file mode 100644
index 0000000000..af5339c5a5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/mixed_eval_typeof_world1.sql
@@ -0,0 +1,46 @@
+/* syntax version 1 */
+/* postgres can not */
+/* custom error:Anonymous table "@Output1" must be materialized*/
+use plato;
+
+$force_remove_members = ($struct, $to_remove) -> {
+ $remover = EvaluateCode(LambdaCode(($st) -> {
+ $to_keep = ListFlatMap(StructTypeComponents(TypeHandle(TypeOf($struct))), ($x) -> {return IF($x.Name not in $to_remove, $x.Name)});
+ return FuncCode(
+ "AsStruct",
+ ListMap(
+ $to_keep,
+ ($x) -> {return ListCode(AtomCode($x), FuncCode("Member", $st, AtomCode($x)))}
+ )
+ )
+ }));
+ return $remover($struct)
+};
+
+define action $func($input, $output) as
+ $jname = $output;
+ insert into @$jname
+ with truncate
+ select
+ *
+ from $input as input;
+ commit;
+ insert into $output
+ with truncate
+ select
+ AGG_LIST(
+ $force_remove_members(
+ TableRow(),
+ ['']
+ )
+ )
+ from @$jname;
+ commit;
+end define;
+
+$exps = [('Input','Output1'),('Input','Output2'),('Input','Output3')];
+evaluate for $exp_name in $exps do begin
+ $input = $exp_name.0;
+ $output = $exp_name.1;
+ do $func($input, $output);
+end do;
diff --git a/yt/yql/tests/sql/suites/action/modify.txt.attr b/yt/yql/tests/sql/suites/action/modify.txt.attr
new file mode 100644
index 0000000000..36b3c00c90
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/modify.txt.attr
@@ -0,0 +1,5 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[["key";["DataType";"String";];];["subkey";["DataType";"String";];];["value";["DataType";"String";];];];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/action/nested_rewrite_io.sql b/yt/yql/tests/sql/suites/action/nested_rewrite_io.sql
new file mode 100644
index 0000000000..4150bc7e3f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/nested_rewrite_io.sql
@@ -0,0 +1,22 @@
+use plato;
+$input = select * from AS_TABLE([<|a:"foo",b:"123"|>]);
+
+$mapping = select {"a":"String", "b":"Int32"} from Input limit 1;
+
+$transformer = ($type)->{
+ $t = EvaluateType(ParseTypeHandle($type));
+ return ($value)->{ return cast($value as $t); };
+};
+
+$converter = ($row)->{
+ return EvaluateCode(LambdaCode(($rowCode)->{
+ return FuncCode("AsStruct", ListMap(StructMembers($row), ($name)->{
+ return ListCode(
+ AtomCode($name),
+ FuncCode("Apply", QuoteCode($transformer(Unwrap($mapping[$name]))), FuncCode("Member", $rowCode, AtomCode($name)))
+ );
+ }));
+ }))($row);
+};
+
+select * from (select $converter(TableRow()) from $input) flatten columns;
diff --git a/yt/yql/tests/sql/suites/action/nested_subquery.cfg b/yt/yql/tests/sql/suites/action/nested_subquery.cfg
new file mode 100644
index 0000000000..386ab9ac7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/nested_subquery.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output output.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/action/nested_subquery.sql b/yt/yql/tests/sql/suites/action/nested_subquery.sql
new file mode 100644
index 0000000000..375dee1116
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/nested_subquery.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+define subquery $q($name) as
+ define subquery $nested() as
+ select $name;
+ end define;
+
+ process $nested();
+end define;
+
+process $q(CAST(Unicode::ToUpper("foo"u) AS String));
diff --git a/yt/yql/tests/sql/suites/action/parallel_for.sql b/yt/yql/tests/sql/suites/action/parallel_for.sql
new file mode 100644
index 0000000000..d9bfcfcedb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/parallel_for.sql
@@ -0,0 +1,11 @@
+/* yt can not */
+use plato;
+
+evaluate parallel for $i in [1,2,1,2,1] do begin
+insert into Output
+select $i as a;
+end do;
+
+commit;
+insert into Output with truncate
+select a from Output order by a;
diff --git a/yt/yql/tests/sql/suites/action/pending_arg_fail.cfg b/yt/yql/tests/sql/suites/action/pending_arg_fail.cfg
new file mode 100644
index 0000000000..eb2e5315d1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/pending_arg_fail.cfg
@@ -0,0 +1 @@
+xfail \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/action/pending_arg_fail.sql b/yt/yql/tests/sql/suites/action/pending_arg_fail.sql
new file mode 100644
index 0000000000..5d3155c610
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/pending_arg_fail.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+/* custom error:Failed to evaluate unresolved argument: row. Did you use a column?*/
+use plato;
+select ListExtract(value,key) from Input;
diff --git a/yt/yql/tests/sql/suites/action/process_from_subquery_with_orderby.sql b/yt/yql/tests/sql/suites/action/process_from_subquery_with_orderby.sql
new file mode 100644
index 0000000000..24ad5b76f9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/process_from_subquery_with_orderby.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+define subquery $src() as
+ select * from plato.Input order by key;
+end define;
+process $src();
diff --git a/yt/yql/tests/sql/suites/action/runtime_if_select.sql b/yt/yql/tests/sql/suites/action/runtime_if_select.sql
new file mode 100644
index 0000000000..c81f207ae9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/runtime_if_select.sql
@@ -0,0 +1,29 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+insert into @foo
+select count(*) as count from Input;
+commit;
+$n = (select count from @foo);
+$predicate = $n > 1;
+
+if $predicate do begin
+ select 1;
+end do;
+
+if not $predicate do begin
+ select 2;
+end do;
+
+if $predicate do begin
+ select 3;
+end do else do begin
+ select 4;
+end do;
+
+if not $predicate do begin
+ select 5;
+end do else do begin
+ select 6;
+end do;
diff --git a/yt/yql/tests/sql/suites/action/select_from_subquery_with_orderby.sql b/yt/yql/tests/sql/suites/action/select_from_subquery_with_orderby.sql
new file mode 100644
index 0000000000..fbc0f689d8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/select_from_subquery_with_orderby.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+/* syntax version 1 */
+define subquery $src() as
+ select * from plato.Input order by subkey;
+end define;
+
+define subquery $src_non_yt() as
+ select * from as_table([<|key:1, subkey:1|>, <|key:2, subkey:2|>]) order by subkey;
+end define;
+
+select * from $src() order by key;
+select * from $src_non_yt() order by key;
diff --git a/yt/yql/tests/sql/suites/action/subquery.sql b/yt/yql/tests/sql/suites/action/subquery.sql
new file mode 100644
index 0000000000..60df127bd5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/subquery.sql
@@ -0,0 +1,21 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+define subquery $q($name, $a) as
+ $i = (select * from $name);
+ $b = "_foo";
+ select key || $a || $b as key from $i;
+end define;
+
+$z = (select key from $q("Input", "_bar"));
+
+select $z;
+
+select key from $q("Input", "_baz") order by key;
+
+define subquery $e() as
+ select "hello";
+end define;
+
+process $e();
diff --git a/yt/yql/tests/sql/suites/action/subquery_merge1.sql b/yt/yql/tests/sql/suites/action/subquery_merge1.sql
new file mode 100644
index 0000000000..ae6d563701
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/subquery_merge1.sql
@@ -0,0 +1,25 @@
+/* syntax version 1 */
+/* postgres can not */
+define subquery $sub1() as
+ select 1 as x;
+end define;
+
+define subquery $sub2() as
+ select 2 as x;
+end define;
+
+define subquery $sub3() as
+ select 3 as y;
+end define;
+
+$s = SubqueryExtend($sub1,$sub2);
+process $s();
+
+$s = SubqueryUnionAll($sub1,$sub3);
+process $s();
+
+$s = SubqueryMerge($sub1,$sub2);
+process $s();
+
+$s = SubqueryUnionMerge($sub1,$sub3);
+process $s();
diff --git a/yt/yql/tests/sql/suites/action/subquery_merge2.sql b/yt/yql/tests/sql/suites/action/subquery_merge2.sql
new file mode 100644
index 0000000000..f8d4918c83
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/subquery_merge2.sql
@@ -0,0 +1,17 @@
+/* syntax version 1 */
+/* postgres can not */
+define subquery $sub($i) as
+ select $i as x;
+end define;
+
+$s = SubqueryExtendFor([1,2,3],$sub);
+process $s();
+
+$s = SubqueryUnionAllFor([1,2,3],$sub);
+process $s();
+
+$s = SubqueryMergeFor([1,2,3],$sub);
+process $s();
+
+$s = SubqueryUnionMergeFor([1,2,3],$sub);
+process $s();
diff --git a/yt/yql/tests/sql/suites/action/subquery_merge_evaluate.sql b/yt/yql/tests/sql/suites/action/subquery_merge_evaluate.sql
new file mode 100644
index 0000000000..25c3a000fa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/subquery_merge_evaluate.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+define subquery $sub1($i,$j?) as
+ select $i - 1,$j;
+end define;
+
+define subquery $sub2($i,$j?) as
+ select $i + 1,$j;
+end define;
+
+$sub = EvaluateCode(If(1>2,QuoteCode($sub1),QuoteCode($sub2)));
+
+$s = SubqueryExtendFor([1,2,3],$sub);
+process $s();
diff --git a/yt/yql/tests/sql/suites/action/subquery_merge_nested_subquery.cfg b/yt/yql/tests/sql/suites/action/subquery_merge_nested_subquery.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/subquery_merge_nested_subquery.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/action/subquery_merge_nested_subquery.sql b/yt/yql/tests/sql/suites/action/subquery_merge_nested_subquery.sql
new file mode 100644
index 0000000000..47317a548e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/subquery_merge_nested_subquery.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+DEFINE SUBQUERY $get_tables_list($dir) AS
+ SELECT
+ Unwrap($dir || "/" || CAST(TableName(Path, "yt") AS String)) AS Path,
+ FROM FOLDER($dir)
+END DEFINE;
+
+DEFINE SUBQUERY $get_all_tables_list($dirs) AS
+ $get_src_tables = SubqueryExtendFor(UNWRAP(ListUniq($dirs)), $get_tables_list);
+ select * from $get_src_tables();
+END DEFINE;
+
+process $get_all_tables_list([""]);
diff --git a/yt/yql/tests/sql/suites/action/subquery_merge_nested_world.sql b/yt/yql/tests/sql/suites/action/subquery_merge_nested_world.sql
new file mode 100644
index 0000000000..67f0683145
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/subquery_merge_nested_world.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+DEFINE SUBQUERY $s($_i) AS
+ $t = SELECT AGGREGATE_LIST(Path) FROM FOLDER('') WHERE Path LIKE "Input%";
+ SELECT
+ *
+ FROM EACH($t);
+END DEFINE;
+
+$extractor = SubqueryMergeFor([1], $s);
+
+SELECT *
+FROM $extractor();
diff --git a/yt/yql/tests/sql/suites/action/subquery_opt_args.sql b/yt/yql/tests/sql/suites/action/subquery_opt_args.sql
new file mode 100644
index 0000000000..b3c1c8a757
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/subquery_opt_args.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+/* postgres can not */
+define subquery $sub($a,$b?) as
+ select $a + ($b ?? 0);
+end define;
+
+process $sub(1);
+process $sub(2, 3);
diff --git a/yt/yql/tests/sql/suites/action/table_content_before_from_folder.cfg b/yt/yql/tests/sql/suites/action/table_content_before_from_folder.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/table_content_before_from_folder.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/action/table_content_before_from_folder.sql b/yt/yql/tests/sql/suites/action/table_content_before_from_folder.sql
new file mode 100644
index 0000000000..bd6ee020d4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/action/table_content_before_from_folder.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+pragma yt.EvaluationTableSizeLimit="1";
+select * from Input limit 1;
+$tables = (select aggregate_list(Path) as dates from folder("") where Path like "Input%");
+select count(*) from each($tables);
diff --git a/yt/yql/tests/sql/suites/agg_apply/avg_const_interval.cfg b/yt/yql/tests/sql/suites/agg_apply/avg_const_interval.cfg
new file mode 100644
index 0000000000..04d34fa0d8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/agg_apply/avg_const_interval.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+
diff --git a/yt/yql/tests/sql/suites/agg_apply/avg_const_interval.sql b/yt/yql/tests/sql/suites/agg_apply/avg_const_interval.sql
new file mode 100644
index 0000000000..ee9bd7870b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/agg_apply/avg_const_interval.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+/* postgres can not */
+pragma EmitAggApply;
+
+$a = select CurrentUtcDate() as _date, Just(Interval("P1W")) as parsed_lag from plato.Input;
+SELECT AVG(parsed_lag) FROM $a;
diff --git a/yt/yql/tests/sql/suites/agg_apply/default.cfg b/yt/yql/tests/sql/suites/agg_apply/default.cfg
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/agg_apply/default.cfg
diff --git a/yt/yql/tests/sql/suites/agg_apply/input.txt.attr b/yt/yql/tests/sql/suites/agg_apply/input.txt.attr
new file mode 100644
index 0000000000..84791918db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/agg_apply/input.txt.attr
@@ -0,0 +1,30 @@
+{
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "Int32"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "Int32"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "Int32"
+ ]
+ ]
+ ]
+ ]
+ };
+}
diff --git a/yt/yql/tests/sql/suites/agg_apply/table.cfg b/yt/yql/tests/sql/suites/agg_apply/table.cfg
new file mode 100644
index 0000000000..e68191f82c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/agg_apply/table.cfg
@@ -0,0 +1 @@
+in Input input.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/agg_apply/table.sql b/yt/yql/tests/sql/suites/agg_apply/table.sql
new file mode 100644
index 0000000000..e81956b605
--- /dev/null
+++ b/yt/yql/tests/sql/suites/agg_apply/table.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+pragma EmitAggApply;
+
+select count(if(key=1,cast(key as string))) from plato.Input;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/avg.sql b/yt/yql/tests/sql/suites/aggr_factory/avg.sql
new file mode 100644
index 0000000000..1352062811
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/avg.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+$f = AGGREGATION_FACTORY("avg");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select AGGREGATE_BY(distinct a,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/avg_distinct_expr.sql b/yt/yql/tests/sql/suites/aggr_factory/avg_distinct_expr.sql
new file mode 100644
index 0000000000..984c21a13f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/avg_distinct_expr.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a), AsStruct(1 as a));
+$f = AGGREGATION_FACTORY("avg");
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+
+select AGGREGATE_BY(distinct cast(Unicode::ToLower(cast(a as Utf8) || "00"u) as Int), $f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/avg_if.sql b/yt/yql/tests/sql/suites/aggr_factory/avg_if.sql
new file mode 100644
index 0000000000..7fc60b5b1c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/avg_if.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+$f = AGGREGATION_FACTORY("avg_if");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return AsTuple($z.a,$z.a<2)}))));
+
+use plato;
+insert into @a select AsTuple(a,a<2) as aa from as_table($t);
+commit;
+select AGGREGATE_BY(aa,$f) from @a;
+
+
diff --git a/yt/yql/tests/sql/suites/aggr_factory/bitand.sql b/yt/yql/tests/sql/suites/aggr_factory/bitand.sql
new file mode 100644
index 0000000000..419b6bf336
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/bitand.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1u as a),AsStruct(2u as a));
+$f = AGGREGATION_FACTORY("bitand");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select AGGREGATE_BY(distinct a,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/bitor.sql b/yt/yql/tests/sql/suites/aggr_factory/bitor.sql
new file mode 100644
index 0000000000..f9808d27c6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/bitor.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1u as a),AsStruct(2u as a));
+$f = AGGREGATION_FACTORY("bitor");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select AGGREGATE_BY(distinct a,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/bitxor.sql b/yt/yql/tests/sql/suites/aggr_factory/bitxor.sql
new file mode 100644
index 0000000000..fcb872944f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/bitxor.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1u as a),AsStruct(2u as a));
+$f = AGGREGATION_FACTORY("bitxor");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select AGGREGATE_BY(distinct a,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/booland.sql b/yt/yql/tests/sql/suites/aggr_factory/booland.sql
new file mode 100644
index 0000000000..03b483ee5d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/booland.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(true as a),AsStruct(false as a));
+$f = AGGREGATION_FACTORY("booland");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select AGGREGATE_BY(distinct a,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/boolor.sql b/yt/yql/tests/sql/suites/aggr_factory/boolor.sql
new file mode 100644
index 0000000000..c54cac9205
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/boolor.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(true as a),AsStruct(false as a));
+$f = AGGREGATION_FACTORY("boolor");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select AGGREGATE_BY(distinct a,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/bottom.sql b/yt/yql/tests/sql/suites/aggr_factory/bottom.sql
new file mode 100644
index 0000000000..f663c39d63
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/bottom.sql
@@ -0,0 +1,24 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(
+ AsStruct(7 as a),
+ AsStruct(4 as a),
+ AsStruct(5 as a),
+ AsStruct(1 as a),
+ AsStruct(2 as a),
+ AsStruct(9 as a),
+ AsStruct(1 as a),
+ AsStruct(9 as a)
+);
+
+$f = AGGREGATION_FACTORY("bottom", 3);
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"),
+ $f(ListItemType(TypeOf($t)), ($z)->{ return $z.a }))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+
+select AGGREGATE_BY(a, $f) from @a;
+select AGGREGATE_BY(distinct a, $f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/bottom_by.sql b/yt/yql/tests/sql/suites/aggr_factory/bottom_by.sql
new file mode 100644
index 0000000000..f5ee53bd8c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/bottom_by.sql
@@ -0,0 +1,21 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(
+ AsStruct(1 as key, 101 as value),
+ AsStruct(6 as key, 34 as value),
+ AsStruct(4 as key, 22 as value),
+ AsStruct(2 as key, 256 as value),
+ AsStruct(7 as key, 111 as value)
+);
+
+$f = AGGREGATION_FACTORY("bottomby", 3);
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"),
+ $f(ListItemType(TypeOf($t)), ($z)->{ return AsTuple($z.value, $z.key) }))));
+
+use plato;
+insert into @a select AsTuple(value, key) as vk from as_table($t);
+commit;
+
+select AGGREGATE_BY(vk, $f) from @a;
+
diff --git a/yt/yql/tests/sql/suites/aggr_factory/corellation.sql b/yt/yql/tests/sql/suites/aggr_factory/corellation.sql
new file mode 100644
index 0000000000..d42c5259ce
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/corellation.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+$f = AGGREGATION_FACTORY("correlation");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return AsTuple($z.a,-$z.a)}))));
+
+use plato;
+insert into @a select AsTuple(a,-a) as aa from as_table($t);
+commit;
+select AGGREGATE_BY(aa,$f) from @a;
+
diff --git a/yt/yql/tests/sql/suites/aggr_factory/count.sql b/yt/yql/tests/sql/suites/aggr_factory/count.sql
new file mode 100644
index 0000000000..3e209eb11f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/count.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+$f = AGGREGATION_FACTORY("count");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select AGGREGATE_BY(distinct a,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/count_if.sql b/yt/yql/tests/sql/suites/aggr_factory/count_if.sql
new file mode 100644
index 0000000000..a3dbd155b0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/count_if.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(true as a),AsStruct(false as a));
+$f = AGGREGATION_FACTORY("countif");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select AGGREGATE_BY(distinct a,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/default.cfg b/yt/yql/tests/sql/suites/aggr_factory/default.cfg
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/default.cfg
diff --git a/yt/yql/tests/sql/suites/aggr_factory/every.sql b/yt/yql/tests/sql/suites/aggr_factory/every.sql
new file mode 100644
index 0000000000..d44ae81d3b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/every.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(true as a),AsStruct(false as a));
+$f = AGGREGATION_FACTORY("every");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select AGGREGATE_BY(distinct a,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/histogram.sql b/yt/yql/tests/sql/suites/aggr_factory/histogram.sql
new file mode 100644
index 0000000000..1a058a8f2a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/histogram.sql
@@ -0,0 +1,17 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+$f = AGGREGATION_FACTORY("histogram");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return AsTuple($z.a,1.0)}))));
+
+$f = AGGREGATION_FACTORY("histogram", 5);
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return AsTuple($z.a,1.0)}))));
+
+use plato;
+insert into @a select AsTuple(a, 1.0) as aa from as_table($t);
+commit;
+select AGGREGATE_BY(aa,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/hll.sql b/yt/yql/tests/sql/suites/aggr_factory/hll.sql
new file mode 100644
index 0000000000..9a2c1f0716
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/hll.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+$f = AGGREGATION_FACTORY("hll");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+$f = AGGREGATION_FACTORY("hll", 4);
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select AGGREGATE_BY(distinct a,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/input.txt.attr b/yt/yql/tests/sql/suites/aggr_factory/input.txt.attr
new file mode 100644
index 0000000000..84791918db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/input.txt.attr
@@ -0,0 +1,30 @@
+{
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "Int32"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "Int32"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "Int32"
+ ]
+ ]
+ ]
+ ]
+ };
+}
diff --git a/yt/yql/tests/sql/suites/aggr_factory/linear_histogram.sql b/yt/yql/tests/sql/suites/aggr_factory/linear_histogram.sql
new file mode 100644
index 0000000000..68db6ad402
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/linear_histogram.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+$f = AGGREGATION_FACTORY("linearhistogram");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+$f = AGGREGATION_FACTORY("linearhistogram", 10, 0.0, 1000.0);
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select a as aa from as_table($t);
+commit;
+select AGGREGATE_BY(aa,$f) from @a;
+
diff --git a/yt/yql/tests/sql/suites/aggr_factory/list.cfg b/yt/yql/tests/sql/suites/aggr_factory/list.cfg
new file mode 100644
index 0000000000..5c248bff3d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/list.cfg
@@ -0,0 +1 @@
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/aggr_factory/list.sql b/yt/yql/tests/sql/suites/aggr_factory/list.sql
new file mode 100644
index 0000000000..bc43f37032
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/list.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+$f = AGGREGATION_FACTORY("aggregate_list");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+$f = AGGREGATION_FACTORY("aggregate_list", length(CAST(Unicode::ToUpper("xx"u) AS String)));
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select ListSort(AGGREGATE_BY(a,$f)) from @a;
+select ListSort(AGGREGATE_BY(distinct a,$f)) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/log_histogram.sql b/yt/yql/tests/sql/suites/aggr_factory/log_histogram.sql
new file mode 100644
index 0000000000..1b5bd50199
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/log_histogram.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+$f = AGGREGATION_FACTORY("loghistogram");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+$f = AGGREGATION_FACTORY("loghistogram", 10, 0.01, 1000.0);
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select a as aa from as_table($t);
+commit;
+select AGGREGATE_BY(aa,$f) from @a;
+
diff --git a/yt/yql/tests/sql/suites/aggr_factory/logariphmic_histogram.sql b/yt/yql/tests/sql/suites/aggr_factory/logariphmic_histogram.sql
new file mode 100644
index 0000000000..a11941be69
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/logariphmic_histogram.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+$f = AGGREGATION_FACTORY("logarithmichistogram");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+$f = AGGREGATION_FACTORY("logarithmichistogram", 10, 0.01, 1000.0);
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select a as aa from as_table($t);
+commit;
+select AGGREGATE_BY(aa,$f) from @a;
+
diff --git a/yt/yql/tests/sql/suites/aggr_factory/max.sql b/yt/yql/tests/sql/suites/aggr_factory/max.sql
new file mode 100644
index 0000000000..a0e854663c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/max.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+$f = AGGREGATION_FACTORY("max");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select AGGREGATE_BY(distinct a,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/max_by.sql b/yt/yql/tests/sql/suites/aggr_factory/max_by.sql
new file mode 100644
index 0000000000..0e7cfaf37f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/max_by.sql
@@ -0,0 +1,21 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(
+ AsStruct(1 as key, 200 as value),
+ AsStruct(2 as key, 100 as value)
+);
+
+$f = AGGREGATION_FACTORY("maxby");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"),
+ $f(ListItemType(TypeOf($t)), ($z)->{ return AsTuple($z.value, $z.key) }))));
+
+$f = AGGREGATION_FACTORY("maxby", 10);
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"),
+ $f(ListItemType(TypeOf($t)), ($z)->{ return AsTuple($z.value, $z.key) }))));
+
+use plato;
+insert into @a select AsTuple(value, key) as vk from as_table($t);
+commit;
+select AGGREGATE_BY(vk, $f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/median.sql b/yt/yql/tests/sql/suites/aggr_factory/median.sql
new file mode 100644
index 0000000000..19921bbcbd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/median.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+$f = AGGREGATION_FACTORY("median");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+$f = AGGREGATION_FACTORY("percentile", 0.9);
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select AGGREGATE_BY(distinct a,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/min.sql b/yt/yql/tests/sql/suites/aggr_factory/min.sql
new file mode 100644
index 0000000000..d101099550
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/min.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+$f = AGGREGATION_FACTORY("min");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select AGGREGATE_BY(distinct a,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/min_by.sql b/yt/yql/tests/sql/suites/aggr_factory/min_by.sql
new file mode 100644
index 0000000000..4b1d240aa0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/min_by.sql
@@ -0,0 +1,21 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(
+ AsStruct(1 as key, 200 as value),
+ AsStruct(2 as key, 100 as value)
+);
+
+$f = AGGREGATION_FACTORY("minby");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"),
+ $f(ListItemType(TypeOf($t)), ($z)->{ return AsTuple($z.value, $z.key) }))));
+
+$f = AGGREGATION_FACTORY("minby", 10);
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"),
+ $f(ListItemType(TypeOf($t)), ($z)->{ return AsTuple($z.value, $z.key) }))));
+
+use plato;
+insert into @a select AsTuple(value, key) as vk from as_table($t);
+commit;
+select AGGREGATE_BY(vk, $f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/mode.sql b/yt/yql/tests/sql/suites/aggr_factory/mode.sql
new file mode 100644
index 0000000000..496cd4e4d8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/mode.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+$f = AGGREGATION_FACTORY("mode");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+$f = AGGREGATION_FACTORY("topfreq", 10, 20);
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select ListSort(AGGREGATE_BY(distinct a,$f), ($x)->{ return $x.Value }) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/multi.cfg b/yt/yql/tests/sql/suites/aggr_factory/multi.cfg
new file mode 100644
index 0000000000..fad550d3a9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/multi.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+udf top_udf
+udf set_udf
diff --git a/yt/yql/tests/sql/suites/aggr_factory/multi.sql b/yt/yql/tests/sql/suites/aggr_factory/multi.sql
new file mode 100644
index 0000000000..e6b0638f14
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/multi.sql
@@ -0,0 +1,22 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$input = (select AsStruct(
+ key as key,
+ Just(subkey) as subkey,
+ Just(value) as value) as nums from Input);
+
+SELECT
+ MULTI_AGGREGATE_BY(nums, AGGREGATION_FACTORY("count")) as count,
+ MULTI_AGGREGATE_BY(nums, AGGREGATION_FACTORY("min")) as min,
+ MULTI_AGGREGATE_BY(nums, AGGREGATION_FACTORY("max")) as max,
+ MULTI_AGGREGATE_BY(nums, AGGREGATION_FACTORY("sum")) as sum,
+ MULTI_AGGREGATE_BY(nums, AGGREGATION_FACTORY("avg")) as avg,
+ MULTI_AGGREGATE_BY(nums, AGGREGATION_FACTORY("stddev")) as stddev,
+ MULTI_AGGREGATE_BY(nums, AGGREGATION_FACTORY("percentile", 0.5)) as p50,
+ MULTI_AGGREGATE_BY(nums, AGGREGATION_FACTORY("aggregate_list")) as agg_list,
+ MULTI_AGGREGATE_BY(nums, AGGREGATION_FACTORY("aggregate_list_distinct")) as agg_list_distinct,
+ MULTI_AGGREGATE_BY(nums, AGGREGATION_FACTORY("mode")) as mode,
+ MULTI_AGGREGATE_BY(nums, AGGREGATION_FACTORY("top", 3)) as top,
+FROM $input;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/some.sql b/yt/yql/tests/sql/suites/aggr_factory/some.sql
new file mode 100644
index 0000000000..83f5a52a29
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/some.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(1 as a));
+$f = AGGREGATION_FACTORY("some");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select AGGREGATE_BY(distinct a,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/stddev.sql b/yt/yql/tests/sql/suites/aggr_factory/stddev.sql
new file mode 100644
index 0000000000..7e46f46e5c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/stddev.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+$f = AGGREGATION_FACTORY("stddev");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select AGGREGATE_BY(distinct a,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/sum_if.sql b/yt/yql/tests/sql/suites/aggr_factory/sum_if.sql
new file mode 100644
index 0000000000..b48b38e153
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/sum_if.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+$f = AGGREGATION_FACTORY("sum_if");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return AsTuple($z.a,$z.a>1)}))));
+
+use plato;
+insert into @a select AsTuple(a,a>1) as aa from as_table($t);
+commit;
+select AGGREGATE_BY(aa,$f) from @a;
+
diff --git a/yt/yql/tests/sql/suites/aggr_factory/top.sql b/yt/yql/tests/sql/suites/aggr_factory/top.sql
new file mode 100644
index 0000000000..dd50c1351f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/top.sql
@@ -0,0 +1,23 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(
+ AsStruct(7 as a),
+ AsStruct(4 as a),
+ AsStruct(5 as a),
+ AsStruct(1 as a),
+ AsStruct(2 as a),
+ AsStruct(9 as a),
+ AsStruct(1 as a),
+ AsStruct(9 as a));
+
+$f = AGGREGATION_FACTORY("top", 3);
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"),
+ $f(ListItemType(TypeOf($t)), ($z)->{ return $z.a }))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+
+select AGGREGATE_BY(a, $f) from @a;
+select AGGREGATE_BY(distinct a, $f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/top_by.sql b/yt/yql/tests/sql/suites/aggr_factory/top_by.sql
new file mode 100644
index 0000000000..f63186dcda
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/top_by.sql
@@ -0,0 +1,21 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(
+ AsStruct(1 as key, 101 as value),
+ AsStruct(6 as key, 34 as value),
+ AsStruct(4 as key, 22 as value),
+ AsStruct(2 as key, 256 as value),
+ AsStruct(7 as key, 111 as value)
+);
+
+$f = AGGREGATION_FACTORY("topby", 3);
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"),
+ $f(ListItemType(TypeOf($t)), ($z)->{ return AsTuple($z.value, $z.key) }))));
+
+use plato;
+insert into @a select AsTuple(value, key) as vk from as_table($t);
+commit;
+
+select AGGREGATE_BY(vk, $f) from @a;
+
diff --git a/yt/yql/tests/sql/suites/aggr_factory/udaf.sql b/yt/yql/tests/sql/suites/aggr_factory/udaf.sql
new file mode 100644
index 0000000000..d419f8767f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/udaf.sql
@@ -0,0 +1,26 @@
+/* syntax version 1 */
+/* postgres can not */
+-- count example
+$create = ($_item, $_parent) -> { return 1 };
+$add = ($state, $_item, $_parent) -> { return 1 + $state };
+$merge = ($state1, $state2) -> { return $state1 + $state2 };
+$get_result = ($state) -> { return $state };
+$serialize = ($state) -> { return $state };
+$deserialize = ($state) -> { return $state };
+$default = 0;
+
+$f = AGGREGATION_FACTORY("udaf", $create, $add, $merge, $get_result, $serialize, $deserialize, $default);
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+$t = AsList(AsStruct(1/0 as a),AsStruct(2/0 as a));
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select AGGREGATE_BY(distinct a,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/udaf_distinct_expr.sql b/yt/yql/tests/sql/suites/aggr_factory/udaf_distinct_expr.sql
new file mode 100644
index 0000000000..15a4fe7c64
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/udaf_distinct_expr.sql
@@ -0,0 +1,19 @@
+/* syntax version 1 */
+/* postgres can not */
+-- count example
+$create = ($_item, $_parent) -> { return 1 };
+$add = ($state, $_item, $_parent) -> { return 1 + $state };
+$merge = ($state1, $state2) -> { return $state1 + $state2 };
+$get_result = ($state) -> { return $state };
+$serialize = ($state) -> { return $state };
+$deserialize = ($state) -> { return $state };
+$default = 0;
+
+$f = AGGREGATION_FACTORY("udaf", $create, $add, $merge, $get_result, $serialize, $deserialize, $default);
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a), AsStruct(1 as a));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+
+select AGGREGATE_BY(distinct cast(Unicode::ToLower(cast(a as Utf8) || "00"u) as Int), $f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggr_factory/variance.sql b/yt/yql/tests/sql/suites/aggr_factory/variance.sql
new file mode 100644
index 0000000000..2573bd6e66
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggr_factory/variance.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+$t = AsList(AsStruct(1 as a),AsStruct(2 as a));
+$f = AGGREGATION_FACTORY("variance");
+
+select Yql::Aggregate($t, AsTuple(), AsTuple(AsTuple(AsAtom("res"), $f(
+ ListItemType(TypeOf($t)), ($z)->{return $z.a}))));
+
+use plato;
+insert into @a select * from as_table($t);
+commit;
+select AGGREGATE_BY(a,$f) from @a;
+select AGGREGATE_BY(distinct a,$f) from @a;
diff --git a/yt/yql/tests/sql/suites/aggregate/GroupByOneField.cfg b/yt/yql/tests/sql/suites/aggregate/GroupByOneField.cfg
new file mode 100644
index 0000000000..2dc97b5e95
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/GroupByOneField.cfg
@@ -0,0 +1 @@
+in Input columns.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/GroupByOneField.sql b/yt/yql/tests/sql/suites/aggregate/GroupByOneField.sql
new file mode 100644
index 0000000000..fcb528e1e9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/GroupByOneField.sql
@@ -0,0 +1,2 @@
+/* syntax version 1 */
+select sum(c) as sumc, max(d) as maxd from plato.Input group by a order by sumc, maxd;
diff --git a/yt/yql/tests/sql/suites/aggregate/GroupByTwoFields.cfg b/yt/yql/tests/sql/suites/aggregate/GroupByTwoFields.cfg
new file mode 100644
index 0000000000..2dc97b5e95
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/GroupByTwoFields.cfg
@@ -0,0 +1 @@
+in Input columns.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/GroupByTwoFields.sql b/yt/yql/tests/sql/suites/aggregate/GroupByTwoFields.sql
new file mode 100644
index 0000000000..94ea550019
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/GroupByTwoFields.sql
@@ -0,0 +1,2 @@
+/* syntax version 1 */
+select sum(c) as sum_c, max(d) as max_d from plato.Input group by a, b order by sum_c, max_d;
diff --git a/yt/yql/tests/sql/suites/aggregate/agg_filter_pushdown.cfg b/yt/yql/tests/sql/suites/aggregate/agg_filter_pushdown.cfg
new file mode 100644
index 0000000000..73dfbac8bf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/agg_filter_pushdown.cfg
@@ -0,0 +1 @@
+in Input dedup_state_keys.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/agg_filter_pushdown.sql b/yt/yql/tests/sql/suites/aggregate/agg_filter_pushdown.sql
new file mode 100644
index 0000000000..a728c4895c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/agg_filter_pushdown.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+USE plato;
+
+select * from (
+ select key, subkey, max(value) from Input group by key, subkey
+ having count(*) < 100 and subkey > "0"
+)
+where key > "1" and Likely(subkey < "4")
+order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/aggregate/agg_phases_table1.sql b/yt/yql/tests/sql/suites/aggregate/agg_phases_table1.sql
new file mode 100644
index 0000000000..9b657bd938
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/agg_phases_table1.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+pragma EmitAggApply;
+
+pragma yt.UseAggPhases = "1";
+
+SELECT
+ key,
+ count(value)
+FROM Input
+GROUP BY key
+ORDER BY key
diff --git a/yt/yql/tests/sql/suites/aggregate/agg_phases_table2.sql b/yt/yql/tests/sql/suites/aggregate/agg_phases_table2.sql
new file mode 100644
index 0000000000..d434180941
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/agg_phases_table2.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+pragma EmitAggApply;
+
+pragma yt.UseAggPhases = "1";
+
+SELECT
+ key,
+ count(distinct value)
+FROM Input
+GROUP BY key
+ORDER BY key
diff --git a/yt/yql/tests/sql/suites/aggregate/agg_phases_table3.sql b/yt/yql/tests/sql/suites/aggregate/agg_phases_table3.sql
new file mode 100644
index 0000000000..a39958bac3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/agg_phases_table3.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+pragma EmitAggApply;
+
+pragma yt.UseAggPhases = "1";
+
+SELECT
+ key,
+ count(value),
+ count(distinct value)
+FROM Input
+GROUP BY key
+ORDER BY key
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_by_column_lookup_in_const_dict.sql b/yt/yql/tests/sql/suites/aggregate/aggregate_by_column_lookup_in_const_dict.sql
new file mode 100644
index 0000000000..e38a70598d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_by_column_lookup_in_const_dict.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+USE plato;
+
+$dict = AsDict(("800", "foo"));
+
+SELECT
+ lookup_result
+FROM Input
+GROUP BY $dict[key] ?? "bar" AS lookup_result
+ORDER BY lookup_result;
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_by_one_column.sql b/yt/yql/tests/sql/suites/aggregate/aggregate_by_one_column.sql
new file mode 100644
index 0000000000..d2127859b7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_by_one_column.sql
@@ -0,0 +1,2 @@
+/* syntax version 1 */
+select key, "WAT" as subkey, Max(value) as value from plato.Input group by key order by key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_expr.sql b/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_expr.sql
new file mode 100644
index 0000000000..46f2a248c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_expr.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+
+select
+ sum(distinct cast(Unicode::ToLower(CAST(subkey AS Utf8)) as Int32)) + sum(distinct cast(Unicode::ToUpper(CAST(subkey AS Utf8)) as Uint64)) as sks,
+ ListSort(aggregate_list(distinct key || "_")) as kl
+from Input3;
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_expr_with_groupby_expr.sql b/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_expr_with_groupby_expr.sql
new file mode 100644
index 0000000000..ffc79038d5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_expr_with_groupby_expr.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+
+select key,
+ sum(distinct cast(Unicode::ToLower(CAST(subkey AS Utf8)) as Int32)) + sum(distinct cast(Unicode::ToUpper(CAST(subkey AS Utf8)) as Uint64)) as sks,
+ aggregate_list(distinct key || "") as kl
+from Input3
+group by key || "foo" as key
+order by key;
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_expr_with_udf.cfg b/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_expr_with_udf.cfg
new file mode 100644
index 0000000000..6a677c3b7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_expr_with_udf.cfg
@@ -0,0 +1,2 @@
+in Input2 input2.txt
+udf math_udf
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_expr_with_udf.sql b/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_expr_with_udf.sql
new file mode 100644
index 0000000000..456f3a9ab8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_expr_with_udf.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+select
+ Math::Round(count(distinct Math::Round(cast(key as Int32)))/100.0, -2)
+from Input2;
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_list.sql b/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_list.sql
new file mode 100644
index 0000000000..ee6f70e39d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_list.sql
@@ -0,0 +1,38 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+insert into @foo
+select AsList(1,2) as x
+union all
+select AsList(1,3) as x
+union all
+select AsList(1,2) as x;
+
+commit;
+
+select listlength(aggregate_list(distinct x)) as c
+from @foo;
+
+select count(distinct x) as c
+from @foo;
+
+insert into @bar
+select AsList(1,2) as x,AsList(4) as y
+union all
+select AsList(1,3) as x,AsList(4) as y
+union all
+select AsList(1,3) as x,AsList(4) as y
+union all
+select AsList(1,3) as x,AsList(4) as y
+union all
+select AsList(1,2) as x,AsList(5) as y
+union all
+select AsList(1,2) as x,AsList(5) as y;
+
+commit;
+
+select x,count(distinct y) as c
+from @bar
+group by x
+order by c;
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_struct_access.sql b/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_struct_access.sql
new file mode 100644
index 0000000000..e9d312c63b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_distinct_struct_access.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$withStruct = select subkey, value, AsStruct(key as key) as s from Input3;
+
+select count(distinct s.key) as cnt from $withStruct;
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_key_column.sql b/yt/yql/tests/sql/suites/aggregate/aggregate_key_column.sql
new file mode 100644
index 0000000000..cd95e5be56
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_key_column.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+/* postgres can not */
+SELECT
+ Some(key) as some_key,
+FROM
+ plato.Input
+GROUP BY
+ key
+ORDER BY some_key;
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_list_in_key.sql b/yt/yql/tests/sql/suites/aggregate/aggregate_list_in_key.sql
new file mode 100644
index 0000000000..9aa0bd88fa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_list_in_key.sql
@@ -0,0 +1,62 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+insert into @foo
+select AsList(1,2) as x,1 as y
+union all
+select AsList(1,3) as x,2 as y
+union all
+select AsList(1,2) as x,3 as y;
+commit;
+
+select x,count(*) as c
+from @foo
+group by x
+order by c;
+
+insert into @bar
+select AsList(1,2) as x,AsList(4) as y, 1 as z
+union all
+select AsList(1,3) as x,AsList(4) as y, 2 as z
+union all
+select AsList(1,3) as x,AsList(4) as y, 3 as z
+union all
+select AsList(1,3) as x,AsList(4) as y, 4 as z
+union all
+select AsList(1,2) as x,AsList(5) as y, 5 as z
+union all
+select AsList(1,2) as x,AsList(5) as y, 6 as z;
+commit;
+
+select x,y,count(*) as c
+from @bar
+group by x, y
+order by c;
+
+select x,y,count(distinct z) as c
+from @bar
+group by x,y
+order by c;
+
+select x,y, min(z) as m, count(distinct z) as c
+from @bar
+group by x,y
+order by c;
+
+select x
+from @bar as t
+group by x
+order by t.x[1];
+
+select x,y
+from @bar as t
+group by x, y
+order by t.x[1],t.y[0];
+
+select distinct x
+from @bar as t
+order by t.x[1] desc;
+
+select distinct x,y
+from @bar as t
+order by t.x[1] desc,t.y[0] desc;
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_subquery_yql_15869.sql b/yt/yql/tests/sql/suites/aggregate/aggregate_subquery_yql_15869.sql
new file mode 100644
index 0000000000..f3fc92b09e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_subquery_yql_15869.sql
@@ -0,0 +1,7 @@
+use plato;
+
+$a = select CurrentUtcDate() as _date, Just(1.0) as parsed_lag from Input;
+
+SELECT
+ SUM(parsed_lag)
+FROM $a;
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_udf_nested.cfg b/yt/yql/tests/sql/suites/aggregate/aggregate_udf_nested.cfg
new file mode 100644
index 0000000000..060e6c9057
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_udf_nested.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+udf string_udf \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_udf_nested.sql b/yt/yql/tests/sql/suites/aggregate/aggregate_udf_nested.sql
new file mode 100644
index 0000000000..a65c584f1a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_udf_nested.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* postgres can not */
+SELECT
+ String::HexText(String::HexText(value)) as value
+FROM plato.Input4
+GROUP BY value
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_with_const_yson_options.sql b/yt/yql/tests/sql/suites/aggregate/aggregate_with_const_yson_options.sql
new file mode 100644
index 0000000000..c940ba32cd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_with_const_yson_options.sql
@@ -0,0 +1,8 @@
+USE plato;
+
+SELECT
+ key,
+ Yson::SerializeJson(Yson::From(AGGREGATE_LIST(value), Yson::Options(true AS Strict))) as value
+FROM Input
+GROUP BY key
+ORDER BY key
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_with_deep_aggregated_column.cfg b/yt/yql/tests/sql/suites/aggregate/aggregate_with_deep_aggregated_column.cfg
new file mode 100644
index 0000000000..582479bcde
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_with_deep_aggregated_column.cfg
@@ -0,0 +1 @@
+in Input input_tutorial_users.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_with_deep_aggregated_column.sql b/yt/yql/tests/sql/suites/aggregate/aggregate_with_deep_aggregated_column.sql
new file mode 100644
index 0000000000..c251ae8c4f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_with_deep_aggregated_column.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$data = (select cast(key as uint32) as age, cast(subkey as uint32) as region, value as name from Input);
+
+--insert into Output
+select
+ region,
+ max(case when age % 10u between 1u and region % 10u then age else 0u end) as max_age_at_range_intersect
+from $data
+group by region
+order by region
+;
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_with_default_yson_options.sql b/yt/yql/tests/sql/suites/aggregate/aggregate_with_default_yson_options.sql
new file mode 100644
index 0000000000..ef6a64cf42
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_with_default_yson_options.sql
@@ -0,0 +1,8 @@
+USE plato;
+
+SELECT
+ key,
+ Yson::SerializeJson(Yson::From(AGGREGATE_LIST(value))) as value
+FROM Input
+GROUP BY key
+ORDER BY key
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_with_lambda.cfg b/yt/yql/tests/sql/suites/aggregate/aggregate_with_lambda.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_with_lambda.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_with_lambda.sql b/yt/yql/tests/sql/suites/aggregate/aggregate_with_lambda.sql
new file mode 100644
index 0000000000..4a10cda985
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_with_lambda.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$empty = ($list) -> {
+ RETURN ListCreate(TypeOf($list[0]));
+};
+
+SELECT
+ $empty(AGGREGATE_LIST(key))
+FROM Input
+GROUP BY value;
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_with_lambda_inside_avg.cfg b/yt/yql/tests/sql/suites/aggregate/aggregate_with_lambda_inside_avg.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_with_lambda_inside_avg.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregate_with_lambda_inside_avg.sql b/yt/yql/tests/sql/suites/aggregate/aggregate_with_lambda_inside_avg.sql
new file mode 100644
index 0000000000..7672cec89e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregate_with_lambda_inside_avg.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$cast_to_double = ($column) -> {
+ RETURN CAST($column as Double);
+};
+$column_name = 'key';
+SELECT AVG($cast_to_double($column_name))
+FROM Input;
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregation_and_order.sql b/yt/yql/tests/sql/suites/aggregate/aggregation_and_order.sql
new file mode 100644
index 0000000000..940c38c928
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregation_and_order.sql
@@ -0,0 +1,2 @@
+/* syntax version 1 */
+select key, Min(subkey) as subkey, Max(value) as value from plato.Input group by key order by key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregation_by_udf.cfg b/yt/yql/tests/sql/suites/aggregate/aggregation_by_udf.cfg
new file mode 100644
index 0000000000..55c2f97264
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregation_by_udf.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+udf math_udf
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregation_by_udf.sql b/yt/yql/tests/sql/suites/aggregate/aggregation_by_udf.sql
new file mode 100644
index 0000000000..105378efc1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregation_by_udf.sql
@@ -0,0 +1,4 @@
+/* syntax version 1 */
+/* postgres can not */
+SELECT sum(Math::Pow(cast(subkey as double), 2))
+FROM plato.Input4;
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregation_with_named_node.cfg b/yt/yql/tests/sql/suites/aggregate/aggregation_with_named_node.cfg
new file mode 100644
index 0000000000..a8a884001d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregation_with_named_node.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+udf stat_udf
diff --git a/yt/yql/tests/sql/suites/aggregate/aggregation_with_named_node.sql b/yt/yql/tests/sql/suites/aggregate/aggregation_with_named_node.sql
new file mode 100644
index 0000000000..33757e759c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggregation_with_named_node.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+$data = (SELECT cast(key as Uint32) ?? 0 as key, value FROM plato.Input);
+
+$quant = 0.1;
+SELECT
+ $quant * 100 as quantile,
+ PERCENTILE(key, $quant) as key_q,
+ COUNT(*) as count
+FROM $data;
diff --git a/yt/yql/tests/sql/suites/aggregate/aggrs_no_grouping.cfg b/yt/yql/tests/sql/suites/aggregate/aggrs_no_grouping.cfg
new file mode 100644
index 0000000000..272cf740b2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggrs_no_grouping.cfg
@@ -0,0 +1,3 @@
+in Input input_sorted.txt
+udf stat_udf
+udf math_udf
diff --git a/yt/yql/tests/sql/suites/aggregate/aggrs_no_grouping.sql b/yt/yql/tests/sql/suites/aggregate/aggrs_no_grouping.sql
new file mode 100644
index 0000000000..b03b5283be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggrs_no_grouping.sql
@@ -0,0 +1,43 @@
+/* syntax version 1 */
+/* postgres can not */
+select
+ count(key) as keyCount,
+ count(sub) as subCount,
+ count(val) as valCount,
+ countIf(sub % 2 == 0) as evenCount,
+ countIf(sub % 2 == 1) as oddCount,
+ every(sub % 2 == 0) as every,
+ boolOr(sub % 2 == 0) as boolOr,
+ avg(key) as keyAvg,
+ avg(sub) as subAvg,
+ min(key) as keyMin,
+ min(sub) as subMin,
+ min(val) as valMin,
+ max(key) as keyMax,
+ max(sub) as subMax,
+ max(val) as valMax,
+ some(key) as keySome,
+ some(sub) as subSome,
+ some(val) as valSome,
+ bitAnd(cast(key AS Uint64)) as keyBitAnd,
+ bitOr(cast(key AS Uint64)) as keyBitOr,
+ bitXor(cast(key AS Uint64)) as keyBitXor,
+ bitAnd(cast(sub AS Uint64)) as subBitAnd,
+ bitOr(cast(sub AS Uint64)) as subBitOr,
+ bitXor(cast(sub AS Uint64)) as subBitXor,
+ median(key) as keyMedian,
+ median(sub) as subMedian,
+ stdDev(key) as keyStdDev,
+ stdDev(sub) as subStdDev,
+ stdDev(empty) as emptyStdDev,
+ variance(key) as keyVariance,
+ variance(sub) as subVariance,
+ stdDevPop(key) as keyPopStdDev,
+ stdDevPop(sub) as subPopStdDev,
+ varPop(key) as keyPopVariance,
+ varPop(sub) as subPopVariance,
+ correlation(key, sub) AS corr,
+ covariance(key, sub) AS covar,
+ covarpop(key, sub) AS covarpop
+from
+ (select cast(key as int) as key, Unwrap(cast(subkey as int)) as sub, value as val, cast(value AS int) AS empty from plato.Input);
diff --git a/yt/yql/tests/sql/suites/aggregate/aggrs_no_grouping_via_map.sql b/yt/yql/tests/sql/suites/aggregate/aggrs_no_grouping_via_map.sql
new file mode 100644
index 0000000000..cb1105b769
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggrs_no_grouping_via_map.sql
@@ -0,0 +1,44 @@
+/* syntax version 1 */
+/* postgres can not */
+pragma yt.PartitionByConstantKeysViaMap;
+select
+ count(key) as keyCount,
+ count(sub) as subCount,
+ count(val) as valCount,
+ countIf(sub % 2 == 0) as evenCount,
+ countIf(sub % 2 == 1) as oddCount,
+ every(sub % 2 == 0) as every,
+ boolOr(sub % 2 == 0) as boolOr,
+ avg(key) as keyAvg,
+ avg(sub) as subAvg,
+ min(key) as keyMin,
+ min(sub) as subMin,
+ min(val) as valMin,
+ max(key) as keyMax,
+ max(sub) as subMax,
+ max(val) as valMax,
+ some(key) as keySome,
+ some(sub) as subSome,
+ some(val) as valSome,
+ bitAnd(cast(key AS Uint64)) as keyBitAnd,
+ bitOr(cast(key AS Uint64)) as keyBitOr,
+ bitXor(cast(key AS Uint64)) as keyBitXor,
+ bitAnd(cast(sub AS Uint64)) as subBitAnd,
+ bitOr(cast(sub AS Uint64)) as subBitOr,
+ bitXor(cast(sub AS Uint64)) as subBitXor,
+ median(key) as keyMedian,
+ median(sub) as subMedian,
+ stdDev(key) as keyStdDev,
+ stdDev(sub) as subStdDev,
+ stdDev(empty) as emptyStdDev,
+ variance(key) as keyVariance,
+ variance(sub) as subVariance,
+ stdDevPop(key) as keyPopStdDev,
+ stdDevPop(sub) as subPopStdDev,
+ varPop(key) as keyPopVariance,
+ varPop(sub) as subPopVariance,
+ correlation(key, sub) AS corr,
+ covariance(key, sub) AS covar,
+ covarpop(key, sub) AS covarpop
+from
+ (select cast(key as int) as key, Unwrap(cast(subkey as int)) as sub, value as val, cast(value AS int) AS empty from plato.Input);
diff --git a/yt/yql/tests/sql/suites/aggregate/aggrs_no_grouping_via_map_compact.sql b/yt/yql/tests/sql/suites/aggregate/aggrs_no_grouping_via_map_compact.sql
new file mode 100644
index 0000000000..acb0e79e4e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/aggrs_no_grouping_via_map_compact.sql
@@ -0,0 +1,45 @@
+/* syntax version 1 */
+/* postgres can not */
+pragma yt.PartitionByConstantKeysViaMap;
+select
+ count(key) as keyCount,
+ count(sub) as subCount,
+ count(val) as valCount,
+ countIf(sub % 2 == 0) as evenCount,
+ countIf(sub % 2 == 1) as oddCount,
+ every(sub % 2 == 0) as every,
+ boolOr(sub % 2 == 0) as boolOr,
+ avg(key) as keyAvg,
+ avg(sub) as subAvg,
+ min(key) as keyMin,
+ min(sub) as subMin,
+ min(val) as valMin,
+ max(key) as keyMax,
+ max(sub) as subMax,
+ max(val) as valMax,
+ some(key) as keySome,
+ some(sub) as subSome,
+ some(val) as valSome,
+ bitAnd(cast(key AS Uint64)) as keyBitAnd,
+ bitOr(cast(key AS Uint64)) as keyBitOr,
+ bitXor(cast(key AS Uint64)) as keyBitXor,
+ bitAnd(cast(sub AS Uint64)) as subBitAnd,
+ bitOr(cast(sub AS Uint64)) as subBitOr,
+ bitXor(cast(sub AS Uint64)) as subBitXor,
+ median(key) as keyMedian,
+ median(sub) as subMedian,
+ stdDev(key) as keyStdDev,
+ stdDev(sub) as subStdDev,
+ stdDev(empty) as emptyStdDev,
+ variance(key) as keyVariance,
+ variance(sub) as subVariance,
+ stdDevPop(key) as keyPopStdDev,
+ stdDevPop(sub) as subPopStdDev,
+ varPop(key) as keyPopVariance,
+ varPop(sub) as subPopVariance,
+ correlation(key, sub) AS corr,
+ covariance(key, sub) AS covar,
+ covarpop(key, sub) AS covarpop
+from
+ (select cast(key as int) as key, Unwrap(cast(subkey as int)) as sub, value as val, cast(value AS int) AS empty from plato.Input)
+group compact by ();
diff --git a/yt/yql/tests/sql/suites/aggregate/avg_and_sum.sql b/yt/yql/tests/sql/suites/aggregate/avg_and_sum.sql
new file mode 100644
index 0000000000..cdbf1dd58b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/avg_and_sum.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+select
+ avg(cast(key as int)) as key,
+ cast(sum(cast(subkey as int)) as varchar) as subkey,
+ min(value) as value
+from plato.Input;
diff --git a/yt/yql/tests/sql/suites/aggregate/avg_and_sum_by_value.cfg b/yt/yql/tests/sql/suites/aggregate/avg_and_sum_by_value.cfg
new file mode 100644
index 0000000000..8153a1f3e5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/avg_and_sum_by_value.cfg
@@ -0,0 +1 @@
+in Input avg_and_sum_by_value.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/avg_and_sum_by_value.sql b/yt/yql/tests/sql/suites/aggregate/avg_and_sum_by_value.sql
new file mode 100644
index 0000000000..c8a43bc533
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/avg_and_sum_by_value.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+select
+ avg(cast(key as int)) + 0.3 as key,
+ cast(sum(cast(subkey as int)) as varchar) as subkey,
+ value
+from plato.Input
+group by value
+order by value;
diff --git a/yt/yql/tests/sql/suites/aggregate/avg_and_sum_float.cfg b/yt/yql/tests/sql/suites/aggregate/avg_and_sum_float.cfg
new file mode 100644
index 0000000000..812be3893b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/avg_and_sum_float.cfg
@@ -0,0 +1 @@
+in Input input4.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/avg_and_sum_float.sql b/yt/yql/tests/sql/suites/aggregate/avg_and_sum_float.sql
new file mode 100644
index 0000000000..dc2a4d3157
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/avg_and_sum_float.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+select
+ key,
+ avg(cast(subkey as Float)) as avg,
+ sum(cast(subkey as Float)) as sum,
+from plato.Input
+group by key
+order by key;
diff --git a/yt/yql/tests/sql/suites/aggregate/avg_interval.sql b/yt/yql/tests/sql/suites/aggregate/avg_interval.sql
new file mode 100644
index 0000000000..dadd2fdd61
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/avg_interval.sql
@@ -0,0 +1,2 @@
+/* syntax version 1 */
+discard select EnsureType(avg(cast(key As Interval)), Interval?) from plato.Input;
diff --git a/yt/yql/tests/sql/suites/aggregate/avg_with_having.sql b/yt/yql/tests/sql/suites/aggregate/avg_with_having.sql
new file mode 100644
index 0000000000..f48f0dcfc1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/avg_with_having.sql
@@ -0,0 +1,2 @@
+/* syntax version 1 */
+select value, avg(cast(key as int)) + 0.3 as key from plato.Input group by value having value > "foo" order by key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/columns.txt.attr b/yt/yql/tests/sql/suites/aggregate/columns.txt.attr
new file mode 100644
index 0000000000..70da6cab1d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/columns.txt.attr
@@ -0,0 +1,3 @@
+{
+ "_read_schema"=[{"type"="string";"name"="a"};{"type"="uint64";"name"="b"};{"type"="int64";"name"="c"};{"type"="int64";"name"="d"}]
+}
diff --git a/yt/yql/tests/sql/suites/aggregate/compact_distinct.cfg b/yt/yql/tests/sql/suites/aggregate/compact_distinct.cfg
new file mode 100644
index 0000000000..711689a5cb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/compact_distinct.cfg
@@ -0,0 +1,3 @@
+providers yt
+in InputB input2.txt
+in InputC input3.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/compact_distinct.sql b/yt/yql/tests/sql/suites/aggregate/compact_distinct.sql
new file mode 100644
index 0000000000..4176ad60aa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/compact_distinct.sql
@@ -0,0 +1,14 @@
+USE plato;
+
+pragma AnsiOptionalAs;
+pragma yt.CompactForDistinct;
+
+$x = (
+ SELECT key, AVG(DISTINCT Cast(subkey as float)) s FROM InputB GROUP BY key
+);
+
+$y = (
+ SELECT key, SUM(Cast(subkey as float)) s FROM InputC GROUP BY key
+);
+
+SELECT x.key, x.s AS s1, y.s AS s2 FROM $x x FULL OUTER JOIN $y y ON x.key = y.key;
diff --git a/yt/yql/tests/sql/suites/aggregate/compare_by.cfg b/yt/yql/tests/sql/suites/aggregate/compare_by.cfg
new file mode 100644
index 0000000000..612a5060aa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/compare_by.cfg
@@ -0,0 +1 @@
+in Input input_sorted.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/compare_by.sql b/yt/yql/tests/sql/suites/aggregate/compare_by.sql
new file mode 100644
index 0000000000..f5c13b5348
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/compare_by.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+select
+ min_by(sub, key)as min,
+ max_by(value, sub) as max,
+ min_by(key, length(sub), 2) as min_list,
+ min_by(empty, length(sub), 2) as empty_result,
+ max_by(key, empty, 2) as empty_by
+from
+ (select cast(key as int) as key,
+ Unwrap(cast(subkey as int)) as sub, value as value,
+ cast(value AS int) AS empty from plato.Input); \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/compare_by_nulls.sql b/yt/yql/tests/sql/suites/aggregate/compare_by_nulls.sql
new file mode 100644
index 0000000000..7f48154923
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/compare_by_nulls.sql
@@ -0,0 +1,19 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$src = select null as key, value from Input;
+$src_opt = select null as key, Just(value) as value from Input;
+$src_null = select null as key, null as value from Input;
+
+
+select min_by(value, key) from $src;
+select max_by(value, key) from $src_opt;
+select min_by(value, key) from $src_null;
+
+select max_by(value, key) from (select * from $src limit 0);
+select min_by(value, key) from (select * from $src_opt limit 0);
+select max_by(value, key) from (select * from $src_null limit 0);
+
+
+select min_by(value, key) from (select Nothing(String?) as key, value from Input);
diff --git a/yt/yql/tests/sql/suites/aggregate/compare_by_tuple.cfg b/yt/yql/tests/sql/suites/aggregate/compare_by_tuple.cfg
new file mode 100644
index 0000000000..d13818b046
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/compare_by_tuple.cfg
@@ -0,0 +1 @@
+in Input input_compare.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/compare_by_tuple.sql b/yt/yql/tests/sql/suites/aggregate/compare_by_tuple.sql
new file mode 100644
index 0000000000..efe9622f19
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/compare_by_tuple.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+select
+ key,
+ min_by(AsTuple(subkey, value), AsTuple(subkey, value)) as min,
+ max_by(AsTuple(subkey, value), AsTuple(subkey, value)) as max
+from (
+ select
+ key,
+ (case when length(subkey) != 0 then subkey else null end) as subkey,
+ (case when length(value) != 0 then value else null end) as value
+ from plato.Input
+) group by key
diff --git a/yt/yql/tests/sql/suites/aggregate/compare_tuple.cfg b/yt/yql/tests/sql/suites/aggregate/compare_tuple.cfg
new file mode 100644
index 0000000000..d13818b046
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/compare_tuple.cfg
@@ -0,0 +1 @@
+in Input input_compare.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/compare_tuple.sql b/yt/yql/tests/sql/suites/aggregate/compare_tuple.sql
new file mode 100644
index 0000000000..ca1b69e071
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/compare_tuple.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+select
+ key,
+ min(AsTuple(subkey, value)) as min,
+ max(AsTuple(subkey, value)) as max
+from (
+ select
+ key,
+ (case when length(subkey) != 0 then subkey else null end) as subkey,
+ (case when length(value) != 0 then value else null end) as value
+ from plato.Input
+) group by key
+order by key
diff --git a/yt/yql/tests/sql/suites/aggregate/count_distinct_with_filter.cfg b/yt/yql/tests/sql/suites/aggregate/count_distinct_with_filter.cfg
new file mode 100644
index 0000000000..be223abe99
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/count_distinct_with_filter.cfg
@@ -0,0 +1,2 @@
+in Input5 input5.txt
+
diff --git a/yt/yql/tests/sql/suites/aggregate/count_distinct_with_filter.sql b/yt/yql/tests/sql/suites/aggregate/count_distinct_with_filter.sql
new file mode 100644
index 0000000000..c17ac1c3b9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/count_distinct_with_filter.sql
@@ -0,0 +1,4 @@
+SELECT count (distinct value) AS Count
+FROM plato.Input5
+WHERE `key` = '150';
+
diff --git a/yt/yql/tests/sql/suites/aggregate/dedup_state_keys.cfg b/yt/yql/tests/sql/suites/aggregate/dedup_state_keys.cfg
new file mode 100644
index 0000000000..0b877ec216
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/dedup_state_keys.cfg
@@ -0,0 +1 @@
+in Input dedup_state_keys.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/dedup_state_keys.sql b/yt/yql/tests/sql/suites/aggregate/dedup_state_keys.sql
new file mode 100644
index 0000000000..9adbc0dad1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/dedup_state_keys.sql
@@ -0,0 +1,10 @@
+USE plato;
+SELECT
+ key,
+ value,
+ count(*) AS c
+FROM Input
+GROUP BY
+ key,
+ value
+ORDER BY c, key, value;
diff --git a/yt/yql/tests/sql/suites/aggregate/dedup_state_keys.txt.attr b/yt/yql/tests/sql/suites/aggregate/dedup_state_keys.txt.attr
new file mode 100644
index 0000000000..fc8a038324
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/dedup_state_keys.txt.attr
@@ -0,0 +1,11 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"Uint64"]]
+ ]];
+ "SortDirections"=[1;1;];
+ "SortedBy"=["key";"subkey";];
+ "SortedByTypes"=[["DataType";"String";];["DataType";"String";];];
+ "SortMembers"=["key";"subkey";];
+}}
diff --git a/yt/yql/tests/sql/suites/aggregate/default.cfg b/yt/yql/tests/sql/suites/aggregate/default.cfg
new file mode 100644
index 0000000000..389a8e8f21
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/default.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/descending.txt.attr b/yt/yql/tests/sql/suites/aggregate/descending.txt.attr
new file mode 100644
index 0000000000..7024a9fc9c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/descending.txt.attr
@@ -0,0 +1,21 @@
+{
+ "schema"=<
+ "strict" = %true;
+ "unique_keys" = %false
+ >[
+ {
+ "name" = "key";
+ "type" = "string";
+ "sort_order" = "descending";
+ };
+ {
+ "name" = "subkey";
+ "type" = "string";
+ "sort_order" = "descending";
+ };
+ {
+ "name" = "value";
+ "type" = "string";
+ };
+ ]
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/disable_blocks_with_spilling.cfg b/yt/yql/tests/sql/suites/aggregate/disable_blocks_with_spilling.cfg
new file mode 100644
index 0000000000..bb375970b4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/disable_blocks_with_spilling.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+
+providers dq
+pragma dq.SpillingEngine="file";
+pragma dq.EnableSpillingNodes="Aggregation";
diff --git a/yt/yql/tests/sql/suites/aggregate/disable_blocks_with_spilling.sql b/yt/yql/tests/sql/suites/aggregate/disable_blocks_with_spilling.sql
new file mode 100644
index 0000000000..0d8671bf0b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/disable_blocks_with_spilling.sql
@@ -0,0 +1,2 @@
+pragma BlockEngine='force';
+select count(key) from plato.Input group by key;
diff --git a/yt/yql/tests/sql/suites/aggregate/ensure_count.sql b/yt/yql/tests/sql/suites/aggregate/ensure_count.sql
new file mode 100644
index 0000000000..373ce7aa8b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/ensure_count.sql
@@ -0,0 +1 @@
+select Ensure(COUNT(*), COUNT(*) > 3U, "WTF?") from plato.Input;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_column.sql b/yt/yql/tests/sql/suites/aggregate/group_by_column.sql
new file mode 100644
index 0000000000..b6490dbe58
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_column.sql
@@ -0,0 +1,4 @@
+/* syntax version 1 */
+/* postgres can not */
+-- order to have same on yt and yamr
+select count(1),z from plato.Input group by key as z order by z;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_column_alias_reuse.sql b/yt/yql/tests/sql/suites/aggregate/group_by_column_alias_reuse.sql
new file mode 100644
index 0000000000..a5c8707341
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_column_alias_reuse.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+--INSERT INTO Output
+SELECT
+ a.key as kk,
+-- key as kkk,
+ aggregate_list(subkey)
+FROM plato.Input4 as a
+GROUP BY a.key as kk
+ORDER BY kk;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_column_alias_reuse_for_join.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_column_alias_reuse_for_join.cfg
new file mode 100644
index 0000000000..a1f7a5a9b7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_column_alias_reuse_for_join.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_column_alias_reuse_for_join.sql b/yt/yql/tests/sql/suites/aggregate/group_by_column_alias_reuse_for_join.sql
new file mode 100644
index 0000000000..e04f898efe
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_column_alias_reuse_for_join.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+--INSERT INTO Output
+SELECT
+ a.key as kk,
+-- kk,
+ aggregate_list(b.subkey)
+FROM plato.Input as a
+JOIN plato.Input4 as b
+ON a.subkey == b.key
+GROUP BY a.key as kk
+ORDER BY kk;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_cube_duo.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_cube_duo.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_cube_duo.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_cube_duo.sql b/yt/yql/tests/sql/suites/aggregate/group_by_cube_duo.sql
new file mode 100644
index 0000000000..6b5384cba8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_cube_duo.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+select sum(length(value)), key, subkey from plato.Input group by cube(key,subkey) order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_cube_expr_trio.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_cube_expr_trio.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_cube_expr_trio.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_cube_expr_trio.sql b/yt/yql/tests/sql/suites/aggregate/group_by_cube_expr_trio.sql
new file mode 100644
index 0000000000..771fa9a2dc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_cube_expr_trio.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+/* postgres can not */
+pragma sampleselect;
+
+select sum(length(value)) as s, m0, m1, m2
+from plato.Input
+group by rollup(cast(key as uint32) as m0, cast(key as uint32) % 10u as m1, cast(key as uint32) % 100u as m2)
+order by s, m0, m1, m2;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_cube_grouping.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_cube_grouping.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_cube_grouping.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_cube_grouping.sql b/yt/yql/tests/sql/suites/aggregate/group_by_cube_grouping.sql
new file mode 100644
index 0000000000..eed0fd11fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_cube_grouping.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+/* postgres can not */
+select sum(length(value)) as s, m0, m1, m2, 2u * (2u * grouping(m0) + grouping(m1)) + grouping(m2) as ggg3
+from plato.Input
+group by cube(cast(key as uint32) as m0, cast(key as uint32) % 10u as m1, cast(key as uint32) % 100u as m2)
+order by s, m0, m1, m2;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_cube_grouping_and_expr.sql b/yt/yql/tests/sql/suites/aggregate/group_by_cube_grouping_and_expr.sql
new file mode 100644
index 0000000000..290d87b25b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_cube_grouping_and_expr.sql
@@ -0,0 +1,20 @@
+/* syntax version 1 */
+/* postgres can not */
+SELECT
+ key,
+ subkey,
+ value,
+ 2u * (2u * grouping(key) + grouping(subkey)) + grouping(value) as ggg3,
+FROM
+ (
+ SELECT
+ subkey,
+ value,
+ cast(key as Int32) as opt,
+ FROM
+ plato.Input
+ )
+GROUP BY
+ Unwrap(opt) AS key,
+ CUBE(subkey, value)
+ORDER BY key, subkey, value;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_cube_join_count.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_cube_join_count.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_cube_join_count.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_cube_join_count.sql b/yt/yql/tests/sql/suites/aggregate/group_by_cube_join_count.sql
new file mode 100644
index 0000000000..5f849d2be0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_cube_join_count.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+pragma sampleselect;
+select kk, sk, grouping(kk, sk),count(1) FROM plato.Input AS t1 INNER JOIN plato.Input AS t2 USING (key)
+GROUP BY CUBE(t1.key as kk, t1.subkey as sk) ORDER BY kk, sk;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_expr.cfg
new file mode 100644
index 0000000000..c7e99df4d3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr.cfg
@@ -0,0 +1 @@
+in Input input_expr.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr.sql b/yt/yql/tests/sql/suites/aggregate/group_by_expr.sql
new file mode 100644
index 0000000000..8a65d11bb7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+select sum(cast(subkey as uint32)) as s from plato.Input group by cast(key as uint32) % 10 order by s;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_alias_on_subexp.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_expr_alias_on_subexp.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_alias_on_subexp.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_alias_on_subexp.sql b/yt/yql/tests/sql/suites/aggregate/group_by_expr_alias_on_subexp.sql
new file mode 100644
index 0000000000..aa6a7a6c28
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_alias_on_subexp.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+--INSERT INTO Output
+SELECT
+ key, sk, aggregate_list(value) as values
+FROM
+ (SELECT * FROM Input)
+GROUP BY key, cast(subkey as uint32) % 2 as sk
+ORDER BY key, sk;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_and_having.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_expr_and_having.cfg
new file mode 100644
index 0000000000..c7e99df4d3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_and_having.cfg
@@ -0,0 +1 @@
+in Input input_expr.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_and_having.sql b/yt/yql/tests/sql/suites/aggregate/group_by_expr_and_having.sql
new file mode 100644
index 0000000000..41407e9244
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_and_having.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+select count(*) as count, mod_sk from plato.Input as a group by cast(subkey as uint32) % 10 as mod_sk, cast(key as uint32) % 10 as mod_k having mod_k == 7;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_columns_reuse.sql b/yt/yql/tests/sql/suites/aggregate/group_by_expr_columns_reuse.sql
new file mode 100644
index 0000000000..5932fe83e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_columns_reuse.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+--INSERT INTO Output
+SELECT
+ key, count(1) as count
+FROM Input
+GROUP BY cast(key as uint32) % 10 as key
+ORDER BY key, count;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_dict.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_expr_dict.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_dict.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_dict.sql b/yt/yql/tests/sql/suites/aggregate/group_by_expr_dict.sql
new file mode 100644
index 0000000000..b7bc07e73c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_dict.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+$data_dict = (select mod, Just(YQL::ToIndexDict(ListSort(aggregate_list(key)))) as dk, ListSort(aggregate_list(subkey)) as ls, ListSort(aggregate_list(value)) as lv from plato.Input group by cast(subkey as uint32) % 10 as mod);
+
+select * from $data_dict as t group by t.dk[0] as gk order by gk;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_lookup.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_expr_lookup.cfg
new file mode 100644
index 0000000000..4ce1b28a20
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_lookup.cfg
@@ -0,0 +1 @@
+in Input input_dict.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_lookup.sql b/yt/yql/tests/sql/suites/aggregate/group_by_expr_lookup.sql
new file mode 100644
index 0000000000..e7171c7bea
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_lookup.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+select count(*) as s from plato.Input group by `dict`["a"] order by s;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_mul_col.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_expr_mul_col.cfg
new file mode 100644
index 0000000000..c7e99df4d3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_mul_col.cfg
@@ -0,0 +1 @@
+in Input input_expr.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_mul_col.sql b/yt/yql/tests/sql/suites/aggregate/group_by_expr_mul_col.sql
new file mode 100644
index 0000000000..113245c1cd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_mul_col.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+/* postgres can not */
+select count(*) as count, mod_sk + mod_k as mod_sum
+from plato.Input as a
+group by cast(subkey as uint32) % 10 as mod_sk, cast(key as uint32) % 10 as mod_k
+order by count, mod_sum; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_only_join.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_expr_only_join.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_only_join.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_only_join.sql b/yt/yql/tests/sql/suites/aggregate/group_by_expr_only_join.sql
new file mode 100644
index 0000000000..6c3ac3a6cc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_only_join.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+select aggregate_list(a.k), aval from (select cast(subkey as uint32) as k, value as val from plato.Input) as a left only join (select cast(key as uint32) as k, cast(subkey as uint32) as s from plato.Input) as b using(k) group by a.val as aval;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_order_by_expr.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_expr_order_by_expr.cfg
new file mode 100644
index 0000000000..c7e99df4d3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_order_by_expr.cfg
@@ -0,0 +1 @@
+in Input input_expr.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_order_by_expr.sql b/yt/yql/tests/sql/suites/aggregate/group_by_expr_order_by_expr.sql
new file mode 100644
index 0000000000..ddf5bf9a45
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_order_by_expr.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+select sum(cast(key as uint32)) as keysum from plato.Input group by cast(key as uint32) / 100 + cast(subkey as uint32) % 10 order by keysum desc;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_semi_join.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_expr_semi_join.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_semi_join.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_semi_join.sql b/yt/yql/tests/sql/suites/aggregate/group_by_expr_semi_join.sql
new file mode 100644
index 0000000000..b212c02136
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_semi_join.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+/* postgres can not */
+select ListSort(aggregate_list(b.uk)), ListSort(aggregate_list(b.uk)), bus
+from
+ (select cast(key as uint32) as uk from plato.Input) as a
+right semi join
+ (select cast(key as uint32) as uk, cast(subkey as uint32) as us from plato.Input) as b
+ using(uk) group by b.us as bus
+order by bus;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_with_join.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_expr_with_join.cfg
new file mode 100644
index 0000000000..bf1b560b58
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_with_join.cfg
@@ -0,0 +1 @@
+in Input input_intersect_sorted.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_with_join.sql b/yt/yql/tests/sql/suites/aggregate/group_by_expr_with_join.sql
new file mode 100644
index 0000000000..f078552fb2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_with_join.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+
+pragma sampleselect;
+select kk, ListSort(aggregate_list(t2.key)) FROM plato.Input AS t1 INNER JOIN plato.Input AS t2 ON t1.key==t2.subkey GROUP BY t1.key as kk ORDER by kk;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_expr_with_where.sql b/yt/yql/tests/sql/suites/aggregate/group_by_expr_with_where.sql
new file mode 100644
index 0000000000..255b003850
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_expr_with_where.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+SELECT ki, count(1) FROM plato.Input WHERE ki IN (75, 20) GROUP BY Cast(key as Uint32) as ki ORDER BY ki;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_full_path.sql b/yt/yql/tests/sql/suites/aggregate/group_by_full_path.sql
new file mode 100644
index 0000000000..a52f5d447b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_full_path.sql
@@ -0,0 +1,2 @@
+/* syntax version 1 */
+SELECT a.value FROM plato.Input as a GROUP BY a.value ORDER BY a.value;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_alt_duo.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_gs_alt_duo.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_alt_duo.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_alt_duo.sql b/yt/yql/tests/sql/suites/aggregate/group_by_gs_alt_duo.sql
new file mode 100644
index 0000000000..766cb37e6b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_alt_duo.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+select sum(length(value)), key, subkey from plato.Input group by grouping sets (key), grouping sets (subkey) order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_and_having.sql b/yt/yql/tests/sql/suites/aggregate/group_by_gs_and_having.sql
new file mode 100644
index 0000000000..633656ab7c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_and_having.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+--INSERT INTO Output
+SELECT
+ Sum(Cast(subkey as Uint32)) as sumLen,
+ key,
+ value,
+ Grouping(key, value) as grouping
+FROM Input3
+GROUP BY GROUPING SETS ((key),(value))
+HAVING count(*) > 2
+ORDER BY key, value
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_duo.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_gs_duo.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_duo.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_duo.sql b/yt/yql/tests/sql/suites/aggregate/group_by_gs_duo.sql
new file mode 100644
index 0000000000..5510785d8c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_duo.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+select sum(length(value)), key, subkey from plato.Input group by grouping sets ((key),(subkey)) order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_few_empty.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_gs_few_empty.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_few_empty.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_few_empty.sql b/yt/yql/tests/sql/suites/aggregate/group_by_gs_few_empty.sql
new file mode 100644
index 0000000000..494ebb8c4e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_few_empty.sql
@@ -0,0 +1,4 @@
+/* syntax version 1 */
+/* postgres can not */
+select count(1), key, subkey, value, grouping(key, subkey, value) from plato.Input group by grouping sets ((), value, rollup(key, subkey), ())
+order by key, subkey, value;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_flatten.sql b/yt/yql/tests/sql/suites/aggregate/group_by_gs_flatten.sql
new file mode 100644
index 0000000000..0ee762b985
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_flatten.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$input = select a.*, [1,2] as lst from Input as a;
+
+select key, subkey, some(lst) as lst_count
+from $input flatten list by lst
+where lst != 1
+group by grouping sets ((key), (key, subkey))
+order by key, subkey;
+
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_flatten_columns.sql b/yt/yql/tests/sql/suites/aggregate/group_by_gs_flatten_columns.sql
new file mode 100644
index 0000000000..e7c274191e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_flatten_columns.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$input = select a.*, <|k1:1, k2:2|> as s from Input as a;
+
+select key, subkey, some(k1) as k1, some(k2) as k2
+from $input flatten columns
+group by grouping sets ((key), (key, subkey))
+order by key, subkey;
+
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_flatten_expr.sql b/yt/yql/tests/sql/suites/aggregate/group_by_gs_flatten_expr.sql
new file mode 100644
index 0000000000..8b1e77e544
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_flatten_expr.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$input = select a.*, [1,2] as lst from Input as a;
+
+select key, subkey, count(lst) as lst_count
+from $input flatten list by (ListExtend(lst, [3,4]) as lst)
+where lst != 2
+group by grouping sets ((key), (key, subkey))
+order by key, subkey;
+
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_grouping.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_gs_grouping.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_grouping.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_grouping.sql b/yt/yql/tests/sql/suites/aggregate/group_by_gs_grouping.sql
new file mode 100644
index 0000000000..a6f003d445
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_grouping.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+select count(1), key_first, val_first, grouping(key_first, val_first) as group
+from plato.Input group by grouping sets (cast(key as uint32) / 100u as key_first, Substring(value, 1, 1) as val_first)
+order by key_first, val_first;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_join_aliases.sql b/yt/yql/tests/sql/suites/aggregate/group_by_gs_join_aliases.sql
new file mode 100644
index 0000000000..598ae44056
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_join_aliases.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT k1, k2, b.subkey as kk2, SOME(a.value) as val
+FROM plato.Input AS a JOIN plato.Input AS b USING(key)
+GROUP BY GROUPING SETS(
+ (a.key as k1, b.subkey as k2),
+ (k1),
+ (b.subkey)
+)
+ORDER BY k1, kk2;
+
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_simp.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_gs_simp.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_simp.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_simp.sql b/yt/yql/tests/sql/suites/aggregate/group_by_gs_simp.sql
new file mode 100644
index 0000000000..09c48d836b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_simp.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+select sum(length(value)), key, subkey, grouping(key, subkey) from plato.Input group by grouping sets ((key, subkey), key, subkey) order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_subselect.sql b/yt/yql/tests/sql/suites/aggregate/group_by_gs_subselect.sql
new file mode 100644
index 0000000000..8b28224ab5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_subselect.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$sub = (SELECT
+ Sum(Cast(subkey as Uint32)) as sumLen,
+ key,
+ value,
+ Grouping(key, value) as grouping
+FROM Input
+GROUP BY GROUPING SETS ((key),(value))
+);
+
+--INSERT INTO Output
+SELECT t.sumLen, t.key, t.value, t.grouping FROM $sub as t
+ORDER BY t.key, t.value \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_subselect_asterisk.sql b/yt/yql/tests/sql/suites/aggregate/group_by_gs_subselect_asterisk.sql
new file mode 100644
index 0000000000..6966339274
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_subselect_asterisk.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$sub = (SELECT * FROM Input LIMIT 5);
+
+--INSERT INTO Output
+SELECT
+ Sum(Cast(subkey as Uint32)) as sumLen,
+ key,
+ value,
+ Grouping(key, value) as grouping
+FROM $sub
+GROUP BY GROUPING SETS ((key),(value))
+ORDER BY key, value
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_with_rollup.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_gs_with_rollup.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_with_rollup.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_gs_with_rollup.sql b/yt/yql/tests/sql/suites/aggregate/group_by_gs_with_rollup.sql
new file mode 100644
index 0000000000..ebbdbf828c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_gs_with_rollup.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+--insert into Output
+select
+ key, subkey, count(1) as total_count, value, grouping(key, subkey, value) as group_mask
+from Input
+group by grouping sets (value, rollup(key, subkey))
+order by group_mask, value, key, subkey, total_count;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_hop.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop.sql b/yt/yql/tests/sql/suites/aggregate/group_by_hop.sql
new file mode 100644
index 0000000000..334bf2cb83
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+/* ytfile can not */
+/* yt can not */
+
+PRAGMA dq.AnalyticsHopping="true";
+
+SELECT
+ user,
+ HOP_START() as ts,
+ SUM(payload) as payload
+FROM plato.Input
+GROUP BY HOP(DateTime::FromSeconds(CAST(ts as Uint32)), "PT10S", "PT10S", "PT10S"), user;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_compact.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_hop_compact.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_compact.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_compact.sql b/yt/yql/tests/sql/suites/aggregate/group_by_hop_compact.sql
new file mode 100644
index 0000000000..a85dfcf6b5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_compact.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+/* ytfile can not */
+/* yt can not */
+
+PRAGMA dq.AnalyticsHopping="true";
+
+SELECT
+ user,
+ HOP_START() as ts,
+ SUM(payload) as payload
+FROM plato.Input
+GROUP COMPACT BY HOP(DateTime::FromSeconds(CAST(ts as Uint32)), "PT10S", "PT10S", "PT10S"), user;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_distinct.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_hop_distinct.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_distinct.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_distinct.sql b/yt/yql/tests/sql/suites/aggregate/group_by_hop_distinct.sql
new file mode 100644
index 0000000000..d9aed1fac9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_distinct.sql
@@ -0,0 +1,17 @@
+/* Test is broken for now */
+
+/* syntax version 1 */
+/* postgres can not */
+/* ytfile can not */
+/* yt can not */
+/* dq can not */
+/* dqfile can not */
+
+PRAGMA dq.AnalyticsHopping="true";
+
+SELECT
+ user,
+ HOP_START() as ts,
+ SUM(DISTINCT payload) as payload
+FROM plato.Input
+GROUP BY HOP(DateTime::FromSeconds(CAST(ts as Uint32)), "PT10S", "PT10S", "PT10S"), user;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_distinct_compact.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_hop_distinct_compact.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_distinct_compact.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_distinct_compact.sql b/yt/yql/tests/sql/suites/aggregate/group_by_hop_distinct_compact.sql
new file mode 100644
index 0000000000..0b44ceabea
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_distinct_compact.sql
@@ -0,0 +1,17 @@
+/* Test is broken for now */
+
+/* syntax version 1 */
+/* postgres can not */
+/* ytfile can not */
+/* yt can not */
+/* dq can not */
+/* dqfile can not */
+
+PRAGMA dq.AnalyticsHopping="true";
+
+SELECT
+ user,
+ HOP_START() as ts,
+ SUM(DISTINCT payload) as payload
+FROM plato.Input
+GROUP COMPACT BY HOP(DateTime::FromSeconds(CAST(ts as Uint32)), "PT10S", "PT10S", "PT10S"), user;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_expr_key.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_hop_expr_key.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_expr_key.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_expr_key.sql b/yt/yql/tests/sql/suites/aggregate/group_by_hop_expr_key.sql
new file mode 100644
index 0000000000..cb3326e825
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_expr_key.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+/* ytfile can not */
+/* yt can not */
+
+PRAGMA dq.AnalyticsHopping="true";
+
+SELECT
+ user,
+ HOP_START() as ts,
+ SUM(payload) as payload
+FROM plato.Input
+GROUP COMPACT BY HOP(DateTime::FromSeconds(CAST(ts as Uint32)), "PT10S", "PT10S", "PT10S"), user, substring(user, 1, 1);
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_list_key.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_hop_list_key.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_list_key.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_list_key.sql b/yt/yql/tests/sql/suites/aggregate/group_by_hop_list_key.sql
new file mode 100644
index 0000000000..77369585c9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_list_key.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+/* ytfile can not */
+/* yt can not */
+
+PRAGMA dq.AnalyticsHopping="true";
+
+SELECT
+ user,
+ HOP_START() as ts,
+ SUM(payload) as payload
+FROM plato.Input
+GROUP COMPACT BY HOP(DateTime::FromSeconds(CAST(ts as Uint32)), "PT10S", "PT10S", "PT10S"), user, AsList(user, "1");
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_only.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_hop_only.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_only.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_only.sql b/yt/yql/tests/sql/suites/aggregate/group_by_hop_only.sql
new file mode 100644
index 0000000000..302e8aa1a5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_only.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+/* ytfile can not */
+/* yt can not */
+
+PRAGMA dq.AnalyticsHopping="true";
+
+SELECT
+ HOP_START() as ts,
+ SUM(payload) as payload
+FROM plato.Input
+GROUP BY HOP(DateTime::FromSeconds(CAST(ts as Uint32)), "PT10S", "PT10S", "PT10S");
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_only_distinct.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_hop_only_distinct.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_only_distinct.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_only_distinct.sql b/yt/yql/tests/sql/suites/aggregate/group_by_hop_only_distinct.sql
new file mode 100644
index 0000000000..1ab7dc5b75
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_only_distinct.sql
@@ -0,0 +1,16 @@
+/* Test is broken for now */
+
+/* syntax version 1 */
+/* postgres can not */
+/* ytfile can not */
+/* yt can not */
+/* dq can not */
+/* dqfile can not */
+
+PRAGMA dq.AnalyticsHopping="true";
+
+SELECT
+ HOP_START() as ts,
+ SUM(DISTINCT payload) as payload
+FROM plato.Input
+GROUP BY HOP(DateTime::FromSeconds(CAST(ts as Uint32)), "PT10S", "PT10S", "PT10S");
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_only_start.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_hop_only_start.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_only_start.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_only_start.sql b/yt/yql/tests/sql/suites/aggregate/group_by_hop_only_start.sql
new file mode 100644
index 0000000000..963df3855c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_only_start.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+/* ytfile can not */
+/* yt can not */
+
+PRAGMA dq.AnalyticsHopping="true";
+
+SELECT
+ HOP_START()
+FROM plato.Input
+GROUP BY HOP(DateTime::FromSeconds(CAST(ts as Uint32)), "PT10S", "PT10S", "PT10S");
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_star.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_hop_star.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_star.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_star.sql b/yt/yql/tests/sql/suites/aggregate/group_by_hop_star.sql
new file mode 100644
index 0000000000..75fbea9671
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_star.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+/* ytfile can not */
+/* yt can not */
+
+PRAGMA dq.AnalyticsHopping="true";
+
+SELECT *
+FROM plato.Input
+GROUP BY HOP(DateTime::FromSeconds(CAST(ts as Uint32)), "PT10S", "PT10S", "PT10S"), user;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_static.sql b/yt/yql/tests/sql/suites/aggregate/group_by_hop_static.sql
new file mode 100644
index 0000000000..fec507c827
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_static.sql
@@ -0,0 +1,26 @@
+/* syntax version 1 */
+/* postgres can not */
+/* ytfile can not */
+/* yt can not */
+
+$input = SELECT * FROM AS_TABLE([
+ <|"time":"2024-01-01T00:00:01Z", "user": 1|>,
+ <|"time":"2024-01-01T00:00:02Z", "user": 1|>,
+ <|"time":"2024-01-01T00:00:03Z", "user": 1|>,
+ <|"time":"2024-01-01T00:00:01Z", "user": 2|>,
+ <|"time":"2024-01-01T00:00:02Z", "user": 2|>,
+ <|"time":"2024-01-01T00:00:03Z", "user": 2|>,
+ <|"time":"2024-01-01T00:00:01Z", "user": 2|>,
+ <|"time":"2024-01-01T00:00:02Z", "user": 2|>,
+ <|"time":"2024-01-01T00:00:03Z", "user": 2|>,
+ <|"time":"2024-01-01T00:00:01Z", "user": 3|>,
+ <|"time":"2024-01-01T00:00:02Z", "user": 3|>,
+ <|"time":"2024-01-01T00:00:03Z", "user": 3|>
+]);
+
+SELECT
+ user,
+ COUNT(*) as count,
+ HOP_START() as start,
+FROM $input
+GROUP BY HOP(CAST(time as Timestamp), 'PT1S', 'PT1S', 'PT1S'), user;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_hop_static_list_key.sql b/yt/yql/tests/sql/suites/aggregate/group_by_hop_static_list_key.sql
new file mode 100644
index 0000000000..3639207bb3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_hop_static_list_key.sql
@@ -0,0 +1,26 @@
+/* syntax version 1 */
+/* postgres can not */
+/* ytfile can not */
+/* yt can not */
+
+$input = SELECT * FROM AS_TABLE([
+ <|"time":"2024-01-01T00:00:01Z", "user": 1|>,
+ <|"time":"2024-01-01T00:00:02Z", "user": 1|>,
+ <|"time":"2024-01-01T00:00:03Z", "user": 1|>,
+ <|"time":"2024-01-01T00:00:01Z", "user": 2|>,
+ <|"time":"2024-01-01T00:00:02Z", "user": 2|>,
+ <|"time":"2024-01-01T00:00:03Z", "user": 2|>,
+ <|"time":"2024-01-01T00:00:01Z", "user": 2|>,
+ <|"time":"2024-01-01T00:00:02Z", "user": 2|>,
+ <|"time":"2024-01-01T00:00:03Z", "user": 2|>,
+ <|"time":"2024-01-01T00:00:01Z", "user": 3|>,
+ <|"time":"2024-01-01T00:00:02Z", "user": 3|>,
+ <|"time":"2024-01-01T00:00:03Z", "user": 3|>
+]);
+
+SELECT
+ user,
+ COUNT(*) as count,
+ HOP_START() as start,
+FROM $input
+GROUP BY HOP(CAST(time as Timestamp), 'PT1S', 'PT1S', 'PT1S'), user, AsList(user, 0);
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_mul_gb_ru.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_mul_gb_ru.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_mul_gb_ru.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_mul_gb_ru.sql b/yt/yql/tests/sql/suites/aggregate/group_by_mul_gb_ru.sql
new file mode 100644
index 0000000000..63492a2fa7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_mul_gb_ru.sql
@@ -0,0 +1,4 @@
+/* syntax version 1 */
+/* postgres can not */
+select sum(length(value)), vf, kf, kl, grouping(vf, kf, kl) as ggg3 from plato.Input group by Substring(value, 0, 1) as vf, cube(cast(key as uint32) % 10u as kl, cast(key as uint32) / 100u as kf)
+order by vf, kf, kl;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_expr_and_column.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_expr_and_column.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_expr_and_column.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_expr_and_column.sql b/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_expr_and_column.sql
new file mode 100644
index 0000000000..df6dc769ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_expr_and_column.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+--insert into Output
+select
+ count(1) as count, kf, key, vf, vl, grouping(kf, key, vf, vl) as grouping
+from Input group by grouping sets(
+ (cast(key as uint32) / 100u as kf, key),
+ (Substring(value, 0, 1) as vf, Substring(value, 2, 1) as vl)
+)
+order by kf, key, vf, vl;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_gs.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_gs.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_gs.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_gs.sql b/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_gs.sql
new file mode 100644
index 0000000000..0cefa50a9a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_gs.sql
@@ -0,0 +1,4 @@
+/* syntax version 1 */
+/* postgres can not */
+select count(1), kf, kl, vf, vl, grouping(kf, kl, vf, vl) from plato.Input group by grouping sets(cast(key as uint32) / 100u as kf, cast(key as uint32) % 10u as kl), grouping sets(Substring(value, 0, 1) as vf, Substring(value, 2, 1) as vl)
+order by kf, kl, vf, vl;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_ru.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_ru.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_ru.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_ru.sql b/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_ru.sql
new file mode 100644
index 0000000000..e325b93fff
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_mul_gs_ru.sql
@@ -0,0 +1,4 @@
+/* syntax version 1 */
+/* postgres can not */
+select count(1), kf, kl, vf, vl, grouping(kf, kl, vf, vl) as gggg from plato.Input group by grouping sets((cast(key as uint32) / 100u as kf, cast(key as uint32) % 10u as kl)), rollup(Substring(value, 0, 1) as vf, Substring(value, 2, 1) as vl)
+order by kf, kl, vf, vl;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_mul_ru_ru.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_mul_ru_ru.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_mul_ru_ru.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_mul_ru_ru.sql b/yt/yql/tests/sql/suites/aggregate/group_by_mul_ru_ru.sql
new file mode 100644
index 0000000000..569539f114
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_mul_ru_ru.sql
@@ -0,0 +1,4 @@
+/* syntax version 1 */
+/* postgres can not */
+select count(1), kf, kl, vf, vl, grouping(kf, kl, vf, vl) from plato.Input group by rollup(cast(key as uint32) / 100u as kf, cast(key as uint32) % 10u as kl), rollup(Substring(value, 0, 1) as vf, Substring(value, 2, 1) as vl)
+order by kf, kl, vf, vl;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_aggr_expr.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_aggr_expr.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_aggr_expr.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_aggr_expr.sql b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_aggr_expr.sql
new file mode 100644
index 0000000000..59a59d1aef
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_aggr_expr.sql
@@ -0,0 +1,17 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$input = (select key, subkey, substring(value, 0, 1) == substring(value, 2, 1) as value_from_a from Input);
+
+--insert into Output
+select
+ key,
+ subkey,
+ count_if(value_from_a) as approved,
+ cast(count_if(value_from_a) as double) / count(*) as approved_share,
+ count(*) as total
+from $input
+group by rollup(key, subkey)
+order by key, subkey
+;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_ref.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_ref.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_ref.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_ref.sql b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_ref.sql
new file mode 100644
index 0000000000..ee10388e6b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_ref.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$input=(select cast(key as int32) ?? 0 as kk, cast(subkey as int32) ?? 0 as sk, value from Input);
+
+--insert into Output
+select
+ kk, sk, count(*) as total_count
+from $input
+where sk in (23, 37, 75, 150, )
+group by rollup(kk, sk)
+order by kk, sk, total_count
+;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_ref_same_names.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_ref_same_names.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_ref_same_names.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_ref_same_names.sql b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_ref_same_names.sql
new file mode 100644
index 0000000000..f03bd9a437
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_ref_same_names.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$input=(select cast(key as uint32) ?? 0 as key, cast(subkey as int32) ?? 0 as subkey, value from Input);
+
+--insert into Output
+select
+ key, subkey, count(*) as total_count
+from $input
+where subkey in (23, 37, 75,150)
+group by rollup(key, subkey)
+order by key, subkey, total_count
+;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_reuse.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_reuse.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_reuse.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_reuse.sql b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_reuse.sql
new file mode 100644
index 0000000000..07a46979c6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_column_reuse.sql
@@ -0,0 +1,17 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$input=(select cast(key as uint32) ?? 0 as key, cast(subkey as int32) ?? 0 as subkey, value from Input);
+
+$request = (
+ select
+ key, subkey, count(*) as total_count
+ from $input
+ where subkey in (23, 37, 75,150)
+ group by rollup(key, subkey)
+);
+
+--insert into Output
+select key, subkey, total_count from $request
+order by key, subkey, total_count;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_duo.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_duo.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_duo.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_duo.sql b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_duo.sql
new file mode 100644
index 0000000000..93e586766e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_duo.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+select sum(length(value)), key, subkey from plato.Input group by rollup(key,subkey) order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_duo_opt.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_duo_opt.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_duo_opt.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_duo_opt.sql b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_duo_opt.sql
new file mode 100644
index 0000000000..4a58b473f7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_duo_opt.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+select count(1), k, subkey from plato.Input group by rollup(cast(key as uint32) as k, subkey) order by k, subkey;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping.sql b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping.sql
new file mode 100644
index 0000000000..48bae25392
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+/* postgres can not */
+select sum(length(value)) as s, m0, m1, m2, grouping(m0, m1, m2) as ggg
+from plato.Input
+group by rollup(cast(key as uint32) as m0, cast(key as uint32) % 10u as m1, cast(key as uint32) % 100u as m2)
+order by s, m0, m1, m2;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping_hum.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping_hum.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping_hum.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping_hum.sql b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping_hum.sql
new file mode 100644
index 0000000000..f92cad03fa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping_hum.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+select count(1) as elements, key_first, val_first, case grouping(key_first, val_first)
+ when 1 then 'Total By First digit key'
+ when 2 then 'Total By First char value'
+ when 3 then 'Grand Total'
+ else 'Group'
+end as group
+from plato.Input group by cube(cast(key as uint32) / 100u as key_first, Substring(value, 1, 1) as val_first)
+order by elements, key_first, val_first;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping_hum_bind.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping_hum_bind.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping_hum_bind.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping_hum_bind.sql b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping_hum_bind.sql
new file mode 100644
index 0000000000..1432eaa2a6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_grouping_hum_bind.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+$hum_gr_kv = ($grouping) -> {
+ return case $grouping
+ when 1 then 'Total By First digit key'
+ when 2 then 'Total By First char value'
+ when 3 then 'Grand Total'
+ else 'Group'
+ end;
+};
+
+select count(1) as elements, key_first, val_first, $hum_gr_kv(grouping(key_first, val_first)) as group
+from plato.Input group by cube(cast(key as uint32) / 100u as key_first, Substring(value, 1, 1) as val_first)
+order by elements, key_first, val_first;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_key_check.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_key_check.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_key_check.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_key_check.sql b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_key_check.sql
new file mode 100644
index 0000000000..385b50c5d9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_key_check.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+--INSERT INTO Output
+SELECT
+ key, prefix,
+ COUNT(*) AS cnt,
+ grouping(key, prefix) as agrouping
+FROM Input
+GROUP BY ROLLUP (key as key, Substring(value, 1, 1) as prefix)
+ORDER BY key, prefix;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_udf.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_udf.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_udf.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_udf.sql b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_udf.sql
new file mode 100644
index 0000000000..ee546d63e7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_udf.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+select key, subkey, Unicode::ToUpper(CAST(value AS Utf8)) as value, count(1) as cnt from Input GROUP BY ROLLUP(key,subkey, value) ORDER BY key,subkey,value,cnt;
+
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_with_filter.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_with_filter.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_with_filter.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_rollup_with_filter.sql b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_with_filter.sql
new file mode 100644
index 0000000000..cb1e3c2def
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_rollup_with_filter.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+--insert into Output
+select
+ key, subkey, count(*) as total_count
+from plato.Input
+where key in ('023', '037')
+group by rollup(key, subkey)
+order by key, subkey
+;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_ru_join.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_ru_join.sql b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join.sql
new file mode 100644
index 0000000000..7ef6caf16a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+
+pragma sampleselect;
+select * FROM plato.Input AS t1 INNER JOIN plato.Input AS t2 USING (key) GROUP BY ROLLUP(t1.key as kk, t1.subkey as sk) ORDER BY kk, sk;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_agg.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_agg.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_agg.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_agg.sql b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_agg.sql
new file mode 100644
index 0000000000..7c65ec4383
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_agg.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+
+pragma sampleselect;
+select kk, sk, sum(cast(t2.subkey as Uint32)) FROM plato.Input AS t1 INNER JOIN plato.Input AS t2 USING (key) GROUP BY ROLLUP(t1.key as kk, t1.subkey as sk) ORDER BY kk, sk;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_grouping.sql b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_grouping.sql
new file mode 100644
index 0000000000..c5e431a9ee
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_grouping.sql
@@ -0,0 +1,14 @@
+USE plato;
+
+$t = select distinct key from Input;
+
+select
+ key, subkey,
+ max(value) as max_val,
+ grouping(a.key, a.subkey) as g_ks,
+ grouping(a.subkey, a.key) as g_sk,
+ grouping(a.key) as g_k,
+ grouping(a.subkey) as g_s,
+from Input as a
+join $t as b on a.key = b.key
+group by rollup(a.key, a.subkey);
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_qualified.sql b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_qualified.sql
new file mode 100644
index 0000000000..b782e754f0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_qualified.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ k,
+ b.subkey as sk,
+ MIN(a.value) as val,
+ GROUPING(k, b.subkey) as g,
+FROM plato.Input AS a JOIN plato.Input AS b USING(key)
+GROUP BY ROLLUP (a.key as k, b.subkey)
+ORDER BY g, k, sk
+;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_simple.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_simple.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_simple.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_simple.sql b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_simple.sql
new file mode 100644
index 0000000000..f232af79be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_simple.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+
+pragma sampleselect;
+select kk, sk, max(t2.subkey) as ss FROM plato.Input AS t1 INNER JOIN plato.Input AS t2 USING (key) GROUP BY ROLLUP(t1.key as kk, t1.subkey as sk) ORDER BY kk, sk;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_simple_fs_multiusage.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_simple_fs_multiusage.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_simple_fs_multiusage.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_simple_fs_multiusage.sql b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_simple_fs_multiusage.sql
new file mode 100644
index 0000000000..1932c58252
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_simple_fs_multiusage.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+/* postgres can not */
+
+pragma sampleselect;
+pragma config.flags("OptimizerFlags", "FieldSubsetEnableMultiusage");
+select kk, sk, max(t2.subkey) as ss FROM plato.Input AS t1 INNER JOIN plato.Input AS t2 USING (key) GROUP BY ROLLUP(t1.key as kk, t1.subkey as sk) ORDER BY kk, sk;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_star.sql b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_star.sql
new file mode 100644
index 0000000000..230c974712
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_ru_join_star.sql
@@ -0,0 +1,4 @@
+/* syntax version 1 */
+/* postgres can not */
+
+select * FROM plato.Input AS t1 INNER JOIN plato.Input AS t2 USING (key) GROUP BY ROLLUP(t1.key as kk, t1.subkey) ORDER BY kk, subkey;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_ru_partition_by_grouping.sql b/yt/yql/tests/sql/suites/aggregate/group_by_ru_partition_by_grouping.sql
new file mode 100644
index 0000000000..e9d35dde11
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_ru_partition_by_grouping.sql
@@ -0,0 +1,13 @@
+use plato;
+
+select
+ key,
+ subkey,
+ min(value) as mv,
+ grouping(key) + grouping(subkey) as gsum,
+ rank() over (
+ partition by grouping(key) + grouping(subkey)
+ order by key, subkey, min(value)
+ ) as rk,
+from Input
+group by rollup(key, subkey);
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_ru_with_select_distinct.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_ru_with_select_distinct.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_ru_with_select_distinct.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_ru_with_select_distinct.sql b/yt/yql/tests/sql/suites/aggregate/group_by_ru_with_select_distinct.sql
new file mode 100644
index 0000000000..30971d58aa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_ru_with_select_distinct.sql
@@ -0,0 +1,4 @@
+use plato;
+
+select distinct key from Input group by rollup(key, subkey) order by key;
+
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_ru_with_window_func.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_ru_with_window_func.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_ru_with_window_func.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_ru_with_window_func.sql b/yt/yql/tests/sql/suites/aggregate/group_by_ru_with_window_func.sql
new file mode 100644
index 0000000000..1a5bbafc85
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_ru_with_window_func.sql
@@ -0,0 +1,3 @@
+use plato;
+
+select row_number() over (order by key) as rn, key from Input group by rollup(key, subkey) order by rn;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_session.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session.sql b/yt/yql/tests/sql/suites/aggregate/group_by_session.sql
new file mode 100644
index 0000000000..5faa7d4e14
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ user,
+ MIN(ts) ?? 100500 as session_start,
+ ListSort(AGGREGATE_LIST(ts ?? 100500)) as session,
+ COUNT(1) as session_len
+FROM plato.Input
+GROUP BY SessionWindow(ts, 10), user
+ORDER BY user, session_start;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_aliases.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_session_aliases.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_aliases.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_aliases.sql b/yt/yql/tests/sql/suites/aggregate/group_by_session_aliases.sql
new file mode 100644
index 0000000000..ef71f18e70
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_aliases.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ user,
+ session_start,
+ SessionStart() as session_start1,
+ SessionStart() ?? 100500 as session_start2,
+ ListSort(AGGREGATE_LIST(ts ?? 100500)) as session,
+ COUNT(1) as session_len
+FROM plato.Input
+GROUP BY SessionWindow(ts, 10) as session_start, user
+ORDER BY user, session_start;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_compact.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_session_compact.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_compact.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_compact.sql b/yt/yql/tests/sql/suites/aggregate/group_by_session_compact.sql
new file mode 100644
index 0000000000..1cbffd58bd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_compact.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ user,
+ MIN(ts) ?? 100500 as session_start,
+ ListSort(AGGREGATE_LIST(ts ?? 100500)) as session,
+ COUNT(1) as session_len
+FROM plato.Input
+GROUP COMPACT BY user, SessionWindow(ts, 10)
+ORDER BY user, session_start;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_distinct.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_session_distinct.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_distinct.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_distinct.sql b/yt/yql/tests/sql/suites/aggregate/group_by_session_distinct.sql
new file mode 100644
index 0000000000..9a6e3c848b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_distinct.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ user,
+ MIN(ts) ?? 100500 as session_start,
+ ListSort(AGGREGATE_LIST(ts ?? 100500)) as session,
+ COUNT(1) as session_len,
+ COUNT(DISTINCT payload) as distinct_playloads
+FROM plato.Input
+GROUP BY SessionWindow(ts, 10), user
+ORDER BY user, session_start;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_distinct_compact.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_session_distinct_compact.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_distinct_compact.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_distinct_compact.sql b/yt/yql/tests/sql/suites/aggregate/group_by_session_distinct_compact.sql
new file mode 100644
index 0000000000..ba4607de17
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_distinct_compact.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ user,
+ MIN(ts) ?? 100500 as session_start,
+ ListSort(AGGREGATE_LIST(ts ?? 100500)) as session,
+ COUNT(1) as session_len,
+ COUNT(DISTINCT payload) as distinct_playloads
+FROM plato.Input
+GROUP COMPACT BY user, SessionWindow(ts, 10)
+ORDER BY user, session_start;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_extended.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_session_extended.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_extended.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_extended.sql b/yt/yql/tests/sql/suites/aggregate/group_by_session_extended.sql
new file mode 100644
index 0000000000..1b9af1d0d8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_extended.sql
@@ -0,0 +1,21 @@
+/* syntax version 1 */
+/* postgres can not */
+
+$init = ($row) -> (AsStruct($row.ts ?? 0 as value, 1 as count));
+
+$calculate = ($_row, $state) -> ($state.value);
+-- split partition into two-element grooups, make session key to be cumulative sum of ts from partition start
+$update = ($row, $state) -> {
+ $state = AsStruct($state.count + 1 as count, $state.value as value);
+ $state = AsStruct($state.count as count, $state.value + ($row.ts ?? 0) as value);
+ return AsTuple(Unwrap($state.count % 2) == 1, $state);
+};
+
+SELECT
+ user,
+ SessionStart() as session_start,
+ ListSort(AGGREGATE_LIST(ts ?? 100500)) as session,
+ COUNT(1) as session_len
+FROM plato.Input
+GROUP BY SessionWindow(ts, $init, $update, $calculate), user
+ORDER BY user, session_start;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_extended_subset.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_session_extended_subset.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_extended_subset.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_extended_subset.sql b/yt/yql/tests/sql/suites/aggregate/group_by_session_extended_subset.sql
new file mode 100644
index 0000000000..55d34f5e27
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_extended_subset.sql
@@ -0,0 +1,20 @@
+/* syntax version 1 */
+/* postgres can not */
+
+$init = ($row) -> (AsStruct($row.ts ?? 0 as value, 1 as count));
+
+$calculate = ($_row, $state) -> ($state.value);
+-- split partition into two-element grooups, make session key to be cumulative sum of ts from partition start
+$update = ($row, $state) -> {
+ $state = AsStruct($state.count + 1 as count, $state.value as value);
+ $state = AsStruct($state.count as count, $state.value + ($row.ts ?? 0) as value);
+ return AsTuple(Unwrap($state.count % 2) == 1, $state);
+};
+
+$src = SELECT t.*, (ts ?? 0, payload) as sort_col FROM plato.Input as t;
+
+SELECT
+ COUNT(1) as session_len,
+FROM $src
+GROUP BY user, SessionWindow(sort_col, $init, $update, $calculate)
+ORDER BY session_len;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_nopush.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_session_nopush.cfg
new file mode 100644
index 0000000000..9e0b837318
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_nopush.cfg
@@ -0,0 +1,2 @@
+in Input session1.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_nopush.sql b/yt/yql/tests/sql/suites/aggregate/group_by_session_nopush.sql
new file mode 100644
index 0000000000..fd8e46a071
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_nopush.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+/* yt can not */
+
+SELECT * FROM (
+ SELECT
+ user,
+ cast(session_start as Int64) as ss,
+ ListSort(AGGREGATE_LIST(ts)) as session,
+ COUNT(1) as session_len
+ FROM plato.Input
+ GROUP BY SessionWindow(ts, 10) as session_start, user
+)
+WHERE ss != 100500; -- should not push down
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_only.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_session_only.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_only.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_only.sql b/yt/yql/tests/sql/suites/aggregate/group_by_session_only.sql
new file mode 100644
index 0000000000..f63a3f25b2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_only.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ MIN(ts) ?? 100500 as session_start,
+FROM plato.Input
+GROUP BY SessionWindow(ts, 9)
+ORDER BY session_start
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_only_distinct.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_session_only_distinct.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_only_distinct.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_only_distinct.sql b/yt/yql/tests/sql/suites/aggregate/group_by_session_only_distinct.sql
new file mode 100644
index 0000000000..512b6f386f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_only_distinct.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ MIN(DISTINCT ts) ?? 100500 as session_start,
+FROM plato.Input
+GROUP BY SessionWindow(ts, 10)
+ORDER BY session_start
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_star.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_session_star.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_star.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_session_star.sql b/yt/yql/tests/sql/suites/aggregate/group_by_session_star.sql
new file mode 100644
index 0000000000..b8d2dcd7b2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_session_star.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+
+PRAGMA OrderedColumns;
+
+SELECT *
+FROM plato.Input
+GROUP BY user, SessionWindow(ts, 10) as session_start
+ORDER BY user, session_start;
+
+SELECT *
+FROM plato.Input
+GROUP BY user, SessionWindow(ts, 10)
+ORDER BY user, group0;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_tablerow_column.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_tablerow_column.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_tablerow_column.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_tablerow_column.sql b/yt/yql/tests/sql/suites/aggregate/group_by_tablerow_column.sql
new file mode 100644
index 0000000000..a3fc042006
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_tablerow_column.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+select *
+from Input
+group by TableRow().key as k
+order by k;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_tz_date.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_tz_date.cfg
new file mode 100644
index 0000000000..be223abe99
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_tz_date.cfg
@@ -0,0 +1,2 @@
+in Input5 input5.txt
+
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_tz_date.sql b/yt/yql/tests/sql/suites/aggregate/group_by_tz_date.sql
new file mode 100644
index 0000000000..603c7ea45e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_tz_date.sql
@@ -0,0 +1,3 @@
+SELECT SUM(CAST(subkey AS Uint8)) AS sum
+FROM plato.Input5
+GROUP BY CAST(CAST(key AS Uint16) AS TzDate);
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_with_udf_by_aggregate.cfg b/yt/yql/tests/sql/suites/aggregate/group_by_with_udf_by_aggregate.cfg
new file mode 100644
index 0000000000..efcd9cfaeb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_with_udf_by_aggregate.cfg
@@ -0,0 +1,3 @@
+in Input input_expr.txt
+udf python2_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_with_udf_by_aggregate.sql b/yt/yql/tests/sql/suites/aggregate/group_by_with_udf_by_aggregate.sql
new file mode 100644
index 0000000000..0ae44d64c5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_with_udf_by_aggregate.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+$majority_vote = Python::majority_vote(
+ Callable<(List<String?>)->String>,
+ @@
+def majority_vote(values):
+ counters = {}
+ for value in values:
+ counters[value] = counters.get(value, 0) + 1
+ return sorted((count, value) for value, count in counters.items())[-1][1]
+ @@
+);
+
+select count(*), val, $majority_vote(aggregate_list(subkey)) from plato.Input group by cast(key as uint32) % 2 as val;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_by_with_where.sql b/yt/yql/tests/sql/suites/aggregate/group_by_with_where.sql
new file mode 100644
index 0000000000..f6ec83308c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_by_with_where.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+SELECT ki, count(1) FROM plato.Input WHERE ki IN ('075', '150') GROUP BY key as ki ORDER BY ki;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_compact_sorted.cfg b/yt/yql/tests/sql/suites/aggregate/group_compact_sorted.cfg
new file mode 100644
index 0000000000..5b8e8ea74d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_compact_sorted.cfg
@@ -0,0 +1 @@
+in Input sorted.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_compact_sorted.sql b/yt/yql/tests/sql/suites/aggregate/group_compact_sorted.sql
new file mode 100644
index 0000000000..496b6c1d76
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_compact_sorted.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+SELECT
+ key, count(value) as cnt, min(value) as min, max(value) as max
+FROM Input
+GROUP COMPACT BY key
+ORDER BY key;
+
diff --git a/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_distinct.cfg b/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_distinct.cfg
new file mode 100644
index 0000000000..64197c4f2e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_distinct.cfg
@@ -0,0 +1,2 @@
+in Input sorted.txt
+udf set_udf
diff --git a/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_distinct.sql b/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_distinct.sql
new file mode 100644
index 0000000000..a29fcd4419
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_distinct.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+SELECT
+ key,count(distinct value) as cnt,
+ ListSort(aggregate_list(distinct value)) as lst,
+ min(value) as min, max(value) as max
+FROM Input
+GROUP COMPACT BY key
+ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_distinct_complex.cfg b/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_distinct_complex.cfg
new file mode 100644
index 0000000000..64197c4f2e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_distinct_complex.cfg
@@ -0,0 +1,2 @@
+in Input sorted.txt
+udf set_udf
diff --git a/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_distinct_complex.sql b/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_distinct_complex.sql
new file mode 100644
index 0000000000..74d23fe2df
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_distinct_complex.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+SELECT
+ key,count(distinct value) as cnt,
+ ListSort(ListMap(
+ aggregate_list(distinct value),($x)->{ return DictItems($x) })) as lst
+FROM (SELECT key, AsDict(AsTuple(1, value)) as value from Input)
+GROUP COMPACT BY key
+ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_with_diff_order.cfg b/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_with_diff_order.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_with_diff_order.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_with_diff_order.sql b/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_with_diff_order.sql
new file mode 100644
index 0000000000..f131544139
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/group_compact_sorted_with_diff_order.sql
@@ -0,0 +1,38 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+insert into @ksv
+select * from Input order by key, subkey, value;
+
+insert into @vsk
+select * from Input order by value, subkey, key;
+
+insert into @vs
+select * from Input order by value, subkey;
+
+commit;
+
+select key, subkey, value from @ksv -- YtReduce
+group compact by key, subkey, value
+order by key, subkey, value;
+
+select key, subkey, value from @vsk -- YtReduce
+group /*+ compact() */ by key, subkey, value
+order by key, subkey, value;
+
+select key, subkey, some(value) as value from @ksv -- YtReduce
+group compact by key, subkey
+order by key, subkey, value;
+
+select key, subkey, some(value) as value from @vsk -- YtMapReduce
+group compact by key, subkey
+order by key, subkey, value;
+
+select key, subkey, value from concat(@ksv, @vsk) -- YtMapReduce
+group compact by key, subkey, value
+order by key, subkey, value;
+
+select some(key) as key, subkey, value from concat(@vs, @vsk) -- YtReduce
+group compact by subkey, value
+order by key, subkey, value;
diff --git a/yt/yql/tests/sql/suites/aggregate/having_cast.sql b/yt/yql/tests/sql/suites/aggregate/having_cast.sql
new file mode 100644
index 0000000000..15965428c9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/having_cast.sql
@@ -0,0 +1 @@
+select value from plato.Input group by value having avg(cast(key as int)) > 100 order by value;
diff --git a/yt/yql/tests/sql/suites/aggregate/having_distinct_expr.cfg b/yt/yql/tests/sql/suites/aggregate/having_distinct_expr.cfg
new file mode 100644
index 0000000000..e377e2a9ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/having_distinct_expr.cfg
@@ -0,0 +1 @@
+in Input3 input3.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/having_distinct_expr.sql b/yt/yql/tests/sql/suites/aggregate/having_distinct_expr.sql
new file mode 100644
index 0000000000..66ec18d2c8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/having_distinct_expr.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+use plato;
+select key from Input3 group by key having count(distinct subkey || subkey) > 1;
diff --git a/yt/yql/tests/sql/suites/aggregate/histogram_cdf.sql b/yt/yql/tests/sql/suites/aggregate/histogram_cdf.sql
new file mode 100644
index 0000000000..3708106e4b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/histogram_cdf.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+USE plato;
+
+SELECT
+ histogram_cdf(CAST(key AS double)) AS key,
+ adaptive_ward_histogram_cdf(CAST(subkey AS double)) AS subkey
+FROM Input4;
diff --git a/yt/yql/tests/sql/suites/aggregate/input5.txt.attr b/yt/yql/tests/sql/suites/aggregate/input5.txt.attr
new file mode 100644
index 0000000000..f0b397616f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/input5.txt.attr
@@ -0,0 +1,12 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["OptionalType";["DataType";"String"]]]
+ ]];
+ "SortDirections"=[1;1;];
+ "SortedBy"=["key";"subkey";];
+ "SortedByTypes"=[["DataType";"String";];["DataType";"String";];];
+ "SortMembers"=["key";"subkey";];
+}}
+
diff --git a/yt/yql/tests/sql/suites/aggregate/input_dict.txt.attr b/yt/yql/tests/sql/suites/aggregate/input_dict.txt.attr
new file mode 100644
index 0000000000..1dbf7040c5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/input_dict.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["dict";["DictType";["DataType";"String"];["DataType";"String"]]]
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/aggregate/input_dsv.txt.attr b/yt/yql/tests/sql/suites/aggregate/input_dsv.txt.attr
new file mode 100644
index 0000000000..14544c6d7b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/input_dsv.txt.attr
@@ -0,0 +1,32 @@
+{
+ "_yql_read_udf"="Dsv.ReadRecord";
+ "_yql_read_udf_run_config"="@@";
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/aggregate/library_error_in_aggregation_fail.cfg b/yt/yql/tests/sql/suites/aggregate/library_error_in_aggregation_fail.cfg
new file mode 100644
index 0000000000..f139073dff
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/library_error_in_aggregation_fail.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+xfail
diff --git a/yt/yql/tests/sql/suites/aggregate/library_error_in_aggregation_fail.sql b/yt/yql/tests/sql/suites/aggregate/library_error_in_aggregation_fail.sql
new file mode 100644
index 0000000000..a5d6355234
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/library_error_in_aggregation_fail.sql
@@ -0,0 +1,20 @@
+/* custom error: Expected numeric type, but got String */
+
+USE plato;
+
+select * from (
+SELECT
+ a.key as x, sum(b.value)
+FROM Input as a
+JOIN Input as b
+USING (key)
+GROUP BY a.key
+) where x > "aaa"
+ORDER BY x;
+
+select 1;
+select 1;
+select 1;
+select 1;
+select 1;
+select 1;
diff --git a/yt/yql/tests/sql/suites/aggregate/list_after_group.sql b/yt/yql/tests/sql/suites/aggregate/list_after_group.sql
new file mode 100644
index 0000000000..d3169432ff
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/list_after_group.sql
@@ -0,0 +1,4 @@
+/* syntax version 1 */
+/* postgres can not */
+select aggregate_list(key) as key_list, listsort(aggregate_list(key)) AS sorted_key_list, value as name from plato.Input4 group by value
+order by name; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/list_nullable.cfg b/yt/yql/tests/sql/suites/aggregate/list_nullable.cfg
new file mode 100644
index 0000000000..5640285809
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/list_nullable.cfg
@@ -0,0 +1 @@
+in Input input_coalesce.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/list_nullable.sql b/yt/yql/tests/sql/suites/aggregate/list_nullable.sql
new file mode 100644
index 0000000000..48a56c7485
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/list_nullable.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+select aggregate_list(cast(value as int)) as val_list from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/list_with_fold_map.cfg b/yt/yql/tests/sql/suites/aggregate/list_with_fold_map.cfg
new file mode 100644
index 0000000000..4d76f79a62
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/list_with_fold_map.cfg
@@ -0,0 +1 @@
+in Input list_with_fold_map.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/list_with_fold_map.sql b/yt/yql/tests/sql/suites/aggregate/list_with_fold_map.sql
new file mode 100644
index 0000000000..74df1240ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/list_with_fold_map.sql
@@ -0,0 +1,21 @@
+/* syntax version 1 */
+USE plato;
+
+$data = (
+ SELECT
+ YQL::FoldMap(
+ counters,
+ names,
+ ($counter, $names) -> {
+ RETURN AsTuple(Unwrap($names[$counter]), $names);
+ }
+ ) AS profile,
+ id
+ FROM Input
+);
+
+SELECT
+ AGGREGATE_LIST(profile) AS profiles,
+ id
+FROM $data
+GROUP BY id;
diff --git a/yt/yql/tests/sql/suites/aggregate/list_with_fold_map.txt.attr b/yt/yql/tests/sql/suites/aggregate/list_with_fold_map.txt.attr
new file mode 100644
index 0000000000..edb026c6b0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/list_with_fold_map.txt.attr
@@ -0,0 +1,8 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["counters";["ListType";["DataType";"Int64"]]];
+ ["names";["ListType";["DataType";"String"]]];
+ ["id";["DataType";"String"]]
+ ]];
+}}
+
diff --git a/yt/yql/tests/sql/suites/aggregate/native_desc_group_compact_by.cfg b/yt/yql/tests/sql/suites/aggregate/native_desc_group_compact_by.cfg
new file mode 100644
index 0000000000..2190809549
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/native_desc_group_compact_by.cfg
@@ -0,0 +1,2 @@
+in Input1 descending.txt
+in Input2 input5.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/native_desc_group_compact_by.sql b/yt/yql/tests/sql/suites/aggregate/native_desc_group_compact_by.sql
new file mode 100644
index 0000000000..71f8b03302
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/native_desc_group_compact_by.sql
@@ -0,0 +1,24 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+pragma yt.UseNativeDescSort;
+
+select key, subkey from Input1 -- YtReduce
+group compact by key, subkey
+order by key, subkey;
+
+select key, subkey from Input1 -- YtReduce
+group compact by subkey, key
+order by subkey, key;
+
+select key from Input1 -- YtReduce
+group compact by key
+order by key;
+
+select subkey from Input1 -- YtMapReduce
+group compact by subkey
+order by subkey;
+
+select key, subkey from concat(Input1, Input2) -- YtMapReduce, mix of ascending/descending
+group compact by key, subkey
+order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/aggregate/no_compact_distinct.cfg b/yt/yql/tests/sql/suites/aggregate/no_compact_distinct.cfg
new file mode 100644
index 0000000000..711689a5cb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/no_compact_distinct.cfg
@@ -0,0 +1,3 @@
+providers yt
+in InputB input2.txt
+in InputC input3.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/no_compact_distinct.sql b/yt/yql/tests/sql/suites/aggregate/no_compact_distinct.sql
new file mode 100644
index 0000000000..757c9d55cc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/no_compact_distinct.sql
@@ -0,0 +1,13 @@
+USE plato;
+
+pragma AnsiOptionalAs;
+
+$x = (
+ SELECT key, AVG(DISTINCT Cast(subkey as float)) s FROM InputB GROUP BY key
+);
+
+$y = (
+ SELECT key, SUM(Cast(subkey as float)) s FROM InputC GROUP BY key
+);
+
+SELECT x.key, x.s AS s1, y.s AS s2 FROM $x x FULL OUTER JOIN $y y ON x.key = y.key;
diff --git a/yt/yql/tests/sql/suites/aggregate/percentile_and_avg_grouped.cfg b/yt/yql/tests/sql/suites/aggregate/percentile_and_avg_grouped.cfg
new file mode 100644
index 0000000000..910dfcb7e0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/percentile_and_avg_grouped.cfg
@@ -0,0 +1,3 @@
+in Input percentiles_input.txt
+udf stat_udf
+
diff --git a/yt/yql/tests/sql/suites/aggregate/percentile_and_avg_grouped.sql b/yt/yql/tests/sql/suites/aggregate/percentile_and_avg_grouped.sql
new file mode 100644
index 0000000000..6dc89752ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/percentile_and_avg_grouped.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select key, median(val) as med, avg(val) as avg from (select key, cast(value as int) as val from plato.Input) group by key order by key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/percentile_and_variance.cfg b/yt/yql/tests/sql/suites/aggregate/percentile_and_variance.cfg
new file mode 100644
index 0000000000..9410b8e431
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/percentile_and_variance.cfg
@@ -0,0 +1,3 @@
+in Input percentiles_input.txt
+udf stat_udf
+udf math_udf
diff --git a/yt/yql/tests/sql/suites/aggregate/percentile_and_variance.sql b/yt/yql/tests/sql/suites/aggregate/percentile_and_variance.sql
new file mode 100644
index 0000000000..c75cf50c6c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/percentile_and_variance.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select Math::Round(median(val), -3) as med, Math::Round(stddev(val), -3) as dev from (select cast(value as int) as val from plato.Input); \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/percentile_interval.sql b/yt/yql/tests/sql/suites/aggregate/percentile_interval.sql
new file mode 100644
index 0000000000..922579f7eb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/percentile_interval.sql
@@ -0,0 +1,38 @@
+/* syntax version 1 */
+
+$zero = unwrap( cast(0 as Interval) );
+$one = unwrap( cast (1 as Interval ) );
+
+-- we want to check both optional<interval> and plain interval
+$prepared = select
+ cast (key As Interval) ?? $zero as interval_data
+ from plato.Input;
+
+$source = select
+ interval_data
+ , interval_data + $one as interval_data2
+ , just( interval_data ) as optional_interval_data
+ from $prepared;
+
+-- percentile factory can work with plain number and with tuple of numbers.
+-- to achive second call we must make several percentile invocations with
+-- same column name
+$data_plain = select
+ percentile(interval_data, 0.8) as result
+ from $source;
+
+-- optimization should unite this into one call to percentile with tuple as argument
+$data_tuple = select
+ percentile(interval_data2, 0.8) as result_1
+ , percentile(interval_data2, 0.6) as result_2
+ from $source;
+
+$data_optional = select
+ percentile(optional_interval_data, 0.4) as result
+ from $source;
+
+select EnsureType(result, Interval?) from $data_plain;
+select EnsureType(result_1, Interval?) from $data_tuple;
+select EnsureType(result_2, Interval?) from $data_tuple;
+select result from $data_optional;
+
diff --git a/yt/yql/tests/sql/suites/aggregate/percentiles_containers.cfg b/yt/yql/tests/sql/suites/aggregate/percentiles_containers.cfg
new file mode 100644
index 0000000000..b0152e1177
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/percentiles_containers.cfg
@@ -0,0 +1,2 @@
+in Input percentiles_input.txt
+udf stat_udf
diff --git a/yt/yql/tests/sql/suites/aggregate/percentiles_containers.sql b/yt/yql/tests/sql/suites/aggregate/percentiles_containers.sql
new file mode 100644
index 0000000000..7bf4633e45
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/percentiles_containers.sql
@@ -0,0 +1,16 @@
+select
+ key,
+ median(val) as med,
+ percentile(val, AsTuple(0.2, 0.4, 0.6)) as ptuple,
+ percentile(val, AsStruct(0.2 as p20, 0.4 as p40, 0.6 as p60)) as pstruct,
+ percentile(val, AsList(0.2, 0.4, 0.6)) as plist,
+from (select key, cast(value as int) as val from plato.Input)
+group by key
+order by key;
+
+select
+ median(val) as med,
+ percentile(val, AsTuple(0.2, 0.4, 0.6)) as ptuple,
+ percentile(val, AsStruct(0.2 as p20, 0.4 as p40, 0.6 as p60)) as pstruct,
+ percentile(val, AsList(0.2, 0.4, 0.6)) as plist,
+from (select key, cast(value as int) as val from plato.Input)
diff --git a/yt/yql/tests/sql/suites/aggregate/percentiles_grouped.cfg b/yt/yql/tests/sql/suites/aggregate/percentiles_grouped.cfg
new file mode 100644
index 0000000000..b0152e1177
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/percentiles_grouped.cfg
@@ -0,0 +1,2 @@
+in Input percentiles_input.txt
+udf stat_udf
diff --git a/yt/yql/tests/sql/suites/aggregate/percentiles_grouped.sql b/yt/yql/tests/sql/suites/aggregate/percentiles_grouped.sql
new file mode 100644
index 0000000000..f4297e06e3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/percentiles_grouped.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select median(val) as med, median(distinct val) as distinct_med, percentile(val, 0.8) as p80 from (select key, cast(value as int) as val from plato.Input) group by key order by med; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/percentiles_grouped_expr.cfg b/yt/yql/tests/sql/suites/aggregate/percentiles_grouped_expr.cfg
new file mode 100644
index 0000000000..b0152e1177
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/percentiles_grouped_expr.cfg
@@ -0,0 +1,2 @@
+in Input percentiles_input.txt
+udf stat_udf
diff --git a/yt/yql/tests/sql/suites/aggregate/percentiles_grouped_expr.sql b/yt/yql/tests/sql/suites/aggregate/percentiles_grouped_expr.sql
new file mode 100644
index 0000000000..1ad133feee
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/percentiles_grouped_expr.sql
@@ -0,0 +1,8 @@
+select
+ median(val + 1) as med,
+ median(distinct val + 1) as distinct_med,
+ percentile(val + 1, 0.8) as p80
+from (
+ select key, cast(value as int) as val from plato.Input
+)
+group by key order by med;
diff --git a/yt/yql/tests/sql/suites/aggregate/percentiles_ungrouped.cfg b/yt/yql/tests/sql/suites/aggregate/percentiles_ungrouped.cfg
new file mode 100644
index 0000000000..52e9c9bc90
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/percentiles_ungrouped.cfg
@@ -0,0 +1,2 @@
+in Input percentiles_input.txt
+udf stat_udf \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/percentiles_ungrouped.sql b/yt/yql/tests/sql/suites/aggregate/percentiles_ungrouped.sql
new file mode 100644
index 0000000000..045b66c239
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/percentiles_ungrouped.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select median(val) as med, percentile(val, 0.8) as p80 from (select cast(value as int) as val from plato.Input); \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/aggregate/rollup_with_dict.cfg b/yt/yql/tests/sql/suites/aggregate/rollup_with_dict.cfg
new file mode 100644
index 0000000000..11a8788b61
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/rollup_with_dict.cfg
@@ -0,0 +1,2 @@
+in Input input_dsv.txt
+udf dsv_udf
diff --git a/yt/yql/tests/sql/suites/aggregate/rollup_with_dict.sql b/yt/yql/tests/sql/suites/aggregate/rollup_with_dict.sql
new file mode 100644
index 0000000000..d59e69d29b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/rollup_with_dict.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+--insert into Output
+select val, count(*) as cnt, grouping(val) as grouping
+from Input as t
+group by rollup(t.`dict`["c"] as val)
+order by val, cnt
+;
diff --git a/yt/yql/tests/sql/suites/aggregate/session1.txt.attr b/yt/yql/tests/sql/suites/aggregate/session1.txt.attr
new file mode 100644
index 0000000000..0df1a044c1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/session1.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["user";["OptionalType";["DataType";"String"]]];
+ ["ts";["OptionalType";["DataType";"Int32"]]];
+ ["payload";["DataType";"Int32"]]]
+ ];
+}}
diff --git a/yt/yql/tests/sql/suites/aggregate/sorted.txt.attr b/yt/yql/tests/sql/suites/aggregate/sorted.txt.attr
new file mode 100644
index 0000000000..ed13e20223
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/sorted.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/aggregate/subquery_aggregation.cfg b/yt/yql/tests/sql/suites/aggregate/subquery_aggregation.cfg
new file mode 100644
index 0000000000..c7e99df4d3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/subquery_aggregation.cfg
@@ -0,0 +1 @@
+in Input input_expr.txt
diff --git a/yt/yql/tests/sql/suites/aggregate/subquery_aggregation.sql b/yt/yql/tests/sql/suites/aggregate/subquery_aggregation.sql
new file mode 100644
index 0000000000..b5ed8ae250
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/subquery_aggregation.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$total_count = (SELECT Count(*) from Input);
+
+SELECT
+ common,
+ count(*) as rec_count,
+ 100. * count(*) / $total_count as part_percent
+FROM Input
+GROUP BY subkey as common
+ORDER BY common
+;
diff --git a/yt/yql/tests/sql/suites/aggregate/table_funcs_group_by.sql b/yt/yql/tests/sql/suites/aggregate/table_funcs_group_by.sql
new file mode 100644
index 0000000000..85652ed433
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/table_funcs_group_by.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+--insert into Output
+select
+ groupTribit,
+ count(*) as count
+from Input
+GROUP BY TableRecordIndex() % 3 as groupTribit
+ORDER BY groupTribit, count
diff --git a/yt/yql/tests/sql/suites/aggregate/table_row_aggregation.sql b/yt/yql/tests/sql/suites/aggregate/table_row_aggregation.sql
new file mode 100644
index 0000000000..f35a0d881b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/aggregate/table_row_aggregation.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$data = (
+ SELECT SOME(TableRow())
+ FROM Input4
+ GROUP BY key
+);
+
+SELECT *
+FROM $data
+FLATTEN COLUMNS
+ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/ansi_idents/basic_columns.sql b/yt/yql/tests/sql/suites/ansi_idents/basic_columns.sql
new file mode 100644
index 0000000000..6bce49176a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ansi_idents/basic_columns.sql
@@ -0,0 +1,5 @@
+--!ansi_lexer
+/* syntax version 1 */
+use plato;
+
+select "key" || subkey as "akey" from Input order by akey;
diff --git a/yt/yql/tests/sql/suites/ansi_idents/default.cfg b/yt/yql/tests/sql/suites/ansi_idents/default.cfg
new file mode 100644
index 0000000000..a1f7a5a9b7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ansi_idents/default.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/ansi_idents/escaped_udf_name.sql b/yt/yql/tests/sql/suites/ansi_idents/escaped_udf_name.sql
new file mode 100644
index 0000000000..9316d67556
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ansi_idents/escaped_udf_name.sql
@@ -0,0 +1,6 @@
+--!ansi_lexer
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+select `key` from Input where "String"::Contains("key", '7') order by key;
diff --git a/yt/yql/tests/sql/suites/ansi_idents/join_using.sql b/yt/yql/tests/sql/suites/ansi_idents/join_using.sql
new file mode 100644
index 0000000000..9f2c9c1869
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ansi_idents/join_using.sql
@@ -0,0 +1,5 @@
+--!ansi_lexer
+/* syntax version 1 */
+use plato;
+
+select count(*) from Input2 as a join Input3 as b using("key");;
diff --git a/yt/yql/tests/sql/suites/ansi_idents/order_by.sql b/yt/yql/tests/sql/suites/ansi_idents/order_by.sql
new file mode 100644
index 0000000000..ca319759aa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ansi_idents/order_by.sql
@@ -0,0 +1,5 @@
+--!ansi_lexer
+/* syntax version 1 */
+use plato;
+
+select "a".* from Input as "a" order by "key", `subkey`;
diff --git a/yt/yql/tests/sql/suites/bigdate/BigDates.txt.attr b/yt/yql/tests/sql/suites/bigdate/BigDates.txt.attr
new file mode 100644
index 0000000000..aa7e0bc89c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/BigDates.txt.attr
@@ -0,0 +1,17 @@
+{
+ "schema" = <"strict" = %true; "unique_keys" = %false> [
+ { "type" = "int64"; "required" = %true; "name" = "row" };
+ { "type" = "int32"; "required" = %true; "name" = "d32" };
+ { "type" = "int64"; "required" = %true; "name" = "dt64" };
+ { "type" = "int64"; "required" = %true; "name" = "ts64" };
+ { "type" = "int64"; "required" = %true; "name" = "i64" };
+ ];
+ "_yql_row_spec" = {
+ "TypePatch" = ["StructType";[
+ ["d32"; ["DataType"; "Date32"]];
+ ["dt64"; ["DataType"; "Datetime64"]];
+ ["ts64" ;["DataType"; "Timestamp64"]];
+ ["i64"; ["DataType"; "Interval64"]];
+ ]];
+ };
+}
diff --git a/yt/yql/tests/sql/suites/bigdate/NarrowDates.txt.attr b/yt/yql/tests/sql/suites/bigdate/NarrowDates.txt.attr
new file mode 100644
index 0000000000..d5ea06fda8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/NarrowDates.txt.attr
@@ -0,0 +1,15 @@
+{
+ "schema" = <"strict" = %true; "unique_keys" = %false> [
+ { "type" = "uint64"; "required" = %true; "name" = "row" };
+ { "type" = "uint16"; "required" = %true; "name" = "d" };
+ { "type" = "uint32"; "required" = %true; "name" = "dt" };
+ { "type" = "uint64"; "required" = %true; "name" = "ts" };
+ ];
+ "_yql_row_spec" = {
+ "TypePatch" = ["StructType";[
+ ["d"; ["DataType"; "Date"]];
+ ["dt"; ["DataType"; "Datetime"]];
+ ["ts" ;["DataType"; "Timestamp"]];
+ ]];
+ };
+}
diff --git a/yt/yql/tests/sql/suites/bigdate/NarrowInterval.txt.attr b/yt/yql/tests/sql/suites/bigdate/NarrowInterval.txt.attr
new file mode 100644
index 0000000000..bb8f05160e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/NarrowInterval.txt.attr
@@ -0,0 +1,11 @@
+{
+ "schema" = <"strict" = %true; "unique_keys" = %false> [
+ { "type" = "int64"; "required" = %true; "name" = "row" };
+ { "type" = "int64"; "required" = %true; "name" = "i" };
+ ];
+ "_yql_row_spec" = {
+ "TypePatch" = ["StructType";[
+ ["i"; ["DataType"; "Interval"]];
+ ]];
+ };
+}
diff --git a/yt/yql/tests/sql/suites/bigdate/Signed.txt.attr b/yt/yql/tests/sql/suites/bigdate/Signed.txt.attr
new file mode 100644
index 0000000000..56781be680
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/Signed.txt.attr
@@ -0,0 +1,9 @@
+{
+ "schema" = <"strict" = %true; "unique_keys" = %false> [
+ {"type" = "int64"; "required" = %true; "name" = "row"};
+ {"type" = "int8"; "required" = %true; "name" = "i8"};
+ {"type" = "int16"; "required" = %true; "name" = "i16"};
+ {"type" = "int32"; "required" = %true; "name" = "i32"};
+ {"type" = "int64"; "required" = %true; "name" = "i64"};
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/bigdate/Unsigned.txt.attr b/yt/yql/tests/sql/suites/bigdate/Unsigned.txt.attr
new file mode 100644
index 0000000000..9d72213c91
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/Unsigned.txt.attr
@@ -0,0 +1,9 @@
+{
+ "schema" = <"strict" = %true; "unique_keys" = %false> [
+ {"type" = "uint64"; "required" = %true; "name" = "row"};
+ {"type" = "uint8"; "required" = %true; "name" = "ui8"};
+ {"type" = "uint16"; "required" = %true; "name" = "ui16"};
+ {"type" = "uint32"; "required" = %true; "name" = "ui32"};
+ {"type" = "uint64"; "required" = %true; "name" = "ui64"};
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/bigdate/default.cfg b/yt/yql/tests/sql/suites/bigdate/default.cfg
new file mode 100644
index 0000000000..fc68a75b1e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/default.cfg
@@ -0,0 +1,5 @@
+in Signed Signed.txt
+in Unsigned Unsigned.txt
+in NarrowDates NarrowDates.txt
+in NarrowInterval NarrowInterval.txt
+in BigDates BigDates.txt
diff --git a/yt/yql/tests/sql/suites/bigdate/implicit_cast_callable.sql b/yt/yql/tests/sql/suites/bigdate/implicit_cast_callable.sql
new file mode 100644
index 0000000000..005e686135
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/implicit_cast_callable.sql
@@ -0,0 +1,43 @@
+/* postgres can not */
+use plato;
+
+$identity = ($x)-> { return $x };
+
+$idDate32 = Callable(Callable<(date32)->date32>, $identity);
+$idDatetime64 = Callable(Callable<(datetime64)->datetime64>, $identity);
+$idTimestamp64 = Callable(Callable<(timestamp64)->timestamp64>, $identity);
+$idInterval64 = Callable(Callable<(interval64)->interval64>, $identity);
+
+$valDate = unwrap(cast(1 as date));
+$valDate32 = unwrap(cast(-1 as date32));
+$valDatetime = unwrap(cast(86400 as datetime));
+$valDatetime64 = unwrap(cast(-86400 as datetime64));
+$valTimestamp = unwrap(cast(86400l*1000000 as timestamp));
+$valTimestamp64 = unwrap(cast(86400l*1000000 as timestamp64));
+$valInterval = unwrap(cast(1 as interval));
+$valInterval64 = unwrap(cast(-1 as interval64));
+
+select 1, $idDate32($valDate), $idDate32($valDate32)
+, 2, $idDatetime64($valDate), $idDatetime64($valDate32)
+, $idDatetime64($valDatetime), $idDatetime64($valDatetime64)
+, 3, $idTimestamp64($valDate), $idTimestamp64($valDate32)
+, $idTimestamp64($valDatetime), $idTimestamp64($valDatetime64)
+, $idTimestamp64($valTimestamp), $idTimestamp64($valTimestamp64)
+, 4, $idInterval64($valInterval), $idInterval64($valInterval64);
+
+select row
+, 1, $idTimestamp64(d32), $idDatetime64(d32), $idDate32(d32)
+, 2, $idTimestamp64(dt64), $idDatetime64(dt64)
+, 3, $idTimestamp64(ts64)
+, 4, $idInterval64(i64)
+from BigDates
+order by row;
+
+select row
+, 1, $idTimestamp64(d), $idDatetime64(d), $idDate32(d)
+, 2, $idTimestamp64(dt), $idDatetime64(dt)
+, 3, $idTimestamp64(ts)
+from NarrowDates
+order by row;
+
+select row, $idInterval64(i) from NarrowInterval order by row;
diff --git a/yt/yql/tests/sql/suites/bigdate/table_arithmetic.sql b/yt/yql/tests/sql/suites/bigdate/table_arithmetic.sql
new file mode 100644
index 0000000000..9fb30acf44
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/table_arithmetic.sql
@@ -0,0 +1,17 @@
+/* postgres can not */
+use plato;
+
+select row, -i64, +i64, abs(i64)
+from BigDates
+order by row;
+
+select min(d32), min(dt64), min(ts64), min(i64)
+, max(d32), max(dt64), max(ts64), max(i64)
+from BigDates;
+
+select l.row, r.row
+, 1, l.d32 - r.i64, l.dt64 - r.i64, l.ts64 - r.i64, l.i64 - r.i64
+, 2, l.d32 + r.i64, l.dt64 + r.i64, l.ts64 + r.i64, l.i64 + r.i64
+from BigDates as l cross join BigDates as r
+where abs(l.row) <= 7 and abs(r.row) <= 7
+order by l.row, r.row;
diff --git a/yt/yql/tests/sql/suites/bigdate/table_arithmetic_mul_div.sql b/yt/yql/tests/sql/suites/bigdate/table_arithmetic_mul_div.sql
new file mode 100644
index 0000000000..1674243a00
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/table_arithmetic_mul_div.sql
@@ -0,0 +1,35 @@
+/* postgres can not */
+use plato;
+
+select l.row, r.row
+, 1, l.i64*i8, l.i64*i16, l.i64*i32, l.i64*r.i64
+, 2, i8*l.i64, i16*l.i64, i32*l.i64, r.i64*l.i64
+, 3, l.i64/i8, l.i64/i16, l.i64/i32, l.i64/r.i64
+from BigDates as l cross join Signed as r
+where abs(l.row) <= 7 and abs(r.row) <= 7
+order by l.row, r.row;
+
+select l.row, r.row
+, 1, i64*ui8, i64*ui16, i64*ui32, i64*ui64
+, 2, ui8*i64, ui16*i64, ui32*i64, ui64*i64
+, 3, i64/ui8, i64/ui16, i64/ui32, i64/ui64
+from BigDates as l cross join Unsigned as r
+where abs(l.row) <= 7 and abs(r.row) <= 7
+order by l.row, r.row;
+
+select l.row, r.row
+, 1, l.i*i8, l.i*i16, l.i*i32, l.i*r.i64
+, 2, i8*l.i, i16*l.i, i32*l.i, r.i64*l.i
+, 3, l.i/i8, l.i/i16, l.i/i32, l.i/r.i64
+from NarrowInterval as l cross join Signed as r
+where abs(l.row) <= 7 and abs(r.row) <= 7
+order by l.row, r.row;
+
+select l.row, r.row
+, 1, i*ui8, i*ui16, i*ui32, i*ui64
+, 2, ui8*i, ui16*i, ui32*i, ui64*i
+, 3, i/ui8, i/ui16, i/ui32, i/ui64
+from NarrowInterval as l cross join Unsigned as r
+where abs(l.row) <= 7 and abs(r.row) <= 7
+order by l.row, r.row;
+
diff --git a/yt/yql/tests/sql/suites/bigdate/table_arithmetic_narrow.sql b/yt/yql/tests/sql/suites/bigdate/table_arithmetic_narrow.sql
new file mode 100644
index 0000000000..7e86c038fd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/table_arithmetic_narrow.sql
@@ -0,0 +1,25 @@
+/* postgres can not */
+use plato;
+
+select l.row, r.row
+, 1, l.d32 - r.d, l.d32 - r.dt, l.d32 - r.ts
+, 2, l.dt64 - r.d, l.dt64 - r.dt, l.dt64 - r.ts
+, 3, l.ts64 - r.d, l.ts64 - r.dt, l.ts64 - r.ts
+from BigDates as l cross join NarrowDates as r
+where abs(l.row) <= 7 and abs(r.row) <= 7
+order by l.row, r.row;
+
+select l.row, r.row
+, 1, l.d - r.d32, l.d - r.dt64, l.d - r.ts64, l.d - r.i64, l.d + r.i64
+, 2, l.dt - r.d32, l.dt - r.dt64, l.dt - r.ts64, l.dt - r.i64, l.dt + r.i64
+, 3, l.ts - r.d32, l.ts - r.dt64, l.ts - r.ts64, l.ts - r.i64, l.ts + r.i64
+from NarrowDates as l cross join BigDates as r
+where abs(l.row) <= 7 and abs(r.row) <= 7
+order by l.row, r.row;
+
+select l.row, r.row
+, 1, l.d32 - r.i, l.dt64 - r.i, l.ts64 - r.i, l.i64 - r.i
+, 2, l.d32 + r.i, l.dt64 + r.i, l.ts64 + r.i, l.i64 + r.i
+from BigDates as l cross join NarrowInterval as r
+where abs(l.row) <= 7 and abs(r.row) <= 7
+order by l.row, r.row;
diff --git a/yt/yql/tests/sql/suites/bigdate/table_arithmetic_sub.sql b/yt/yql/tests/sql/suites/bigdate/table_arithmetic_sub.sql
new file mode 100644
index 0000000000..18c040d8b4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/table_arithmetic_sub.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+use plato;
+
+select l.row, r.row
+, 1, l.d32 - r.d32, l.d32 - r.dt64, l.d32 - r.ts64
+, 2, l.dt64 - r.d32, l.dt64 - r.dt64, l.dt64 - r.ts64
+, 3, l.ts64 - r.d32, l.ts64 - r.dt64, l.ts64 - r.ts64
+from BigDates as l cross join BigDates as r
+where abs(l.row) <= 7 and abs(r.row) <= 7
+order by l.row, r.row;
diff --git a/yt/yql/tests/sql/suites/bigdate/table_common_type.sql b/yt/yql/tests/sql/suites/bigdate/table_common_type.sql
new file mode 100644
index 0000000000..f059db2f0a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/table_common_type.sql
@@ -0,0 +1,27 @@
+/* postgres can not */
+use plato;
+
+select bd.row as row
+, 1, [d, dt]
+, [d, ts]
+, [d, d32]
+, [d, dt64]
+, [d, ts64]
+, 2, [dt, ts]
+, [dt, d32]
+, [dt, dt64]
+, [dt, ts64]
+, 3, [ts, d32]
+, [ts, dt64]
+, [ts, ts64]
+, 4, [d32, dt64]
+, [d32, ts64]
+, 5, [dt64, ts64]
+from BigDates as bd
+join NarrowDates using (row)
+order by row;
+
+select bd.row as row, [i, i64]
+from BigDates as bd
+join NarrowInterval using (row)
+order by row;
diff --git a/yt/yql/tests/sql/suites/bigdate/table_explicit_cast.sql b/yt/yql/tests/sql/suites/bigdate/table_explicit_cast.sql
new file mode 100644
index 0000000000..263d90fbd2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/table_explicit_cast.sql
@@ -0,0 +1,29 @@
+/* postgres can not */
+use plato;
+
+select row, cast(i as interval64) from NarrowInterval order by row;
+
+select row
+, 1, cast(d as date), cast(d as datetime), cast(d as timestamp)
+, 2, cast(dt as date), cast(dt as datetime), cast(dt as timestamp)
+, 3, cast(ts as date), cast(ts as datetime), cast(ts as timestamp)
+from NarrowDates order by row;
+
+select row
+, 1, cast(d as date32), cast(d as datetime64), cast(d as timestamp64)
+, 2, cast(dt as date32), cast(dt as datetime64), cast(dt as timestamp64)
+, 3, cast(ts as date32), cast(ts as datetime64), cast(ts as timestamp64)
+from NarrowDates order by row;
+
+select row
+, 1, cast(d32 as date), cast(d32 as datetime), cast(d32 as timestamp)
+, 2, cast(dt64 as date), cast(dt64 as datetime), cast(dt64 as timestamp)
+, 3, cast(ts64 as date), cast(ts64 as datetime), cast(ts64 as timestamp)
+, 4, cast(i64 as interval)
+from BigDates order by row;
+
+select row
+, 1, cast(d32 as datetime64), cast(d32 as timestamp64)
+, 2, cast(dt64 as date32), cast(dt64 as timestamp64)
+, 3, cast(ts64 as date32), cast(ts64 as datetime64)
+from BigDates order by row;
diff --git a/yt/yql/tests/sql/suites/bigdate/table_int_cast.sql b/yt/yql/tests/sql/suites/bigdate/table_int_cast.sql
new file mode 100644
index 0000000000..a6b772f62e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/table_int_cast.sql
@@ -0,0 +1,34 @@
+/* postgres can not */
+use plato;
+
+select row
+, 1, cast(i8 as date32), cast(i8 as datetime64), cast(i8 as timestamp64), cast(i8 as interval64)
+, 2, cast(i16 as date32), cast(i16 as datetime64), cast(i16 as timestamp64), cast(i16 as interval64)
+, 3, cast(i32 as date32), cast(i32 as datetime64), cast(i32 as timestamp64), cast(i32 as interval64)
+, 4, cast(i64 as date32), cast(i64 as datetime64), cast(i64 as timestamp64), cast(i64 as interval64)
+from Signed
+order by row;
+
+select row
+, 1, cast(d32 as int8), cast(d32 as int16), cast(d32 as int32), cast(d32 as int64)
+, 2, cast(dt64 as int8), cast(dt64 as int16), cast(dt64 as int32), cast(dt64 as int64)
+, 3, cast(ts64 as int8), cast(ts64 as int16), cast(ts64 as int32), cast(ts64 as int64)
+, 4, cast(i64 as int8), cast(i64 as int16), cast(i64 as int32), cast(i64 as int64)
+from BigDates
+order by row;
+
+select row
+, 1, cast(d32 as uint8), cast(d32 as uint16), cast(d32 as uint32), cast(d32 as uint64)
+, 2, cast(dt64 as uint8), cast(dt64 as uint16), cast(dt64 as uint32), cast(dt64 as uint64)
+, 3, cast(ts64 as uint8), cast(ts64 as uint16), cast(ts64 as uint32), cast(ts64 as uint64)
+, 4, cast(i64 as uint8), cast(i64 as uint16), cast(i64 as uint32), cast(i64 as uint64)
+from BigDates
+order by row;
+
+select row
+, 1, cast(ui8 as date32), cast(ui8 as datetime64), cast(ui8 as timestamp64), cast(ui8 as interval64)
+, 2, cast(ui16 as date32), cast(ui16 as datetime64), cast(ui16 as timestamp64), cast(ui16 as interval64)
+, 3, cast(ui32 as date32), cast(ui32 as datetime64), cast(ui32 as timestamp64), cast(ui32 as interval64)
+, 4, cast(ui64 as date32), cast(ui64 as datetime64), cast(ui64 as timestamp64), cast(ui64 as interval64)
+from Unsigned
+order by row;
diff --git a/yt/yql/tests/sql/suites/bigdate/table_io.sql b/yt/yql/tests/sql/suites/bigdate/table_io.sql
new file mode 100644
index 0000000000..b3a3f2cd65
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/table_io.sql
@@ -0,0 +1,17 @@
+/* postgres can not */
+use plato;
+
+select * from BigDates order by row;
+
+insert into @Output with truncate
+select * from BigDates
+where row > -100
+order by row;
+
+commit;
+
+select * from @Output order by row;
+
+select row, cast(d32 as string), cast(dt64 as string), cast(ts64 as string), cast(i64 as string)
+from BigDates
+order by row;
diff --git a/yt/yql/tests/sql/suites/bigdate/table_yt_key_filter-default.cfg b/yt/yql/tests/sql/suites/bigdate/table_yt_key_filter-default.cfg
new file mode 100644
index 0000000000..9256d900c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/table_yt_key_filter-default.cfg
@@ -0,0 +1,6 @@
+out OutDate32 OutDate32.txt
+out OutDatetime64 OutDatetime64.txt
+out OutTimestamp64 OutTimestamp64.txt
+providers yt
+canonize_yt
+
diff --git a/yt/yql/tests/sql/suites/bigdate/table_yt_key_filter-on.cfg b/yt/yql/tests/sql/suites/bigdate/table_yt_key_filter-on.cfg
new file mode 100644
index 0000000000..be9c9911e3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/table_yt_key_filter-on.cfg
@@ -0,0 +1,7 @@
+out OutDate32 OutDate32.txt
+out OutDatetime64 OutDatetime64.txt
+out OutTimestamp64 OutTimestamp64.txt
+providers yt
+canonize_yt
+pragma yt.UseNativeYtTypes;
+pragma yt.NativeYtTypeCompatibility = "date;bigdate";
diff --git a/yt/yql/tests/sql/suites/bigdate/table_yt_key_filter-wo_compat.cfg b/yt/yql/tests/sql/suites/bigdate/table_yt_key_filter-wo_compat.cfg
new file mode 100644
index 0000000000..0f936de55c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/table_yt_key_filter-wo_compat.cfg
@@ -0,0 +1,8 @@
+out OutDate32 OutDate32.txt
+out OutDatetime64 OutDatetime64.txt
+out OutTimestamp64 OutTimestamp64.txt
+providers yt
+canonize_yt
+pragma yt.UseNativeYtTypes;
+pragma yt.NativeYtTypeCompatibility = "void";
+
diff --git a/yt/yql/tests/sql/suites/bigdate/table_yt_key_filter.sql b/yt/yql/tests/sql/suites/bigdate/table_yt_key_filter.sql
new file mode 100644
index 0000000000..87a1364cb1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/table_yt_key_filter.sql
@@ -0,0 +1,110 @@
+/* postgres can not */
+/* multirun can not */
+use plato;
+
+pragma yt.UseNewPredicateExtraction;
+
+insert into OutDate32
+select * from as_table(AsList(
+ <|key:Date32('-144169-1-1')|>,
+ <|key:Date32('148107-12-31')|>))
+order by key;
+
+insert into OutDatetime64
+select * from as_table(AsList(
+ <|key:Datetime64('-144169-1-1T0:0:0Z')|>,
+ <|key:Datetime64('148107-12-31T23:59:59Z')|>))
+order by key;
+
+insert into OutTimestamp64
+select * from as_table(AsList(
+ <|key:Timestamp64('-144169-1-1T0:0:0Z')|>,
+ <|key:Timestamp64('148107-12-31T23:59:59.999999Z')|>))
+order by key;
+
+commit;
+
+select * from OutDate32
+where key > Date('1970-1-1')
+and key > Datetime('1970-1-1T0:0:0Z')
+and key > Timestamp('1970-1-1T0:0:0Z')
+and key > Date32('-144169-1-1')
+and key > Datetime64('-144169-1-1T0:0:0Z')
+and key > Timestamp64('-144169-1-1T0:0:0Z')
+and key >= Date('2105-12-31')
+and key >= Datetime('2105-12-31T23:59:59Z')
+and key >= Timestamp('2105-12-31T23:59:59Z')
+and key >= Date32('148107-12-31')
+and key >= Datetime64('148107-12-31T0:0:0Z')
+and key >= Timestamp64('148107-12-31T0:0:0Z')
+;
+select * from OutDate32
+where key < Date('2105-12-31')
+and key < Datetime('2105-12-31T23:59:59Z')
+and key < Timestamp('2105-12-31T23:59:59.999999Z')
+and key < Date32('148107-12-31')
+and key < Datetime64('148107-12-31T23:59:59Z')
+and key < Timestamp64('148107-12-31T23:59:59.999999Z')
+and key <= Date('1970-1-1')
+and key <= Datetime('1970-1-1T0:0:0Z')
+and key <= Timestamp('1970-1-1T0:0:0Z')
+and key <= Date32('-144169-1-1')
+and key <= Datetime64('-144169-1-1T0:0:0Z')
+and key <= Timestamp64('-144169-1-1T0:0:0Z')
+;
+select * from OutDatetime64
+where key > Date('1970-1-1')
+and key > Datetime('1970-1-1T0:0:0Z')
+and key > Timestamp('1970-1-1T0:0:0Z')
+and key > Date32('-144169-1-1')
+and key > Datetime64('-144169-1-1T0:0:0Z')
+and key > Timestamp64('-144169-1-1T0:0:0Z')
+and key >= Date('2105-12-31')
+and key >= Datetime('2105-12-31T23:59:59Z')
+and key >= Timestamp('2105-12-31T23:59:59Z')
+and key >= Date32('148107-12-31')
+and key >= Datetime64('148107-12-31T0:0:0Z')
+and key >= Timestamp64('148107-12-31T0:0:0Z')
+;
+select * from OutDatetime64
+where key < Date('2105-12-31')
+and key < Datetime('2105-12-31T23:59:59Z')
+and key < Timestamp('2105-12-31T23:59:59.999999Z')
+and key < Date32('148107-12-31')
+and key < Datetime64('148107-12-31T23:59:59Z')
+and key < Timestamp64('148107-12-31T23:59:59.999999Z')
+and key <= Date('1970-1-1')
+and key <= Datetime('1970-1-1T0:0:0Z')
+and key <= Timestamp('1970-1-1T0:0:0Z')
+and key <= Date32('-144169-1-1')
+and key <= Datetime64('-144169-1-1T0:0:0Z')
+and key <= Timestamp64('-144169-1-1T0:0:0Z')
+;
+select * from OutTimestamp64
+where key > Date('1970-1-1')
+and key > Datetime('1970-1-1T0:0:0Z')
+and key > Timestamp('1970-1-1T0:0:0Z')
+and key > Date32('-144169-1-1')
+and key > Datetime64('-144169-1-1T0:0:0Z')
+and key > Timestamp64('-144169-1-1T0:0:0Z')
+and key >= Date('2105-12-31')
+and key >= Datetime('2105-12-31T23:59:59Z')
+and key >= Timestamp('2105-12-31T23:59:59Z')
+and key >= Date32('148107-12-31')
+and key >= Datetime64('148107-12-31T0:0:0Z')
+and key >= Timestamp64('148107-12-31T0:0:0Z')
+;
+select * from OutTimestamp64
+where key < Date('2105-12-31')
+and key < Datetime('2105-12-31T23:59:59Z')
+and key < Timestamp('2105-12-31T23:59:59.999999Z')
+and key < Date32('148107-12-31')
+and key < Datetime64('148107-12-31T23:59:59Z')
+and key < Timestamp64('148107-12-31T23:59:59.999999Z')
+and key <= Date('1970-1-1')
+and key <= Datetime('1970-1-1T0:0:0Z')
+and key <= Timestamp('1970-1-1T0:0:0Z')
+and key <= Date32('-144169-1-1')
+and key <= Datetime64('-144169-1-1T0:0:0Z')
+and key <= Timestamp64('-144169-1-1T0:0:0Z')
+;
diff --git a/yt/yql/tests/sql/suites/bigdate/table_yt_native-default.cfg b/yt/yql/tests/sql/suites/bigdate/table_yt_native-default.cfg
new file mode 100644
index 0000000000..cd64dfec4a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/table_yt_native-default.cfg
@@ -0,0 +1,3 @@
+out Output output.txt
+providers yt
+canonize_yt
diff --git a/yt/yql/tests/sql/suites/bigdate/table_yt_native-on.cfg b/yt/yql/tests/sql/suites/bigdate/table_yt_native-on.cfg
new file mode 100644
index 0000000000..6486efd742
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/table_yt_native-on.cfg
@@ -0,0 +1,5 @@
+out Output output.txt
+providers yt
+canonize_yt
+pragma yt.UseNativeYtTypes;
+pragma yt.NativeYtTypeCompatibility = "bigdate";
diff --git a/yt/yql/tests/sql/suites/bigdate/table_yt_native-wo_compat.cfg b/yt/yql/tests/sql/suites/bigdate/table_yt_native-wo_compat.cfg
new file mode 100644
index 0000000000..c5e08d7e27
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/table_yt_native-wo_compat.cfg
@@ -0,0 +1,5 @@
+out Output output.txt
+providers yt
+canonize_yt
+pragma yt.UseNativeYtTypes;
+pragma yt.NativeYtTypeCompatibility = "date";
diff --git a/yt/yql/tests/sql/suites/bigdate/table_yt_native.sql b/yt/yql/tests/sql/suites/bigdate/table_yt_native.sql
new file mode 100644
index 0000000000..3d7d636051
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/table_yt_native.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+/* multirun can not */
+use plato;
+
+insert into @tmpTable
+select date32('1969-12-31') as d32, datetime64('1969-12-31T0:0:0Z') as dt64, timestamp64('1969-12-31T0:0:0Z') as ts64, interval64('P65536D') as i64;
+
+commit;
+
+insert into Output
+select * from @tmpTable where d32 < date32('1970-1-1');
diff --git a/yt/yql/tests/sql/suites/bigdate/tz.txt.attr b/yt/yql/tests/sql/suites/bigdate/tz.txt.attr
new file mode 100644
index 0000000000..0d613e597e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/tz.txt.attr
@@ -0,0 +1,8 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["waz";["DataType";"TzDate32"]];
+ ["wdz";["DataType";"TzDatetime64"]];
+ ["wtz";["DataType";"TzTimestamp64"]];
+ ]];
+}}
+
diff --git a/yt/yql/tests/sql/suites/bigdate/tz_table_fill.cfg b/yt/yql/tests/sql/suites/bigdate/tz_table_fill.cfg
new file mode 100644
index 0000000000..879bab94a0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/tz_table_fill.cfg
@@ -0,0 +1,2 @@
+out Output output.txt
+
diff --git a/yt/yql/tests/sql/suites/bigdate/tz_table_fill.sql b/yt/yql/tests/sql/suites/bigdate/tz_table_fill.sql
new file mode 100644
index 0000000000..f97466cd0c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/tz_table_fill.sql
@@ -0,0 +1,12 @@
+use plato;
+
+$waz = TzDate32("1900-01-01,Europe/Moscow");
+$wdz = TzDatetime64("1900-01-01T02:03:04,Europe/Moscow");
+$wtz = TzTimestamp64("1900-01-01T02:03:04.567891,Europe/Moscow");
+
+insert into Output
+select
+ $waz as waz,
+ $wdz as wdz,
+ $wtz as wtz,
+ ($waz, $wdz, $waz) as tup;
diff --git a/yt/yql/tests/sql/suites/bigdate/tz_table_pull.cfg b/yt/yql/tests/sql/suites/bigdate/tz_table_pull.cfg
new file mode 100644
index 0000000000..9fc18af3ef
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/tz_table_pull.cfg
@@ -0,0 +1,2 @@
+in Input tz.txt
+
diff --git a/yt/yql/tests/sql/suites/bigdate/tz_table_pull.sql b/yt/yql/tests/sql/suites/bigdate/tz_table_pull.sql
new file mode 100644
index 0000000000..334892b938
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/tz_table_pull.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+SELECT
+ waz,wdz,wtz
+FROM Input
+
diff --git a/yt/yql/tests/sql/suites/bigdate/tz_table_rw.cfg b/yt/yql/tests/sql/suites/bigdate/tz_table_rw.cfg
new file mode 100644
index 0000000000..9793ce0c22
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/tz_table_rw.cfg
@@ -0,0 +1,2 @@
+in Input tz.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/bigdate/tz_table_rw.sql b/yt/yql/tests/sql/suites/bigdate/tz_table_rw.sql
new file mode 100644
index 0000000000..ca11765fc8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/tz_table_rw.sql
@@ -0,0 +1,6 @@
+use plato;
+
+insert into Output
+select (waz,wdz,wtz),waz,wdz,wtz from Input;
+
+
diff --git a/yt/yql/tests/sql/suites/bigdate/tz_table_yt_key_filter.cfg b/yt/yql/tests/sql/suites/bigdate/tz_table_yt_key_filter.cfg
new file mode 100644
index 0000000000..a51be0aec2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/tz_table_yt_key_filter.cfg
@@ -0,0 +1,5 @@
+out OutTzDate32 OutTzDate32.txt
+out OutTzDatetime64 OutTzDatetime64.txt
+out OutTzTimestamp64 OutTzTimestamp64.txt
+providers yt
+canonize_yt
diff --git a/yt/yql/tests/sql/suites/bigdate/tz_table_yt_key_filter.sql b/yt/yql/tests/sql/suites/bigdate/tz_table_yt_key_filter.sql
new file mode 100644
index 0000000000..7f96c9b32b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/bigdate/tz_table_yt_key_filter.sql
@@ -0,0 +1,62 @@
+/* postgres can not */
+/* multirun can not */
+use plato;
+
+pragma yt.UseNewPredicateExtraction;
+
+insert into OutTzDate32
+select * from as_table(AsList(
+ <|key:TzDate32('-144169-1-1,UTC')|>,
+ <|key:TzDate32('148107-12-31,UTC')|>))
+order by key;
+
+insert into OutTzDatetime64
+select * from as_table(AsList(
+ <|key:TzDatetime64('-144169-1-1T0:0:0,UTC')|>,
+ <|key:TzDatetime64('148107-12-31T23:59:59,UTC')|>))
+order by key;
+
+insert into OutTzTimestamp64
+select * from as_table(AsList(
+ <|key:TzTimestamp64('-144169-1-1T0:0:0,UTC')|>,
+ <|key:TzTimestamp64('148107-12-31T23:59:59.999999,UTC')|>))
+order by key;
+
+commit;
+
+select * from OutTzDate32
+where key > TzDate32('-144169-1-1,UTC')
+and key > TzDatetime64('-144169-1-1T0:0:0,UTC')
+and key > TzTimestamp64('-144169-1-1T0:0:0,UTC')
+and key >= TzDate32('148107-12-31,UTC')
+and key >= TzDatetime64('148107-12-31T0:0:0,UTC')
+and key >= TzTimestamp64('148107-12-31T0:0:0,UTC')
+;
+select * from OutTzDate32
+where key < TzDate32('148107-12-31,UTC')
+and key < TzDatetime64('148107-12-31T23:59:59,UTC')
+and key < TzTimestamp64('148107-12-31T23:59:59.999999,UTC')
+and key <= TzDate32('-144169-1-1,UTC')
+and key <= TzDatetime64('-144169-1-1T0:0:0,UTC')
+and key <= TzTimestamp64('-144169-1-1T0:0:0,UTC')
+;
+select * from OutTzDatetime64
+where key > TzDatetime64('-144169-1-1T0:0:0,UTC')
+and key > TzTimestamp64('-144169-1-1T0:0:0,UTC')
+and key >= TzDatetime64('148107-12-31T0:0:0,UTC')
+and key >= TzTimestamp64('148107-12-31T0:0:0,UTC')
+;
+select * from OutTzDatetime64
+where key < TzDatetime64('148107-12-31T23:59:59,UTC')
+and key < TzTimestamp64('148107-12-31T23:59:59.999999,UTC')
+and key <= TzDatetime64('-144169-1-1T0:0:0,UTC')
+and key <= TzTimestamp64('-144169-1-1T0:0:0,UTC')
+;
+select * from OutTzTimestamp64
+where key > TzTimestamp64('-144169-1-1T0:0:0,UTC')
+and key >= TzTimestamp64('148107-12-31T0:0:0,UTC')
+;
+select * from OutTzTimestamp64
+where key < TzTimestamp64('148107-12-31T23:59:59.999999,UTC')
+and key <= TzTimestamp64('-144169-1-1T0:0:0,UTC')
+;
diff --git a/yt/yql/tests/sql/suites/binding/anon_table_binding.sql b/yt/yql/tests/sql/suites/binding/anon_table_binding.sql
new file mode 100644
index 0000000000..95f5f0796f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/anon_table_binding.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$c = "cccc";
+
+INSERT INTO @$c
+select 1 as x;
+commit;
+SELECT * FROM @$c;
diff --git a/yt/yql/tests/sql/suites/binding/bind_select.sql b/yt/yql/tests/sql/suites/binding/bind_select.sql
new file mode 100644
index 0000000000..a7f24466c8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/bind_select.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+$foo = (select 100500 as bar);
+select bar from $foo;
diff --git a/yt/yql/tests/sql/suites/binding/default.cfg b/yt/yql/tests/sql/suites/binding/default.cfg
new file mode 100644
index 0000000000..a1f7a5a9b7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/default.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/binding/drop_binding.cfg b/yt/yql/tests/sql/suites/binding/drop_binding.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/drop_binding.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/binding/drop_binding.sql b/yt/yql/tests/sql/suites/binding/drop_binding.sql
new file mode 100644
index 0000000000..48bafd14d7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/drop_binding.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+/* postgres can not */
+/* kikimr can not - can't drop non-existent table */
+
+USE plato;
+
+$a = "Output";
+DROP TABLE $a;
diff --git a/yt/yql/tests/sql/suites/binding/insert_binding.cfg b/yt/yql/tests/sql/suites/binding/insert_binding.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/insert_binding.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/binding/insert_binding.sql b/yt/yql/tests/sql/suites/binding/insert_binding.sql
new file mode 100644
index 0000000000..28f1de7135
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/insert_binding.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$a = "Output";
+INSERT INTO $a
+SELECT count(*) from Input;
diff --git a/yt/yql/tests/sql/suites/binding/named_node_corr_names.sql b/yt/yql/tests/sql/suites/binding/named_node_corr_names.sql
new file mode 100644
index 0000000000..4b9c0ddbba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/named_node_corr_names.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$a = (SELECT key, subkey FROM Input);
+SELECT a.subkey FROM $a AS a;
+SELECT b.subkey FROM $a AS b;
diff --git a/yt/yql/tests/sql/suites/binding/table_concat_binding.sql b/yt/yql/tests/sql/suites/binding/table_concat_binding.sql
new file mode 100644
index 0000000000..0cfc4b4e1a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/table_concat_binding.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+/* postgres can not */
+$a = "Input";
+SELECT count(*) FROM plato.concat($a,$a);
+
+USE plato;
+
+$a = "Input";
+SELECT count(*) FROM concat($a,$a);
diff --git a/yt/yql/tests/sql/suites/binding/table_concat_strict_binding.sql b/yt/yql/tests/sql/suites/binding/table_concat_strict_binding.sql
new file mode 100644
index 0000000000..ba55ba86ac
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/table_concat_strict_binding.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+/* postgres can not */
+$a = "Input";
+SELECT count(*) FROM plato.concat_strict($a,$a);
+
+USE plato;
+
+$a = "Input";
+SELECT count(*) FROM concat_strict($a,$a);
diff --git a/yt/yql/tests/sql/suites/binding/table_filter_binding.sql b/yt/yql/tests/sql/suites/binding/table_filter_binding.sql
new file mode 100644
index 0000000000..76aa156f96
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/table_filter_binding.sql
@@ -0,0 +1,27 @@
+/* syntax version 1 */
+/* postgres can not */
+/* kikimr can not - range not supported */
+$a = "";
+$b = ($_item)->{return true;};
+$c = "";
+$d = "";
+SELECT count(*) FROM plato.filter($a,$b,$c,$d);
+
+$a = "";
+$b = ($_item)->{return true;};
+$c = "";
+$d = "raw";
+SELECT count(*) FROM plato.filter($a,$b,$c,$d);
+
+use plato;
+
+$b = ($_item)->{return true;};
+$c = "";
+$d = "";
+SELECT count(*) FROM filter($a,$b,$c,$d);
+
+$a = "";
+$b = ($_item)->{return true;};
+$c = "";
+$d = "raw";
+SELECT count(*) FROM filter($a,$b,$c,$d);
diff --git a/yt/yql/tests/sql/suites/binding/table_filter_strict_binding.sql b/yt/yql/tests/sql/suites/binding/table_filter_strict_binding.sql
new file mode 100644
index 0000000000..0217520a0f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/table_filter_strict_binding.sql
@@ -0,0 +1,28 @@
+/* syntax version 1 */
+/* postgres can not */
+/* kikimr can not - range not supported */
+$a = "";
+$b = ($_item)->{return true;};
+$c = "";
+$d = "";
+SELECT count(*) FROM plato.filter_strict($a,$b,$c,$d);
+
+$a = "";
+$b = ($_item)->{return true;};
+$c = "";
+$d = "raw";
+SELECT count(*) FROM plato.filter_strict($a,$b,$c,$d);
+
+use plato;
+
+$a = "";
+$b = ($_item)->{return true;};
+$c = "";
+$d = "";
+SELECT count(*) FROM filter_strict($a,$b,$c,$d);
+
+$a = "";
+$b = ($_item)->{return true;};
+$c = "";
+$d = "raw";
+SELECT count(*) FROM filter_strict($a,$b,$c,$d);
diff --git a/yt/yql/tests/sql/suites/binding/table_from_binding.sql b/yt/yql/tests/sql/suites/binding/table_from_binding.sql
new file mode 100644
index 0000000000..0ea49f5ee5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/table_from_binding.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+$x = "Input";
+SELECT count(*) FROM $x;
diff --git a/yt/yql/tests/sql/suites/binding/table_from_binding_inferscheme.sql b/yt/yql/tests/sql/suites/binding/table_from_binding_inferscheme.sql
new file mode 100644
index 0000000000..1e2bd7c935
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/table_from_binding_inferscheme.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+/* kikimr can not */
+pragma yt.InferSchema;
+
+/* postgres can not */
+use plato;
+$x = "Input";
+SELECT count(*) FROM $x;
diff --git a/yt/yql/tests/sql/suites/binding/table_range_binding.sql b/yt/yql/tests/sql/suites/binding/table_range_binding.sql
new file mode 100644
index 0000000000..4669fb2077
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/table_range_binding.sql
@@ -0,0 +1,46 @@
+/* syntax version 1 */
+/* postgres can not */
+/* kikimr can not - range not supported */
+$a = "";
+$b = "Input";
+$c = "Input";
+$d = "";
+$e = "";
+SELECT count(*) FROM plato.range($a,$b,$c,$d,$e);
+
+$a = "";
+$b = "Inp";
+$c = "Input1";
+$d = "";
+$e = "raw";
+SELECT count(*) FROM plato.range($a,$b,$c,$d,$e);
+
+$a = "";
+$b = "Inp";
+$c = "Input2";
+$d = "";
+$e = "";
+SELECT count(*) FROM plato.range($a,$b,$c,$d,$e);
+
+use plato;
+
+$a = "";
+$b = "Input";
+$c = "Input";
+$d = "";
+$e = "";
+SELECT count(*) FROM range($a,$b,$c,$d,$e);
+
+$a = "";
+$b = "Inp";
+$c = "Input1";
+$d = "";
+$e = "raw";
+SELECT count(*) FROM range($a,$b,$c,$d,$e);
+
+$a = "";
+$b = "Inp";
+$c = "Input2";
+$d = "";
+$e = "";
+SELECT count(*) FROM range($a,$b,$c,$d,$e);
diff --git a/yt/yql/tests/sql/suites/binding/table_range_strict_binding.sql b/yt/yql/tests/sql/suites/binding/table_range_strict_binding.sql
new file mode 100644
index 0000000000..bbf62c6c2a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/table_range_strict_binding.sql
@@ -0,0 +1,46 @@
+/* syntax version 1 */
+/* postgres can not */
+/* kikimr can not - range_strict not supported */
+$a = "";
+$b = "Input";
+$c = "Input";
+$d = "";
+$e = "";
+SELECT count(*) FROM plato.range_strict($a,$b,$c,$d,$e);
+
+$a = "";
+$b = "Inp";
+$c = "Input1";
+$d = "";
+$e = "raw";
+SELECT count(*) FROM plato.range_strict($a,$b,$c,$d,$e);
+
+$a = "";
+$b = "Inp";
+$c = "Input2";
+$d = "";
+$e = "";
+SELECT count(*) FROM plato.range_strict($a,$b,$c,$d,$e);
+
+use plato;
+
+$a = "";
+$b = "Input";
+$c = "Input";
+$d = "";
+$e = "";
+SELECT count(*) FROM range_strict($a,$b,$c,$d,$e);
+
+$a = "";
+$b = "Inp";
+$c = "Input1";
+$d = "";
+$e = "raw";
+SELECT count(*) FROM range_strict($a,$b,$c,$d,$e);
+
+$a = "";
+$b = "Inp";
+$c = "Input2";
+$d = "";
+$e = "";
+SELECT count(*) FROM range_strict($a,$b,$c,$d,$e);
diff --git a/yt/yql/tests/sql/suites/binding/table_regexp_binding.cfg b/yt/yql/tests/sql/suites/binding/table_regexp_binding.cfg
new file mode 100644
index 0000000000..acaecd1e1d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/table_regexp_binding.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+udf pire_udf
diff --git a/yt/yql/tests/sql/suites/binding/table_regexp_binding.sql b/yt/yql/tests/sql/suites/binding/table_regexp_binding.sql
new file mode 100644
index 0000000000..2e3d721dc6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/table_regexp_binding.sql
@@ -0,0 +1,17 @@
+/* syntax version 1 */
+/* postgres can not */
+/* kikimr can not - range not supported */
+
+$a = "";
+$b = "Input";
+$c = "";
+$d = "";
+SELECT count(*) FROM plato.regexp($a,$b,$c,$d);
+
+use plato;
+
+$a = "";
+$b = "Input";
+$c = "";
+$d = "";
+SELECT count(*) FROM regexp($a,$b,$c,$d);
diff --git a/yt/yql/tests/sql/suites/binding/table_regexp_strict_binding.cfg b/yt/yql/tests/sql/suites/binding/table_regexp_strict_binding.cfg
new file mode 100644
index 0000000000..acaecd1e1d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/table_regexp_strict_binding.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+udf pire_udf
diff --git a/yt/yql/tests/sql/suites/binding/table_regexp_strict_binding.sql b/yt/yql/tests/sql/suites/binding/table_regexp_strict_binding.sql
new file mode 100644
index 0000000000..530b988012
--- /dev/null
+++ b/yt/yql/tests/sql/suites/binding/table_regexp_strict_binding.sql
@@ -0,0 +1,17 @@
+/* syntax version 1 */
+/* postgres can not */
+/* kikimr can not - range not supported */
+
+$a = "";
+$b = "Input";
+$c = "";
+$d = "";
+SELECT count(*) FROM plato.regexp_strict($a,$b,$c,$d);
+
+use plato;
+
+$a = "";
+$b = "Input";
+$c = "";
+$d = "";
+SELECT count(*) FROM regexp_strict($a,$b,$c,$d);
diff --git a/yt/yql/tests/sql/suites/blocks/add_decimal.cfg b/yt/yql/tests/sql/suites/blocks/add_decimal.cfg
new file mode 100644
index 0000000000..a21c6560ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_decimal.cfg
@@ -0,0 +1 @@
+in Input input_decimal.txt
diff --git a/yt/yql/tests/sql/suites/blocks/add_decimal.sql b/yt/yql/tests/sql/suites/blocks/add_decimal.sql
new file mode 100644
index 0000000000..648a3709d5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_decimal.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ cs_ext_list_price+cs_sales_price,cast(1 as decimal(7,2))+cs_ext_list_price,cs_sales_price+cast(2ul as decimal(7,2))
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/add_int16.cfg b/yt/yql/tests/sql/suites/blocks/add_int16.cfg
new file mode 100644
index 0000000000..b122c34208
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_int16.cfg
@@ -0,0 +1 @@
+in Input input_int16.txt
diff --git a/yt/yql/tests/sql/suites/blocks/add_int16.sql b/yt/yql/tests/sql/suites/blocks/add_int16.sql
new file mode 100644
index 0000000000..5a40f28c1e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_int16.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key+subkey,1s+key,subkey+2s
+FROM Input \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/add_int32.cfg b/yt/yql/tests/sql/suites/blocks/add_int32.cfg
new file mode 100644
index 0000000000..f68558a818
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_int32.cfg
@@ -0,0 +1 @@
+in Input input_int32.txt
diff --git a/yt/yql/tests/sql/suites/blocks/add_int32.sql b/yt/yql/tests/sql/suites/blocks/add_int32.sql
new file mode 100644
index 0000000000..ae8903174a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_int32.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key+subkey,1+key,subkey+2
+FROM Input \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/add_int64.cfg b/yt/yql/tests/sql/suites/blocks/add_int64.cfg
new file mode 100644
index 0000000000..d2b033ce45
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_int64.cfg
@@ -0,0 +1 @@
+in Input input_int64.txt
diff --git a/yt/yql/tests/sql/suites/blocks/add_int64.sql b/yt/yql/tests/sql/suites/blocks/add_int64.sql
new file mode 100644
index 0000000000..1c249577dc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_int64.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key+subkey,1l+key,subkey+2l
+FROM Input \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/add_int8.cfg b/yt/yql/tests/sql/suites/blocks/add_int8.cfg
new file mode 100644
index 0000000000..82ad4d9d8e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_int8.cfg
@@ -0,0 +1 @@
+in Input input_int8.txt
diff --git a/yt/yql/tests/sql/suites/blocks/add_int8.sql b/yt/yql/tests/sql/suites/blocks/add_int8.sql
new file mode 100644
index 0000000000..7dc1279e89
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_int8.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key+subkey,1t+key,subkey+2t
+FROM Input \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/add_uint16.cfg b/yt/yql/tests/sql/suites/blocks/add_uint16.cfg
new file mode 100644
index 0000000000..e8e031c1e0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_uint16.cfg
@@ -0,0 +1 @@
+in Input input_uint16.txt
diff --git a/yt/yql/tests/sql/suites/blocks/add_uint16.sql b/yt/yql/tests/sql/suites/blocks/add_uint16.sql
new file mode 100644
index 0000000000..9d81c2c052
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_uint16.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key+subkey,1us+key,subkey+2us
+FROM Input \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/add_uint32.cfg b/yt/yql/tests/sql/suites/blocks/add_uint32.cfg
new file mode 100644
index 0000000000..54555c1cf2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_uint32.cfg
@@ -0,0 +1 @@
+in Input input_uint32.txt
diff --git a/yt/yql/tests/sql/suites/blocks/add_uint32.sql b/yt/yql/tests/sql/suites/blocks/add_uint32.sql
new file mode 100644
index 0000000000..2c61de9c42
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_uint32.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key+subkey,1u+key,subkey+2u
+FROM Input \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/add_uint64.cfg b/yt/yql/tests/sql/suites/blocks/add_uint64.cfg
new file mode 100644
index 0000000000..5ee9471fc0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_uint64.cfg
@@ -0,0 +1 @@
+in Input input_uint64.txt
diff --git a/yt/yql/tests/sql/suites/blocks/add_uint64.sql b/yt/yql/tests/sql/suites/blocks/add_uint64.sql
new file mode 100644
index 0000000000..7671b7667d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_uint64.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key+subkey,1ul+key,subkey+2ul
+FROM Input \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/add_uint64_opt.cfg b/yt/yql/tests/sql/suites/blocks/add_uint64_opt.cfg
new file mode 100644
index 0000000000..317b76e3a7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_uint64_opt.cfg
@@ -0,0 +1 @@
+in Input input_uint64_opt.txt
diff --git a/yt/yql/tests/sql/suites/blocks/add_uint64_opt.sql b/yt/yql/tests/sql/suites/blocks/add_uint64_opt.sql
new file mode 100644
index 0000000000..7671b7667d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_uint64_opt.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key+subkey,1ul+key,subkey+2ul
+FROM Input \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/add_uint64_opt2.cfg b/yt/yql/tests/sql/suites/blocks/add_uint64_opt2.cfg
new file mode 100644
index 0000000000..46fee85c7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_uint64_opt2.cfg
@@ -0,0 +1 @@
+in Input input_uint64_opt2.txt
diff --git a/yt/yql/tests/sql/suites/blocks/add_uint64_opt2.sql b/yt/yql/tests/sql/suites/blocks/add_uint64_opt2.sql
new file mode 100644
index 0000000000..7671b7667d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_uint64_opt2.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key+subkey,1ul+key,subkey+2ul
+FROM Input \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/add_uint8.cfg b/yt/yql/tests/sql/suites/blocks/add_uint8.cfg
new file mode 100644
index 0000000000..cd9448c29c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_uint8.cfg
@@ -0,0 +1 @@
+in Input input_uint8.txt
diff --git a/yt/yql/tests/sql/suites/blocks/add_uint8.sql b/yt/yql/tests/sql/suites/blocks/add_uint8.sql
new file mode 100644
index 0000000000..b757039a48
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/add_uint8.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key+subkey,1ut+key,subkey+2ut
+FROM Input \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/bitcast_block.cfg b/yt/yql/tests/sql/suites/blocks/bitcast_block.cfg
new file mode 100644
index 0000000000..e8dbb42122
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/bitcast_block.cfg
@@ -0,0 +1 @@
+in Input input_uint8_big.txt
diff --git a/yt/yql/tests/sql/suites/blocks/bitcast_block.sql b/yt/yql/tests/sql/suites/blocks/bitcast_block.sql
new file mode 100644
index 0000000000..596b3d0f4a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/bitcast_block.sql
@@ -0,0 +1,3 @@
+USE plato;
+
+select key+1l from Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/bitcast_scalar.cfg b/yt/yql/tests/sql/suites/blocks/bitcast_scalar.cfg
new file mode 100644
index 0000000000..e8dbb42122
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/bitcast_scalar.cfg
@@ -0,0 +1 @@
+in Input input_uint8_big.txt
diff --git a/yt/yql/tests/sql/suites/blocks/bitcast_scalar.sql b/yt/yql/tests/sql/suites/blocks/bitcast_scalar.sql
new file mode 100644
index 0000000000..478d1af333
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/bitcast_scalar.sql
@@ -0,0 +1,3 @@
+USE plato;
+
+select key+1t from Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/block_input.cfg b/yt/yql/tests/sql/suites/blocks/block_input.cfg
new file mode 100644
index 0000000000..426917836b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/block_input.cfg
@@ -0,0 +1,2 @@
+in Input input_strings.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/blocks/block_input.sql b/yt/yql/tests/sql/suites/blocks/block_input.sql
new file mode 100644
index 0000000000..50749842db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/block_input.sql
@@ -0,0 +1,11 @@
+USE plato;
+
+PRAGMA yt.JobBlockInput;
+
+SELECT
+ key,
+ subkey,
+ "value: " || value AS value,
+FROM Input
+WHERE key < "100"
+ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/blocks/block_input_sys_columns.cfg b/yt/yql/tests/sql/suites/blocks/block_input_sys_columns.cfg
new file mode 100644
index 0000000000..5017087a09
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/block_input_sys_columns.cfg
@@ -0,0 +1,3 @@
+in Input1 input1.txt
+in Input2 input2.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/blocks/block_input_sys_columns.sql b/yt/yql/tests/sql/suites/blocks/block_input_sys_columns.sql
new file mode 100644
index 0000000000..2ab38cdf00
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/block_input_sys_columns.sql
@@ -0,0 +1,18 @@
+USE plato;
+
+PRAGMA yt.JobBlockInput;
+
+$a = (
+ SELECT TableName() AS table_name, TableRecordIndex() AS record_index, Input1.* FROM Input1
+ UNION ALL
+ SELECT TableName() AS table_name, TableRecordIndex() AS record_index, Input2.* FROM Input2
+);
+
+$b = (
+ SELECT * FROM Input1 AS users
+ UNION ALL
+ SELECT * FROM Input2 AS users
+);
+
+SELECT * FROM $a ORDER BY table_name, record_index;
+SELECT ROW_NUMBER() OVER () AS row_num, b.* FROM $b AS b ORDER BY row_num;
diff --git a/yt/yql/tests/sql/suites/blocks/block_input_various_types-v3.cfg b/yt/yql/tests/sql/suites/blocks/block_input_various_types-v3.cfg
new file mode 100644
index 0000000000..6c3e597275
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/block_input_various_types-v3.cfg
@@ -0,0 +1,3 @@
+in Input block_input_various_types_v3.txt
+providers yt
+pragma yt.UseNativeYtTypes
diff --git a/yt/yql/tests/sql/suites/blocks/block_input_various_types.cfg b/yt/yql/tests/sql/suites/blocks/block_input_various_types.cfg
new file mode 100644
index 0000000000..0c5560da7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/block_input_various_types.cfg
@@ -0,0 +1,2 @@
+in Input block_input_various_types.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/blocks/block_input_various_types.sql b/yt/yql/tests/sql/suites/blocks/block_input_various_types.sql
new file mode 100644
index 0000000000..dfd793d765
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/block_input_various_types.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+PRAGMA yt.JobBlockInput;
+
+SELECT * FROM Input WHERE `int64` > 10;
diff --git a/yt/yql/tests/sql/suites/blocks/block_input_various_types.txt.attr b/yt/yql/tests/sql/suites/blocks/block_input_various_types.txt.attr
new file mode 100644
index 0000000000..2b89fecf21
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/block_input_various_types.txt.attr
@@ -0,0 +1,182 @@
+{
+ "_yql_row_spec" = {
+ "NativeYtTypeFlags" = 0u;
+ "StrictSchema" = %true;
+ "Type" = [
+ "StructType";
+ [
+ [
+ "bool";
+ [
+ "DataType";
+ "Bool";
+ ];
+ ];
+ [
+ "optionalDouble";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Double";
+ ];
+ ];
+ ];
+ [
+ "string";
+ [
+ "DataType";
+ "String";
+ ];
+ ];
+ [
+ "tuple";
+ [
+ "TupleType";
+ [
+ [
+ "DataType";
+ "Int64";
+ ];
+ [
+ "DataType";
+ "String";
+ ];
+ [
+ "DataType";
+ "Bool";
+ ];
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Double";
+ ];
+ ];
+ [
+ "DataType";
+ "Utf8";
+ ];
+ ];
+ ];
+ ];
+ [
+ "int64";
+ [
+ "DataType";
+ "Int64";
+ ];
+ ];
+ [
+ "utf8";
+ [
+ "DataType";
+ "Utf8";
+ ];
+ ];
+ [
+ "yson";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Yson";
+ ];
+ ];
+ ];
+ ];
+ ];
+ "TypePatch" = [
+ "StructType";
+ [
+ [
+ "tuple";
+ [
+ "TupleType";
+ [
+ [
+ "DataType";
+ "Int64";
+ ];
+ [
+ "DataType";
+ "String";
+ ];
+ [
+ "DataType";
+ "Bool";
+ ];
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Double";
+ ];
+ ];
+ [
+ "DataType";
+ "Utf8";
+ ];
+ ];
+ ];
+ ];
+ ];
+ ];
+ };
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "name" = "bool";
+ "required" = %true;
+ "type" = "boolean";
+ "type_v3" = "bool";
+ };
+ {
+ "name" = "optionalDouble";
+ "required" = %false;
+ "type" = "double";
+ "type_v3" = {
+ "type_name" = "optional";
+ "item" = "double";
+ };
+ };
+ {
+ "name" = "string";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "tuple";
+ "required" = %false;
+ "type" = "any";
+ "type_v3" = {
+ "type_name" = "optional";
+ "item" = "yson";
+ };
+ };
+ {
+ "name" = "int64";
+ "required" = %true;
+ "type" = "int64";
+ "type_v3" = "int64";
+ };
+ {
+ "name" = "utf8";
+ "required" = %true;
+ "type" = "utf8";
+ "type_v3" = "utf8";
+ };
+ {
+ "name" = "yson";
+ "required" = %false;
+ "type" = "any";
+ "type_v3" = {
+ "type_name" = "optional";
+ "item" = "yson";
+ };
+ };
+ ];
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/block_input_various_types_v3.txt.attr b/yt/yql/tests/sql/suites/blocks/block_input_various_types_v3.txt.attr
new file mode 100644
index 0000000000..4f3264e5e5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/block_input_various_types_v3.txt.attr
@@ -0,0 +1,77 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "name" = "bool";
+ "required" = %true;
+ "type" = "boolean";
+ "type_v3" = "bool";
+ };
+ {
+ "name" = "optionalDouble";
+ "required" = %false;
+ "type" = "double";
+ "type_v3" = {
+ "type_name" = "optional";
+ "item" = "double";
+ };
+ };
+ {
+ "name" = "string";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "tuple";
+ "required" = %true;
+ "type" = "any";
+ "type_v3" = {
+ "type_name" = "tuple";
+ "elements" = [
+ {
+ "type" = "int64";
+ };
+ {
+ "type" = "string";
+ };
+ {
+ "type" = "bool";
+ };
+ {
+ "type" = {
+ "type_name" = "optional";
+ "item" = "double";
+ };
+ };
+ {
+ "type" = "utf8";
+ };
+ ];
+ };
+ };
+ {
+ "name" = "int64";
+ "required" = %true;
+ "type" = "int64";
+ "type_v3" = "int64";
+ };
+ {
+ "name" = "utf8";
+ "required" = %true;
+ "type" = "utf8";
+ "type_v3" = "utf8";
+ };
+ {
+ "name" = "yson";
+ "required" = %false;
+ "type" = "any";
+ "type_v3" = {
+ "type_name" = "optional";
+ "item" = "yson";
+ };
+ };
+ ];
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/block_output_various_types.cfg b/yt/yql/tests/sql/suites/blocks/block_output_various_types.cfg
new file mode 100644
index 0000000000..0c5560da7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/block_output_various_types.cfg
@@ -0,0 +1,2 @@
+in Input block_input_various_types.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/blocks/block_output_various_types.sql b/yt/yql/tests/sql/suites/blocks/block_output_various_types.sql
new file mode 100644
index 0000000000..e81ef86772
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/block_output_various_types.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+PRAGMA yt.JobBlockOutput='force';
+PRAGMA yt.JobBlockOutputSupportedDataTypes="Bool,Double,String,Int64,Utf8,Yson";
+
+SELECT `bool`, `optionalDouble`, `string`, `int64`, `utf8`, `yson` FROM Input WHERE `int64` > 10;
diff --git a/yt/yql/tests/sql/suites/blocks/boolean_ops.cfg b/yt/yql/tests/sql/suites/blocks/boolean_ops.cfg
new file mode 100644
index 0000000000..490bd1a7a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/boolean_ops.cfg
@@ -0,0 +1 @@
+in Input input_bools.txt
diff --git a/yt/yql/tests/sql/suites/blocks/boolean_ops.sql b/yt/yql/tests/sql/suites/blocks/boolean_ops.sql
new file mode 100644
index 0000000000..e0a8c581aa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/boolean_ops.sql
@@ -0,0 +1,27 @@
+USE plato;
+
+select
+ key,
+ b1 and b2 as abb,
+ b2 and ob1 as abo,
+ ob2 and b1 as aob,
+ ob1 and ob2 as aoo,
+
+ b1 or b2 as obb,
+ b2 or ob1 as obo,
+ ob2 or b1 as oob,
+ ob1 or ob2 as ooo,
+
+ b1 xor b2 as xbb,
+ b2 xor ob1 as xbo,
+ ob2 xor b1 as xob,
+ ob1 xor ob2 as xoo,
+
+ (1 > 2) and b1 and b2 and ob1 and ob2 as chain1,
+ (1 < 2) xor b1 xor b2 xor ob1 xor ob2 as chain2,
+ (1/0 < 1) or b1 or b2 or ob1 or ob2 as chain3,
+
+
+from Input
+
+order by key;
diff --git a/yt/yql/tests/sql/suites/blocks/coalesce_bools.cfg b/yt/yql/tests/sql/suites/blocks/coalesce_bools.cfg
new file mode 100644
index 0000000000..490bd1a7a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/coalesce_bools.cfg
@@ -0,0 +1 @@
+in Input input_bools.txt
diff --git a/yt/yql/tests/sql/suites/blocks/coalesce_bools.sql b/yt/yql/tests/sql/suites/blocks/coalesce_bools.sql
new file mode 100644
index 0000000000..2c3ffabb1a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/coalesce_bools.sql
@@ -0,0 +1,16 @@
+USE plato;
+
+select
+ key,
+ ob1 ?? b1,
+ ob1 ?? false,
+ ob1 ?? (1/0 > 0),
+ (1/2 > 0) ?? ob1,
+ (1/2 == 0) ?? b1,
+ (key/0 >= 0) ?? true,
+ (key/0 >= 0) ?? b1,
+ (key/2 >= 0) ?? false,
+
+from Input
+
+order by key;
diff --git a/yt/yql/tests/sql/suites/blocks/coalesce_complex.sql b/yt/yql/tests/sql/suites/blocks/coalesce_complex.sql
new file mode 100644
index 0000000000..576394292f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/coalesce_complex.sql
@@ -0,0 +1,37 @@
+USE plato;
+
+$strings = [
+ <|key:Just(Just("foo")), subkey:Just("bar"), value:1|>,
+ <|key:Just(Nothing(String?)), subkey:Just("two"), value:2|>,
+ <|key:Nothing(String??), subkey:Just("three"), value:3|>,
+ <|key:Nothing(String??), subkey:Nothing(String?), value:4|>,
+];
+
+$tuples = [
+ <|key:Just(Just(AsTuple(1, 2))), subkey:Just(AsTuple(3, 4)), value:1|>,
+ <|key:Just(Nothing(Tuple<Int, Int>?)), subkey:Just(AsTuple(4, 5)), value:2|>,
+ <|key:Nothing(Tuple<Int, Int>??), subkey:Just(AsTuple(5, 6)), value:3|>,
+ <|key:Nothing(Tuple<Int, Int>??), subkey:Nothing(Tuple<Int, Int>?), value:4|>,
+];
+
+insert into @strings
+select * from as_table($strings);
+
+insert into @tuples
+select * from as_table($tuples);
+
+commit;
+
+select
+ value,
+ key ?? subkey,
+ subkey ?? "xxx",
+from @strings
+order by value;
+
+select
+ value,
+ key ?? subkey,
+ subkey ?? AsTuple(100, 500),
+from @tuples
+order by value;
diff --git a/yt/yql/tests/sql/suites/blocks/coalesce_ints.cfg b/yt/yql/tests/sql/suites/blocks/coalesce_ints.cfg
new file mode 100644
index 0000000000..c1251bbbeb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/coalesce_ints.cfg
@@ -0,0 +1 @@
+in Input input_int32_opt.txt
diff --git a/yt/yql/tests/sql/suites/blocks/coalesce_ints.sql b/yt/yql/tests/sql/suites/blocks/coalesce_ints.sql
new file mode 100644
index 0000000000..b726fbdd66
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/coalesce_ints.sql
@@ -0,0 +1,16 @@
+USE plato;
+
+select
+ k1,
+ k2 ?? k1,
+ k2 ?? 0,
+ k2 ?? 1/0,
+ 1/2 ?? k2,
+ 1/2 ?? k1,
+ k1/0 ?? 1,
+ k1/0 ?? k1,
+ k1/2 ?? 0,
+from Input
+
+order by k1;
+
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_avg.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_avg.cfg
new file mode 100644
index 0000000000..5ee9471fc0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_avg.cfg
@@ -0,0 +1 @@
+in Input input_uint64.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_avg.sql b/yt/yql/tests/sql/suites/blocks/combine_all_avg.sql
new file mode 100644
index 0000000000..51932b0be2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_avg.sql
@@ -0,0 +1,13 @@
+USE plato;
+
+SELECT
+ avg(key),
+ avg(cast(key as int8)),
+ avg(cast(key as uint16)),
+ avg(cast(key as int32)),
+ avg(1u/0u),
+ avg(2),
+ avg(if(key=10u,key)),
+ avg(if(key=100u,key)),
+ avg(key=10u)
+FROM Input \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_avg_filter.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_avg_filter.cfg
new file mode 100644
index 0000000000..9ffe747df9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_avg_filter.cfg
@@ -0,0 +1 @@
+in Input input_uint64_filter.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_avg_filter.sql b/yt/yql/tests/sql/suites/blocks/combine_all_avg_filter.sql
new file mode 100644
index 0000000000..11a70fb362
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_avg_filter.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+SELECT
+ avg(key)
+FROM Input
+WHERE subkey!=5 \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_avg_filter_opt.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_avg_filter_opt.cfg
new file mode 100644
index 0000000000..eee6dd16f6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_avg_filter_opt.cfg
@@ -0,0 +1 @@
+in Input input_uint64_filter_opt.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_avg_filter_opt.sql b/yt/yql/tests/sql/suites/blocks/combine_all_avg_filter_opt.sql
new file mode 100644
index 0000000000..11a70fb362
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_avg_filter_opt.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+SELECT
+ avg(key)
+FROM Input
+WHERE subkey!=5 \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_count.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_count.cfg
new file mode 100644
index 0000000000..5ee9471fc0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_count.cfg
@@ -0,0 +1 @@
+in Input input_uint64.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_count.sql b/yt/yql/tests/sql/suites/blocks/combine_all_count.sql
new file mode 100644
index 0000000000..648f1f4f96
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_count.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+SELECT
+ count(*),
+ count(key + 1u/(4u-subkey)),
+ count(key),
+ count(1u),
+ count(1u/0u)
+FROM Input \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_count_filter.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_count_filter.cfg
new file mode 100644
index 0000000000..9ffe747df9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_count_filter.cfg
@@ -0,0 +1 @@
+in Input input_uint64_filter.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_count_filter.sql b/yt/yql/tests/sql/suites/blocks/combine_all_count_filter.sql
new file mode 100644
index 0000000000..84d84410e6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_count_filter.sql
@@ -0,0 +1,7 @@
+USE plato;
+
+SELECT
+ count(*),
+ count(key)
+FROM Input
+WHERE subkey!=5 \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_count_filter_opt.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_count_filter_opt.cfg
new file mode 100644
index 0000000000..eee6dd16f6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_count_filter_opt.cfg
@@ -0,0 +1 @@
+in Input input_uint64_filter_opt.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_count_filter_opt.sql b/yt/yql/tests/sql/suites/blocks/combine_all_count_filter_opt.sql
new file mode 100644
index 0000000000..84d84410e6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_count_filter_opt.sql
@@ -0,0 +1,7 @@
+USE plato;
+
+SELECT
+ count(*),
+ count(key)
+FROM Input
+WHERE subkey!=5 \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_decimal.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_decimal.cfg
new file mode 100644
index 0000000000..a21c6560ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_decimal.cfg
@@ -0,0 +1 @@
+in Input input_decimal.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_decimal.sql b/yt/yql/tests/sql/suites/blocks/combine_all_decimal.sql
new file mode 100644
index 0000000000..1085d83900
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_decimal.sql
@@ -0,0 +1,15 @@
+use plato;
+
+SELECT
+ count(cs_ext_list_price),
+ sum(cs_ext_tax),
+ sum(cs_ext_list_price),
+ min(cs_sales_price),
+ max(cs_ext_list_price),
+ avg(cs_ext_tax),
+
+ sum(cast(cs_sales_price as float)),
+ min(cast(cs_ext_list_price as float)),
+ max(cast(cs_ext_tax as float)),
+ avg(cast(cs_sales_price as float))
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_decimal_max.sql b/yt/yql/tests/sql/suites/blocks/combine_all_decimal_max.sql
new file mode 100644
index 0000000000..7119d3dc79
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_decimal_max.sql
@@ -0,0 +1,9 @@
+use plato;
+
+SELECT
+ sum(x),
+ avg(x)
+FROM (values
+ (Decimal("99999999999999999999999999999999999",35,0)),
+ (Decimal("1",35,0))
+) as a(x)
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_max.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_max.cfg
new file mode 100644
index 0000000000..5ee9471fc0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_max.cfg
@@ -0,0 +1 @@
+in Input input_uint64.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_max.sql b/yt/yql/tests/sql/suites/blocks/combine_all_max.sql
new file mode 100644
index 0000000000..a57479a251
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_max.sql
@@ -0,0 +1,19 @@
+USE plato;
+
+SELECT
+ max(key),
+ max(cast(key as int8)),
+ max(cast(key as uint16)),
+ max(cast(key as int32)),
+ max(1u/0u),
+ max(2),
+ max(if(key=10u,key)),
+ max(if(key=100u,key)),
+ max(false),
+ max(key=10u),
+ max(key>=10u),
+ max(key=20u),
+ max(if(key=10u,true)),
+ max(if(key=100u,true)),
+ max(if(key>=10u,true)),
+FROM Input \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_max_filter.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_max_filter.cfg
new file mode 100644
index 0000000000..9ffe747df9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_max_filter.cfg
@@ -0,0 +1 @@
+in Input input_uint64_filter.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_max_filter.sql b/yt/yql/tests/sql/suites/blocks/combine_all_max_filter.sql
new file mode 100644
index 0000000000..60f4dcc7a9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_max_filter.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+SELECT
+ max(key)
+FROM Input
+WHERE subkey!=5 \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_max_filter_opt.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_max_filter_opt.cfg
new file mode 100644
index 0000000000..eee6dd16f6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_max_filter_opt.cfg
@@ -0,0 +1 @@
+in Input input_uint64_filter_opt.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_max_filter_opt.sql b/yt/yql/tests/sql/suites/blocks/combine_all_max_filter_opt.sql
new file mode 100644
index 0000000000..60f4dcc7a9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_max_filter_opt.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+SELECT
+ max(key)
+FROM Input
+WHERE subkey!=5 \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_min.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_min.cfg
new file mode 100644
index 0000000000..5ee9471fc0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_min.cfg
@@ -0,0 +1 @@
+in Input input_uint64.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_min.sql b/yt/yql/tests/sql/suites/blocks/combine_all_min.sql
new file mode 100644
index 0000000000..7c7ee6ce15
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_min.sql
@@ -0,0 +1,19 @@
+USE plato;
+
+SELECT
+ min(key),
+ min(cast(key as int8)),
+ min(cast(key as uint16)),
+ min(cast(key as int32)),
+ min(1u/0u),
+ min(2),
+ min(if(key=10u,key)),
+ min(if(key=100u,key)),
+ min(false),
+ min(key=10u),
+ min(key>=10u),
+ min(key=20u),
+ min(if(key=10u,true)),
+ min(if(key=100u,true)),
+ min(if(key>=10u,true)),
+FROM Input \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_min_filter.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_min_filter.cfg
new file mode 100644
index 0000000000..9ffe747df9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_min_filter.cfg
@@ -0,0 +1 @@
+in Input input_uint64_filter.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_min_filter.sql b/yt/yql/tests/sql/suites/blocks/combine_all_min_filter.sql
new file mode 100644
index 0000000000..7ec8330637
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_min_filter.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+SELECT
+ min(key)
+FROM Input
+WHERE subkey!=5 \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_min_filter_opt.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_min_filter_opt.cfg
new file mode 100644
index 0000000000..eee6dd16f6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_min_filter_opt.cfg
@@ -0,0 +1 @@
+in Input input_uint64_filter_opt.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_min_filter_opt.sql b/yt/yql/tests/sql/suites/blocks/combine_all_min_filter_opt.sql
new file mode 100644
index 0000000000..7ec8330637
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_min_filter_opt.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+SELECT
+ min(key)
+FROM Input
+WHERE subkey!=5 \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_minmax_double.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_minmax_double.cfg
new file mode 100644
index 0000000000..3777ee5eac
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_minmax_double.cfg
@@ -0,0 +1 @@
+in Input input_double.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_minmax_double.sql b/yt/yql/tests/sql/suites/blocks/combine_all_minmax_double.sql
new file mode 100644
index 0000000000..0587e68053
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_minmax_double.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+select
+ min(subkey),
+ max(subkey),
+from Input;
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_minmax_nested.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_minmax_nested.cfg
new file mode 100644
index 0000000000..b892bc468d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_minmax_nested.cfg
@@ -0,0 +1 @@
+in Input input_nested.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_minmax_nested.sql b/yt/yql/tests/sql/suites/blocks/combine_all_minmax_nested.sql
new file mode 100644
index 0000000000..81bab54a42
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_minmax_nested.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+select
+ min(value),
+ max(value),
+from Input;
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_pg.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_pg.cfg
new file mode 100644
index 0000000000..72b51dc777
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_pg.cfg
@@ -0,0 +1 @@
+in Input input_pg.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_pg.sql b/yt/yql/tests/sql/suites/blocks/combine_all_pg.sql
new file mode 100644
index 0000000000..a9dc82d763
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_pg.sql
@@ -0,0 +1,17 @@
+use plato;
+pragma yt.UsePartitionsByKeysForFinalAgg="false";
+
+SELECT
+ Pg::count(),
+ Pg::count(a),
+ Pg::sum(c),
+ Pg::min(a),
+ Pg::max(a),
+ Pg::min(c),
+ Pg::max(c),
+ Pg::avg(c),
+ Pg::avg(PgCast(1p,pgint4)),
+ Pg::avg(PgCast(1p,pgint8)),
+ Pg::avg(PgCast(1p,pgfloat8)),
+ Pg::regr_count(1.0p,1.0p)
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_pg_filter.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_pg_filter.cfg
new file mode 100644
index 0000000000..72b51dc777
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_pg_filter.cfg
@@ -0,0 +1 @@
+in Input input_pg.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_pg_filter.sql b/yt/yql/tests/sql/suites/blocks/combine_all_pg_filter.sql
new file mode 100644
index 0000000000..e20350e0c3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_pg_filter.sql
@@ -0,0 +1,14 @@
+use plato;
+pragma yt.UsePartitionsByKeysForFinalAgg="false";
+
+SELECT
+ Pg::count(),
+ Pg::count(a),
+ Pg::sum(c),
+ Pg::min(a),
+ Pg::max(a),
+ Pg::min(c),
+ Pg::max(c),
+ Pg::avg(c),
+FROM Input
+where d="aaa" \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_some.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_some.cfg
new file mode 100644
index 0000000000..5ee9471fc0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_some.cfg
@@ -0,0 +1 @@
+in Input input_uint64.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_some.sql b/yt/yql/tests/sql/suites/blocks/combine_all_some.sql
new file mode 100644
index 0000000000..5969668a66
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_some.sql
@@ -0,0 +1,19 @@
+USE plato;
+
+SELECT
+ some(key),
+ some(cast(key as int8)),
+ some(cast(key as uint16)),
+ some(cast(key as int32)),
+ some(1u/0u),
+ some(2),
+ some(if(key=10u,key)),
+ some(if(key=100u,key)),
+ some(false),
+ some(key=10u),
+ some(key>=10u),
+ some(key=20u),
+ some(if(key=10u,true)),
+ some(if(key=100u,true)),
+ some(if(key>=10u,true)),
+FROM Input \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_some_filter.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_some_filter.cfg
new file mode 100644
index 0000000000..9ffe747df9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_some_filter.cfg
@@ -0,0 +1 @@
+in Input input_uint64_filter.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_some_filter.sql b/yt/yql/tests/sql/suites/blocks/combine_all_some_filter.sql
new file mode 100644
index 0000000000..de639a661e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_some_filter.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+SELECT
+ some(key)
+FROM Input
+WHERE subkey!=5 \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_sum.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_sum.cfg
new file mode 100644
index 0000000000..5ee9471fc0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_sum.cfg
@@ -0,0 +1 @@
+in Input input_uint64.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_sum.sql b/yt/yql/tests/sql/suites/blocks/combine_all_sum.sql
new file mode 100644
index 0000000000..5e71baec72
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_sum.sql
@@ -0,0 +1,12 @@
+USE plato;
+
+SELECT
+ sum(key),
+ sum(cast(key as int8)),
+ sum(cast(key as uint16)),
+ sum(cast(key as int32)),
+ sum(1u/0u),
+ sum(2),
+ sum(if(key=10u,key)),
+ sum(if(key=100u,key))
+FROM Input \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_sum_filter.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_sum_filter.cfg
new file mode 100644
index 0000000000..9ffe747df9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_sum_filter.cfg
@@ -0,0 +1 @@
+in Input input_uint64_filter.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_sum_filter.sql b/yt/yql/tests/sql/suites/blocks/combine_all_sum_filter.sql
new file mode 100644
index 0000000000..e61f9c708a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_sum_filter.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+SELECT
+ sum(key)
+FROM Input
+WHERE subkey!=5 \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_sum_filter_opt.cfg b/yt/yql/tests/sql/suites/blocks/combine_all_sum_filter_opt.cfg
new file mode 100644
index 0000000000..eee6dd16f6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_sum_filter_opt.cfg
@@ -0,0 +1 @@
+in Input input_uint64_filter_opt.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_all_sum_filter_opt.sql b/yt/yql/tests/sql/suites/blocks/combine_all_sum_filter_opt.sql
new file mode 100644
index 0000000000..7ec8330637
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_all_sum_filter_opt.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+SELECT
+ min(key)
+FROM Input
+WHERE subkey!=5 \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_avg.cfg b/yt/yql/tests/sql/suites/blocks/combine_hashed_avg.cfg
new file mode 100644
index 0000000000..57e52ccabb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_avg.cfg
@@ -0,0 +1 @@
+in Input input_hashed_uint32.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_avg.sql b/yt/yql/tests/sql/suites/blocks/combine_hashed_avg.sql
new file mode 100644
index 0000000000..8954e98fee
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_avg.sql
@@ -0,0 +1,11 @@
+USE plato;
+
+SELECT
+ key,
+ avg(1u/(4u-subkey)),
+ avg(subkey),
+ avg(1u),
+ avg(1u/0u)
+FROM Input
+GROUP by key
+ORDER by key \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_count.cfg b/yt/yql/tests/sql/suites/blocks/combine_hashed_count.cfg
new file mode 100644
index 0000000000..57e52ccabb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_count.cfg
@@ -0,0 +1 @@
+in Input input_hashed_uint32.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_count.sql b/yt/yql/tests/sql/suites/blocks/combine_hashed_count.sql
new file mode 100644
index 0000000000..2350c5df47
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_count.sql
@@ -0,0 +1,12 @@
+USE plato;
+
+SELECT
+ key,
+ count(*),
+ count(1u/(4u-subkey)),
+ count(subkey),
+ count(1u),
+ count(1u/0u)
+FROM Input
+GROUP by key
+ORDER by key \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_count_filter.cfg b/yt/yql/tests/sql/suites/blocks/combine_hashed_count_filter.cfg
new file mode 100644
index 0000000000..57e52ccabb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_count_filter.cfg
@@ -0,0 +1 @@
+in Input input_hashed_uint32.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_count_filter.sql b/yt/yql/tests/sql/suites/blocks/combine_hashed_count_filter.sql
new file mode 100644
index 0000000000..be51a39a1b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_count_filter.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+SELECT
+ key,
+ count(*),
+FROM Input
+WHERE subkey!=4
+GROUP by key
+ORDER by key \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_max.cfg b/yt/yql/tests/sql/suites/blocks/combine_hashed_max.cfg
new file mode 100644
index 0000000000..57e52ccabb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_max.cfg
@@ -0,0 +1 @@
+in Input input_hashed_uint32.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_max.sql b/yt/yql/tests/sql/suites/blocks/combine_hashed_max.sql
new file mode 100644
index 0000000000..5719f8c8ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_max.sql
@@ -0,0 +1,11 @@
+USE plato;
+
+SELECT
+ key,
+ max(1u/(4u-subkey)),
+ max(subkey),
+ max(1u),
+ max(1u/0u)
+FROM Input
+GROUP by key
+ORDER by key \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_min.cfg b/yt/yql/tests/sql/suites/blocks/combine_hashed_min.cfg
new file mode 100644
index 0000000000..57e52ccabb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_min.cfg
@@ -0,0 +1 @@
+in Input input_hashed_uint32.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_min.sql b/yt/yql/tests/sql/suites/blocks/combine_hashed_min.sql
new file mode 100644
index 0000000000..5bf681ef9e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_min.sql
@@ -0,0 +1,11 @@
+USE plato;
+
+SELECT
+ key,
+ min(1u/(4u-subkey)),
+ min(subkey),
+ min(1u),
+ min(1u/0u)
+FROM Input
+GROUP by key
+ORDER by key \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_minmax_double.cfg b/yt/yql/tests/sql/suites/blocks/combine_hashed_minmax_double.cfg
new file mode 100644
index 0000000000..3777ee5eac
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_minmax_double.cfg
@@ -0,0 +1 @@
+in Input input_double.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_minmax_double.sql b/yt/yql/tests/sql/suites/blocks/combine_hashed_minmax_double.sql
new file mode 100644
index 0000000000..149e38e883
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_minmax_double.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+select
+ key,
+ min(subkey),
+ max(subkey),
+from Input
+group by key
+order by key;
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_minmax_nested.cfg b/yt/yql/tests/sql/suites/blocks/combine_hashed_minmax_nested.cfg
new file mode 100644
index 0000000000..b892bc468d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_minmax_nested.cfg
@@ -0,0 +1 @@
+in Input input_nested.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_minmax_nested.sql b/yt/yql/tests/sql/suites/blocks/combine_hashed_minmax_nested.sql
new file mode 100644
index 0000000000..8070935f87
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_minmax_nested.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+select
+ key,
+ min(value),
+ max(value),
+from Input
+group by key
+order by key;
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_pg.cfg b/yt/yql/tests/sql/suites/blocks/combine_hashed_pg.cfg
new file mode 100644
index 0000000000..72b51dc777
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_pg.cfg
@@ -0,0 +1 @@
+in Input input_pg.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_pg.sql b/yt/yql/tests/sql/suites/blocks/combine_hashed_pg.sql
new file mode 100644
index 0000000000..7c8c52aab7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_pg.sql
@@ -0,0 +1,18 @@
+use plato;
+pragma yt.UsePartitionsByKeysForFinalAgg="false";
+
+SELECT
+ Pg::count(),
+ Pg::count(a),
+ Pg::sum(c),
+ Pg::min(a),
+ Pg::max(a),
+ Pg::min(c),
+ Pg::max(c),
+ Pg::avg(c),
+ Pg::avg(PgCast(1p,pgint4)),
+ Pg::avg(PgCast(1p,pgint8)),
+ Pg::avg(PgCast(1p,pgfloat8)),
+ Pg::regr_count(1.0p,1.0p)
+FROM Input
+group by len(d)
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_set.cfg b/yt/yql/tests/sql/suites/blocks/combine_hashed_set.cfg
new file mode 100644
index 0000000000..57e52ccabb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_set.cfg
@@ -0,0 +1 @@
+in Input input_hashed_uint32.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_set.sql b/yt/yql/tests/sql/suites/blocks/combine_hashed_set.sql
new file mode 100644
index 0000000000..ffe4ee0c2e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_set.sql
@@ -0,0 +1,7 @@
+USE plato;
+
+SELECT
+ key
+FROM Input
+GROUP by key
+ORDER by key;
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_some.cfg b/yt/yql/tests/sql/suites/blocks/combine_hashed_some.cfg
new file mode 100644
index 0000000000..57e52ccabb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_some.cfg
@@ -0,0 +1 @@
+in Input input_hashed_uint32.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_some.sql b/yt/yql/tests/sql/suites/blocks/combine_hashed_some.sql
new file mode 100644
index 0000000000..6fcca795a6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_some.sql
@@ -0,0 +1,11 @@
+USE plato;
+
+SELECT
+ key,
+ some(1u/(4u-subkey)),
+ some(subkey),
+ some(1u),
+ some(1u/0u)
+FROM Input
+GROUP by key
+ORDER by key \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_sum.cfg b/yt/yql/tests/sql/suites/blocks/combine_hashed_sum.cfg
new file mode 100644
index 0000000000..57e52ccabb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_sum.cfg
@@ -0,0 +1 @@
+in Input input_hashed_uint32.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_sum.sql b/yt/yql/tests/sql/suites/blocks/combine_hashed_sum.sql
new file mode 100644
index 0000000000..9c2fc31ab4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_sum.sql
@@ -0,0 +1,11 @@
+USE plato;
+
+SELECT
+ key,
+ sum(1u/(4u-subkey)),
+ sum(subkey),
+ sum(1u),
+ sum(1u/0u)
+FROM Input
+GROUP by key
+ORDER by key \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_sum_many_keys.cfg b/yt/yql/tests/sql/suites/blocks/combine_hashed_sum_many_keys.cfg
new file mode 100644
index 0000000000..57e52ccabb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_sum_many_keys.cfg
@@ -0,0 +1 @@
+in Input input_hashed_uint32.txt
diff --git a/yt/yql/tests/sql/suites/blocks/combine_hashed_sum_many_keys.sql b/yt/yql/tests/sql/suites/blocks/combine_hashed_sum_many_keys.sql
new file mode 100644
index 0000000000..0c7e8688f6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/combine_hashed_sum_many_keys.sql
@@ -0,0 +1,46 @@
+USE plato;
+
+SELECT
+ k1,
+ sum(subkey)
+FROM Input
+GROUP by key + 1u as k1
+ORDER by k1;
+
+SELECT
+ k1,
+ k2,
+ sum(subkey)
+FROM Input
+GROUP by key + 1u as k1, key + 2u as k2
+ORDER by k1, k2;
+
+SELECT
+ k1,
+ k2,
+ k3,
+ sum(subkey)
+FROM Input
+GROUP by key + 1u as k1, key + 2u as k2, key + 3u as k3
+ORDER by k1, k2, k3;
+
+SELECT
+ k1,
+ k2,
+ k3,
+ k4,
+ sum(subkey)
+FROM Input
+GROUP by key + 1u as k1, key + 2u as k2, key + 3u as k3, key + 4u as k4
+ORDER by k1, k2, k3, k4;
+
+SELECT
+ k1,
+ k2,
+ k3,
+ k4,
+ k5,
+ sum(subkey)
+FROM Input
+GROUP by key + 1u as k1, key + 2u as k2, key + 3u as k3, key + 4u as k4, key + 5u as k5
+ORDER by k1, k2, k3, k4, k5;
diff --git a/yt/yql/tests/sql/suites/blocks/compare.cfg b/yt/yql/tests/sql/suites/blocks/compare.cfg
new file mode 100644
index 0000000000..3d3fea34e7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/compare.cfg
@@ -0,0 +1 @@
+in Input input_allnums.txt
diff --git a/yt/yql/tests/sql/suites/blocks/compare.sql b/yt/yql/tests/sql/suites/blocks/compare.sql
new file mode 100644
index 0000000000..a0e0d5e5b7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/compare.sql
@@ -0,0 +1,24 @@
+select
+ i8,
+ i16 == i32,
+ i32 != ui8,
+ ui16 < i64,
+ i8 <= ui8,
+ ui32 > i64,
+ ui64 >= i16,
+
+ i16 == i32opt,
+ i32opt != ui8,
+ ui16 < i64opt,
+ i8opt <= ui8opt,
+ ui32opt > i64,
+ ui64 >= i16,
+
+ i16 == 6u,
+ i32opt != 5,
+ 7 < i64opt,
+ 1/0 <= ui8opt,
+ 0 > i64,
+ ui64 >= 8u,
+from plato.Input
+order by i8;
diff --git a/yt/yql/tests/sql/suites/blocks/compare_dates_floats_bools.cfg b/yt/yql/tests/sql/suites/blocks/compare_dates_floats_bools.cfg
new file mode 100644
index 0000000000..bb349dd8ab
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/compare_dates_floats_bools.cfg
@@ -0,0 +1 @@
+providers yt
diff --git a/yt/yql/tests/sql/suites/blocks/compare_dates_floats_bools.sql b/yt/yql/tests/sql/suites/blocks/compare_dates_floats_bools.sql
new file mode 100644
index 0000000000..5b459bd969
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/compare_dates_floats_bools.sql
@@ -0,0 +1,59 @@
+use plato;
+
+insert into @tmp
+select
+ 1 as key,
+
+ 2.0f as fl1,
+ 3.0f as fl2,
+
+ 2.5 as db1,
+ 1.5 as db2,
+
+ true as b1,
+ false as b2,
+
+ Date('2023-01-08') as d1,
+ Date('2023-01-05') as d2,
+
+ Datetime('2023-01-08T00:00:00Z') as dt1,
+ Datetime('2023-01-05T00:00:00Z') as dt2,
+
+ Timestamp('2023-01-08T00:00:00.000000Z') as ts1,
+ Timestamp('2023-01-05T00:00:00.000000Z') as ts2,
+
+ Interval('PT1M') as i1,
+ Interval('PT1H') as i2,
+;
+commit;
+
+select
+ t.*,
+
+ fl1 > fl2,
+ fl1 > key,
+ fl2 > 2.0,
+ fl2 > db2,
+
+ db1 > db2,
+ db2 <= key,
+ db1 > fl2,
+ db2 > 1.0f,
+
+ b1 < b2,
+ b1 == true,
+ false >= b2,
+
+ d1 < d2,
+ d1 == dt1,
+ ts2 == d2,
+ d1 >= Date('2023-01-01'),
+ ts1 == d1,
+ ts2 >= dt2,
+ Timestamp('2023-01-05T00:00:00.000000Z') <= d2,
+
+
+ i1 < i2,
+ i2 > Interval('PT59M'),
+from @tmp as t;
+
diff --git a/yt/yql/tests/sql/suites/blocks/complex_scalars.cfg b/yt/yql/tests/sql/suites/blocks/complex_scalars.cfg
new file mode 100644
index 0000000000..b65712414d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/complex_scalars.cfg
@@ -0,0 +1 @@
+in Input input_strings.txt
diff --git a/yt/yql/tests/sql/suites/blocks/complex_scalars.sql b/yt/yql/tests/sql/suites/blocks/complex_scalars.sql
new file mode 100644
index 0000000000..225de346de
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/complex_scalars.sql
@@ -0,0 +1,12 @@
+USE plato;
+
+select
+ subkey || key as k,
+ Just(Just(1)) as nested_opt,
+ Just(1p) as opt_pg,
+ Just(Just(1p)) as nested_opt_pg,
+ 2p as pg,
+ AsTuple(1, 2, Just(Just(2))) as tuple,
+ Just(Just(Just(AsTuple(1, 2, Just(Just(2)))))) as double_tuple
+from Input
+order by k;
diff --git a/yt/yql/tests/sql/suites/blocks/date_add_interval.cfg b/yt/yql/tests/sql/suites/blocks/date_add_interval.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_add_interval.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_add_interval.sql b/yt/yql/tests/sql/suites/blocks/date_add_interval.sql
new file mode 100644
index 0000000000..3a920ad0e3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_add_interval.sql
@@ -0,0 +1,31 @@
+USE plato;
+
+SELECT
+ a.na + b.ni,
+ a.na + b.wi,
+ a.naz + b.ni,
+ a.naz + b.wi,
+ a.nd + b.ni,
+ a.nd + b.wi,
+ a.ndz + b.ni,
+ a.ndz + b.wi,
+ a.nt + b.ni,
+ a.nt + b.wi,
+ a.ntz + b.ni,
+ a.ntz + b.wi,
+
+ a.wa + b.ni,
+ a.wa + b.wi,
+ a.waz + b.ni,
+ a.waz + b.wi,
+ a.wd + b.ni,
+ a.wd + b.wi,
+ a.wdz + b.ni,
+ a.wdz + b.wi,
+ a.wt + b.ni,
+ a.wt + b.wi,
+ a.wtz + b.ni,
+ a.wtz + b.wi,
+FROM Dates as a CROSS JOIN Dates as b
+
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_add_interval_scalar.cfg b/yt/yql/tests/sql/suites/blocks/date_add_interval_scalar.cfg
new file mode 100644
index 0000000000..8d2d2a19fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_add_interval_scalar.cfg
@@ -0,0 +1 @@
+in Dates dates.txt
diff --git a/yt/yql/tests/sql/suites/blocks/date_add_interval_scalar.sql b/yt/yql/tests/sql/suites/blocks/date_add_interval_scalar.sql
new file mode 100644
index 0000000000..da977a614b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_add_interval_scalar.sql
@@ -0,0 +1,57 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin,FuseMultiOutsWithOuterMaps";
+
+SELECT
+ Date("2000-01-01") + ni,
+ Date("2000-01-01") + wi,
+ TzDate("2000-01-01,Europe/Moscow") + ni,
+ TzDate("2000-01-01,Europe/Moscow") + wi,
+ Datetime("2000-01-01T03:04:05Z") + ni,
+ Datetime("2000-01-01T03:04:05Z") + wi,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") + ni,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") + wi,
+ Timestamp("2000-01-01T03:04:05.678912Z") + ni,
+ Timestamp("2000-01-01T03:04:05.678912Z") + wi,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") + ni,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") + wi,
+ Date32("1900-01-01") + ni,
+ Date32("1900-01-01") + wi,
+ Datetime64("1900-01-01T03:04:05Z") + ni,
+ Datetime64("1900-01-01T03:04:05Z") + wi,
+ Timestamp64("1900-01-01T03:04:05.678912Z") + ni,
+ Timestamp64("1900-01-01T03:04:05.678912Z") + wi,
+ TzDate32("1900-01-01,Europe/Moscow") + ni,
+ TzDate32("1900-01-01,Europe/Moscow") + wi,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") + ni,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") + wi,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") + ni,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") + wi
+FROM Dates;
+
+SELECT
+ na + Interval("P1D"),
+ na + Interval64("P1D"),
+ naz + Interval("P1D"),
+ naz + Interval64("P1D"),
+ nd + Interval("P1D"),
+ nd + Interval64("P1D"),
+ ndz + Interval("P1D"),
+ ndz + Interval64("P1D"),
+ nt + Interval("P1D"),
+ nt + Interval64("P1D"),
+ ntz + Interval("P1D"),
+ ntz + Interval64("P1D"),
+ wa + Interval("P1D"),
+ wa + Interval64("P1D"),
+ wd + Interval("P1D"),
+ wd + Interval64("P1D"),
+ wt + Interval("P1D"),
+ wt + Interval64("P1D"),
+ waz + Interval("P1D"),
+ waz + Interval64("P1D"),
+ wdz + Interval("P1D"),
+ wdz + Interval64("P1D"),
+ wtz + Interval("P1D"),
+ wtz + Interval64("P1D")
+FROM Dates;
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_equals.cfg b/yt/yql/tests/sql/suites/blocks/date_equals.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_equals.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_equals.sql b/yt/yql/tests/sql/suites/blocks/date_equals.sql
new file mode 100644
index 0000000000..397b0a20a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_equals.sql
@@ -0,0 +1,169 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin,FuseMultiOutsWithOuterMaps";
+
+SELECT
+ a.na == b.na,
+ a.na == b.naz,
+ a.na == b.nd,
+ a.na == b.ndz,
+ a.na == b.nt,
+ a.na == b.ntz,
+ a.na == b.wa,
+ a.na == b.wd,
+ a.na == b.wt,
+ a.na == b.waz,
+ a.na == b.wdz,
+ a.na == b.wtz,
+
+ a.naz == b.na,
+ a.naz == b.naz,
+ a.naz == b.nd,
+ a.naz == b.ndz,
+ a.naz == b.nt,
+ a.naz == b.ntz,
+ a.naz == b.wa,
+ a.naz == b.wd,
+ a.naz == b.wt,
+ a.naz == b.waz,
+ a.naz == b.wdz,
+ a.naz == b.wtz,
+
+ a.nd == b.na,
+ a.nd == b.naz,
+ a.nd == b.nd,
+ a.nd == b.ndz,
+ a.nd == b.nt,
+ a.nd == b.ntz,
+ a.nd == b.wa,
+ a.nd == b.wd,
+ a.nd == b.wt,
+ a.nd == b.waz,
+ a.nd == b.wdz,
+ a.nd == b.wtz,
+
+ a.ndz == b.na,
+ a.ndz == b.naz,
+ a.ndz == b.nd,
+ a.ndz == b.ndz,
+ a.ndz == b.nt,
+ a.ndz == b.ntz,
+ a.ndz == b.wa,
+ a.ndz == b.wd,
+ a.ndz == b.wt,
+ a.ndz == b.waz,
+ a.ndz == b.wdz,
+ a.ndz == b.wtz,
+
+ a.nt == b.na,
+ a.nt == b.naz,
+ a.nt == b.nd,
+ a.nt == b.ndz,
+ a.nt == b.nt,
+ a.nt == b.ntz,
+ a.nt == b.wa,
+ a.nt == b.wd,
+ a.nt == b.wt,
+ a.nt == b.waz,
+ a.nt == b.wdz,
+ a.nt == b.wtz,
+
+ a.ntz == b.na,
+ a.ntz == b.naz,
+ a.ntz == b.nd,
+ a.ntz == b.ndz,
+ a.ntz == b.nt,
+ a.ntz == b.ntz,
+ a.ntz == b.wa,
+ a.ntz == b.wd,
+ a.ntz == b.wt,
+ a.ntz == b.waz,
+ a.ntz == b.wdz,
+ a.ntz == b.wtz,
+
+ a.ni == b.ni,
+ a.ni == b.wi,
+ a.wi == b.ni,
+ a.wi == b.wi
+
+FROM Dates as a CROSS JOIN Dates as b;
+
+SELECT
+ a.wa == b.na,
+ a.wa == b.naz,
+ a.wa == b.nd,
+ a.wa == b.ndz,
+ a.wa == b.nt,
+ a.wa == b.ntz,
+ a.wa == b.wa,
+ a.wa == b.wd,
+ a.wa == b.wt,
+ a.wa == b.waz,
+ a.wa == b.wdz,
+ a.wa == b.wtz,
+
+ a.wd == b.na,
+ a.wd == b.naz,
+ a.wd == b.nd,
+ a.wd == b.ndz,
+ a.wd == b.nt,
+ a.wd == b.ntz,
+ a.wd == b.wa,
+ a.wd == b.wd,
+ a.wd == b.wt,
+ a.wd == b.waz,
+ a.wd == b.wdz,
+ a.wd == b.wtz,
+
+ a.wt == b.na,
+ a.wt == b.naz,
+ a.wt == b.nd,
+ a.wt == b.ndz,
+ a.wt == b.nt,
+ a.wt == b.ntz,
+ a.wt == b.wa,
+ a.wt == b.wd,
+ a.wt == b.wt,
+ a.wt == b.waz,
+ a.wt == b.wdz,
+ a.wt == b.wtz,
+
+ a.waz == b.na,
+ a.waz == b.naz,
+ a.waz == b.nd,
+ a.waz == b.ndz,
+ a.waz == b.nt,
+ a.waz == b.ntz,
+ a.waz == b.wa,
+ a.waz == b.wd,
+ a.waz == b.wt,
+ a.waz == b.waz,
+ a.waz == b.wdz,
+ a.waz == b.wtz,
+
+ a.wdz == b.na,
+ a.wdz == b.naz,
+ a.wdz == b.nd,
+ a.wdz == b.ndz,
+ a.wdz == b.nt,
+ a.wdz == b.ntz,
+ a.wdz == b.wa,
+ a.wdz == b.wd,
+ a.wdz == b.wt,
+ a.wdz == b.waz,
+ a.wdz == b.wdz,
+ a.wdz == b.wtz,
+
+ a.wtz == b.na,
+ a.wtz == b.naz,
+ a.wtz == b.nd,
+ a.wtz == b.ndz,
+ a.wtz == b.nt,
+ a.wtz == b.ntz,
+ a.wtz == b.wa,
+ a.wtz == b.wd,
+ a.wtz == b.wt,
+ a.wtz == b.waz,
+ a.wtz == b.wdz,
+ a.wtz == b.wtz
+
+FROM Dates as a CROSS JOIN Dates as b;
diff --git a/yt/yql/tests/sql/suites/blocks/date_equals_scalar.cfg b/yt/yql/tests/sql/suites/blocks/date_equals_scalar.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_equals_scalar.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_equals_scalar.sql b/yt/yql/tests/sql/suites/blocks/date_equals_scalar.sql
new file mode 100644
index 0000000000..568f5cc7c1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_equals_scalar.sql
@@ -0,0 +1,332 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin,FuseMultiOutsWithOuterMaps";
+
+SELECT
+ Date("2000-01-01") == na,
+ Date("2000-01-01") == naz,
+ Date("2000-01-01") == nd,
+ Date("2000-01-01") == ndz,
+ Date("2000-01-01") == nt,
+ Date("2000-01-01") == ntz,
+ Date("2000-01-01") == wa,
+ Date("2000-01-01") == wd,
+ Date("2000-01-01") == wt,
+ Date("2000-01-01") == waz,
+ Date("2000-01-01") == wdz,
+ Date("2000-01-01") == wtz,
+
+ TzDate("2000-01-01,Europe/Moscow") == na,
+ TzDate("2000-01-01,Europe/Moscow") == naz,
+ TzDate("2000-01-01,Europe/Moscow") == nd,
+ TzDate("2000-01-01,Europe/Moscow") == ndz,
+ TzDate("2000-01-01,Europe/Moscow") == nt,
+ TzDate("2000-01-01,Europe/Moscow") == ntz,
+ TzDate("2000-01-01,Europe/Moscow") == wa,
+ TzDate("2000-01-01,Europe/Moscow") == wd,
+ TzDate("2000-01-01,Europe/Moscow") == wt,
+ TzDate("2000-01-01,Europe/Moscow") == waz,
+ TzDate("2000-01-01,Europe/Moscow") == wdz,
+ TzDate("2000-01-01,Europe/Moscow") == wtz,
+
+ Datetime("2000-01-01T03:04:05Z") == na,
+ Datetime("2000-01-01T03:04:05Z") == naz,
+ Datetime("2000-01-01T03:04:05Z") == nd,
+ Datetime("2000-01-01T03:04:05Z") == ndz,
+ Datetime("2000-01-01T03:04:05Z") == nt,
+ Datetime("2000-01-01T03:04:05Z") == ntz,
+ Datetime("2000-01-01T03:04:05Z") == wa,
+ Datetime("2000-01-01T03:04:05Z") == wd,
+ Datetime("2000-01-01T03:04:05Z") == wt,
+ Datetime("2000-01-01T03:04:05Z") == waz,
+ Datetime("2000-01-01T03:04:05Z") == wdz,
+ Datetime("2000-01-01T03:04:05Z") == wtz,
+
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") == na,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") == naz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") == nd,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") == ndz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") == nt,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") == ntz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") == wa,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") == wd,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") == wt,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") == waz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") == wdz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") == wtz,
+
+ Timestamp("2000-01-01T03:04:05.678912Z") == na,
+ Timestamp("2000-01-01T03:04:05.678912Z") == naz,
+ Timestamp("2000-01-01T03:04:05.678912Z") == nd,
+ Timestamp("2000-01-01T03:04:05.678912Z") == ndz,
+ Timestamp("2000-01-01T03:04:05.678912Z") == nt,
+ Timestamp("2000-01-01T03:04:05.678912Z") == ntz,
+ Timestamp("2000-01-01T03:04:05.678912Z") == wa,
+ Timestamp("2000-01-01T03:04:05.678912Z") == wd,
+ Timestamp("2000-01-01T03:04:05.678912Z") == wt,
+ Timestamp("2000-01-01T03:04:05.678912Z") == waz,
+ Timestamp("2000-01-01T03:04:05.678912Z") == wdz,
+ Timestamp("2000-01-01T03:04:05.678912Z") == wtz,
+
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") == na,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") == naz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") == nd,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") == ndz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") == nt,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") == ntz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") == wa,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") == wd,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") == wt,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") == waz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") == wdz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") == wtz
+FROM Dates;
+
+SELECT
+ Date32("1900-01-01") == na,
+ Date32("1900-01-01") == naz,
+ Date32("1900-01-01") == nd,
+ Date32("1900-01-01") == ndz,
+ Date32("1900-01-01") == nt,
+ Date32("1900-01-01") == ntz,
+ Date32("1900-01-01") == wa,
+ Date32("1900-01-01") == wd,
+ Date32("1900-01-01") == wt,
+ Date32("1900-01-01") == waz,
+ Date32("1900-01-01") == wdz,
+ Date32("1900-01-01") == wtz,
+
+ Datetime64("1900-01-01T03:04:05Z") == na,
+ Datetime64("1900-01-01T03:04:05Z") == naz,
+ Datetime64("1900-01-01T03:04:05Z") == nd,
+ Datetime64("1900-01-01T03:04:05Z") == ndz,
+ Datetime64("1900-01-01T03:04:05Z") == nt,
+ Datetime64("1900-01-01T03:04:05Z") == ntz,
+ Datetime64("1900-01-01T03:04:05Z") == wa,
+ Datetime64("1900-01-01T03:04:05Z") == wd,
+ Datetime64("1900-01-01T03:04:05Z") == wt,
+ Datetime64("1900-01-01T03:04:05Z") == waz,
+ Datetime64("1900-01-01T03:04:05Z") == wdz,
+ Datetime64("1900-01-01T03:04:05Z") == wtz,
+
+ Timestamp64("1900-01-01T03:04:05.678912Z") == na,
+ Timestamp64("1900-01-01T03:04:05.678912Z") == naz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") == nd,
+ Timestamp64("1900-01-01T03:04:05.678912Z") == ndz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") == nt,
+ Timestamp64("1900-01-01T03:04:05.678912Z") == ntz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") == wa,
+ Timestamp64("1900-01-01T03:04:05.678912Z") == wd,
+ Timestamp64("1900-01-01T03:04:05.678912Z") == wt,
+ Timestamp64("1900-01-01T03:04:05.678912Z") == waz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") == wdz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") == wtz,
+
+ TzDate32("1900-01-01,Europe/Moscow") == na,
+ TzDate32("1900-01-01,Europe/Moscow") == naz,
+ TzDate32("1900-01-01,Europe/Moscow") == nd,
+ TzDate32("1900-01-01,Europe/Moscow") == ndz,
+ TzDate32("1900-01-01,Europe/Moscow") == nt,
+ TzDate32("1900-01-01,Europe/Moscow") == ntz,
+ TzDate32("1900-01-01,Europe/Moscow") == wa,
+ TzDate32("1900-01-01,Europe/Moscow") == wd,
+ TzDate32("1900-01-01,Europe/Moscow") == wt,
+ TzDate32("1900-01-01,Europe/Moscow") == waz,
+ TzDate32("1900-01-01,Europe/Moscow") == wdz,
+ TzDate32("1900-01-01,Europe/Moscow") == wtz,
+
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") == na,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") == naz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") == nd,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") == ndz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") == nt,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") == ntz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") == wa,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") == wd,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") == wt,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") == waz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") == wdz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") == wtz,
+
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") == na,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") == naz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") == nd,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") == ndz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") == nt,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") == ntz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") == wa,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") == wd,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") == wt,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") == waz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") == wdz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") == wtz,
+
+ Interval("P1D") == ni,
+ Interval("P1D") == wi,
+ Interval64("P1D") == ni,
+ Interval64("P1D") == wi,
+FROM Dates;
+
+SELECT
+ na == Date("2000-01-01"),
+ naz == Date("2000-01-01"),
+ nd == Date("2000-01-01"),
+ ndz == Date("2000-01-01"),
+ nt == Date("2000-01-01"),
+ ntz == Date("2000-01-01"),
+ wa == Date("2000-01-01"),
+ wd == Date("2000-01-01"),
+ wt == Date("2000-01-01"),
+ waz == Date("2000-01-01"),
+ wdz == Date("2000-01-01"),
+ wtz == Date("2000-01-01"),
+
+ na == TzDate("2000-01-01,Europe/Moscow"),
+ naz == TzDate("2000-01-01,Europe/Moscow"),
+ nd == TzDate("2000-01-01,Europe/Moscow"),
+ ndz == TzDate("2000-01-01,Europe/Moscow"),
+ nt == TzDate("2000-01-01,Europe/Moscow"),
+ ntz == TzDate("2000-01-01,Europe/Moscow"),
+ wa == TzDate("2000-01-01,Europe/Moscow"),
+ wd == TzDate("2000-01-01,Europe/Moscow"),
+ wt == TzDate("2000-01-01,Europe/Moscow"),
+ waz == TzDate("2000-01-01,Europe/Moscow"),
+ wdz == TzDate("2000-01-01,Europe/Moscow"),
+ wtz == TzDate("2000-01-01,Europe/Moscow"),
+
+ na == Datetime("2000-01-01T03:04:05Z"),
+ naz == Datetime("2000-01-01T03:04:05Z"),
+ nd == Datetime("2000-01-01T03:04:05Z"),
+ ndz == Datetime("2000-01-01T03:04:05Z"),
+ nt == Datetime("2000-01-01T03:04:05Z"),
+ ntz == Datetime("2000-01-01T03:04:05Z"),
+ wa == Datetime("2000-01-01T03:04:05Z"),
+ wd == Datetime("2000-01-01T03:04:05Z"),
+ wt == Datetime("2000-01-01T03:04:05Z"),
+ waz == Datetime("2000-01-01T03:04:05Z"),
+ wdz == Datetime("2000-01-01T03:04:05Z"),
+ wtz == Datetime("2000-01-01T03:04:05Z"),
+
+ na == TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ naz == TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ nd == TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ ndz == TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ nt == TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ ntz == TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wa == TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wd == TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wt == TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ waz == TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wdz == TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wtz == TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+
+ na == Timestamp("2000-01-01T03:04:05.678912Z"),
+ naz == Timestamp("2000-01-01T03:04:05.678912Z"),
+ nd == Timestamp("2000-01-01T03:04:05.678912Z"),
+ ndz == Timestamp("2000-01-01T03:04:05.678912Z"),
+ nt == Timestamp("2000-01-01T03:04:05.678912Z"),
+ ntz == Timestamp("2000-01-01T03:04:05.678912Z"),
+ wa == Timestamp("2000-01-01T03:04:05.678912Z"),
+ wd == Timestamp("2000-01-01T03:04:05.678912Z"),
+ wt == Timestamp("2000-01-01T03:04:05.678912Z"),
+ waz == Timestamp("2000-01-01T03:04:05.678912Z"),
+ wdz == Timestamp("2000-01-01T03:04:05.678912Z"),
+ wtz == Timestamp("2000-01-01T03:04:05.678912Z"),
+
+ na == TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ naz == TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ nd == TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ ndz == TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ nt == TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ ntz == TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wa == TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wd == TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wt == TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ waz == TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wdz == TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wtz == TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow")
+FROM Dates;
+
+SELECT
+ na == Date32("1900-01-01"),
+ naz == Date32("1900-01-01"),
+ nd == Date32("1900-01-01"),
+ ndz == Date32("1900-01-01"),
+ nt == Date32("1900-01-01"),
+ ntz == Date32("1900-01-01"),
+ wa == Date32("1900-01-01"),
+ wd == Date32("1900-01-01"),
+ wt == Date32("1900-01-01"),
+ waz == Date32("1900-01-01"),
+ wdz == Date32("1900-01-01"),
+ wtz == Date32("1900-01-01"),
+
+ na == Datetime64("1900-01-01T03:04:05Z"),
+ naz == Datetime64("1900-01-01T03:04:05Z"),
+ nd == Datetime64("1900-01-01T03:04:05Z"),
+ ndz == Datetime64("1900-01-01T03:04:05Z"),
+ nt == Datetime64("1900-01-01T03:04:05Z"),
+ ntz == Datetime64("1900-01-01T03:04:05Z"),
+ wa == Datetime64("1900-01-01T03:04:05Z"),
+ wd == Datetime64("1900-01-01T03:04:05Z"),
+ wt == Datetime64("1900-01-01T03:04:05Z"),
+ waz == Datetime64("1900-01-01T03:04:05Z"),
+ wdz == Datetime64("1900-01-01T03:04:05Z"),
+ wtz == Datetime64("1900-01-01T03:04:05Z"),
+
+ na == Timestamp64("1900-01-01T03:04:05.678912Z"),
+ naz == Timestamp64("1900-01-01T03:04:05.678912Z"),
+ nd == Timestamp64("1900-01-01T03:04:05.678912Z"),
+ ndz == Timestamp64("1900-01-01T03:04:05.678912Z"),
+ nt == Timestamp64("1900-01-01T03:04:05.678912Z"),
+ ntz == Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wa == Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wd == Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wt == Timestamp64("1900-01-01T03:04:05.678912Z"),
+ waz == Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wdz == Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wtz == Timestamp64("1900-01-01T03:04:05.678912Z"),
+
+ na == TzDate32("1900-01-01,Europe/Moscow"),
+ naz == TzDate32("1900-01-01,Europe/Moscow"),
+ nd == TzDate32("1900-01-01,Europe/Moscow"),
+ ndz == TzDate32("1900-01-01,Europe/Moscow"),
+ nt == TzDate32("1900-01-01,Europe/Moscow"),
+ ntz == TzDate32("1900-01-01,Europe/Moscow"),
+ wa == TzDate32("1900-01-01,Europe/Moscow"),
+ wd == TzDate32("1900-01-01,Europe/Moscow"),
+ wt == TzDate32("1900-01-01,Europe/Moscow"),
+ waz == TzDate32("1900-01-01,Europe/Moscow"),
+ wdz == TzDate32("1900-01-01,Europe/Moscow"),
+ wtz == TzDate32("1900-01-01,Europe/Moscow"),
+
+ na == TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ naz == TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ nd == TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ ndz == TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ nt == TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ ntz == TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wa == TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wd == TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wt == TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ waz == TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wdz == TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wtz == TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+
+ na == TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ naz == TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ nd == TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ ndz == TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ nt == TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ ntz == TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wa == TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wd == TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wt == TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ waz == TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wdz == TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wtz == TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+
+ ni == Interval("P1D"),
+ wi == Interval("P1D"),
+ ni == Interval64("P1D"),
+ wi == Interval64("P1D"),
+FROM Dates;
diff --git a/yt/yql/tests/sql/suites/blocks/date_greater.cfg b/yt/yql/tests/sql/suites/blocks/date_greater.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_greater.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_greater.sql b/yt/yql/tests/sql/suites/blocks/date_greater.sql
new file mode 100644
index 0000000000..27c334fa61
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_greater.sql
@@ -0,0 +1,169 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin,FuseMultiOutsWithOuterMaps";
+
+SELECT
+ a.na > b.na,
+ a.na > b.naz,
+ a.na > b.nd,
+ a.na > b.ndz,
+ a.na > b.nt,
+ a.na > b.ntz,
+ a.na > b.wa,
+ a.na > b.wd,
+ a.na > b.wt,
+ a.na > b.waz,
+ a.na > b.wdz,
+ a.na > b.wtz,
+
+ a.naz > b.na,
+ a.naz > b.naz,
+ a.naz > b.nd,
+ a.naz > b.ndz,
+ a.naz > b.nt,
+ a.naz > b.ntz,
+ a.naz > b.wa,
+ a.naz > b.wd,
+ a.naz > b.wt,
+ a.naz > b.waz,
+ a.naz > b.wdz,
+ a.naz > b.wtz,
+
+ a.nd > b.na,
+ a.nd > b.naz,
+ a.nd > b.nd,
+ a.nd > b.ndz,
+ a.nd > b.nt,
+ a.nd > b.ntz,
+ a.nd > b.wa,
+ a.nd > b.wd,
+ a.nd > b.wt,
+ a.nd > b.waz,
+ a.nd > b.wdz,
+ a.nd > b.wtz,
+
+ a.ndz > b.na,
+ a.ndz > b.naz,
+ a.ndz > b.nd,
+ a.ndz > b.ndz,
+ a.ndz > b.nt,
+ a.ndz > b.ntz,
+ a.ndz > b.wa,
+ a.ndz > b.wd,
+ a.ndz > b.wt,
+ a.ndz > b.waz,
+ a.ndz > b.wdz,
+ a.ndz > b.wtz,
+
+ a.nt > b.na,
+ a.nt > b.naz,
+ a.nt > b.nd,
+ a.nt > b.ndz,
+ a.nt > b.nt,
+ a.nt > b.ntz,
+ a.nt > b.wa,
+ a.nt > b.wd,
+ a.nt > b.wt,
+ a.nt > b.waz,
+ a.nt > b.wdz,
+ a.nt > b.wtz,
+
+ a.ntz > b.na,
+ a.ntz > b.naz,
+ a.ntz > b.nd,
+ a.ntz > b.ndz,
+ a.ntz > b.nt,
+ a.ntz > b.ntz,
+ a.ntz > b.wa,
+ a.ntz > b.wd,
+ a.ntz > b.wt,
+ a.ntz > b.waz,
+ a.ntz > b.wdz,
+ a.ntz > b.wtz,
+
+ a.ni > b.ni,
+ a.ni > b.wi,
+ a.wi > b.ni,
+ a.wi > b.wi
+
+FROM Dates as a CROSS JOIN Dates as b;
+
+SELECT
+ a.wa > b.na,
+ a.wa > b.naz,
+ a.wa > b.nd,
+ a.wa > b.ndz,
+ a.wa > b.nt,
+ a.wa > b.ntz,
+ a.wa > b.wa,
+ a.wa > b.wd,
+ a.wa > b.wt,
+ a.wa > b.waz,
+ a.wa > b.wdz,
+ a.wa > b.wtz,
+
+ a.wd > b.na,
+ a.wd > b.naz,
+ a.wd > b.nd,
+ a.wd > b.ndz,
+ a.wd > b.nt,
+ a.wd > b.ntz,
+ a.wd > b.wa,
+ a.wd > b.wd,
+ a.wd > b.wt,
+ a.wd > b.waz,
+ a.wd > b.wdz,
+ a.wd > b.wtz,
+
+ a.wt > b.na,
+ a.wt > b.naz,
+ a.wt > b.nd,
+ a.wt > b.ndz,
+ a.wt > b.nt,
+ a.wt > b.ntz,
+ a.wt > b.wa,
+ a.wt > b.wd,
+ a.wt > b.wt,
+ a.wt > b.waz,
+ a.wt > b.wdz,
+ a.wt > b.wtz,
+
+ a.waz > b.na,
+ a.waz > b.naz,
+ a.waz > b.nd,
+ a.waz > b.ndz,
+ a.waz > b.nt,
+ a.waz > b.ntz,
+ a.waz > b.wa,
+ a.waz > b.wd,
+ a.waz > b.wt,
+ a.waz > b.waz,
+ a.waz > b.wdz,
+ a.waz > b.wtz,
+
+ a.wdz > b.na,
+ a.wdz > b.naz,
+ a.wdz > b.nd,
+ a.wdz > b.ndz,
+ a.wdz > b.nt,
+ a.wdz > b.ntz,
+ a.wdz > b.wa,
+ a.wdz > b.wd,
+ a.wdz > b.wt,
+ a.wdz > b.waz,
+ a.wdz > b.wdz,
+ a.wdz > b.wtz,
+
+ a.wtz > b.na,
+ a.wtz > b.naz,
+ a.wtz > b.nd,
+ a.wtz > b.ndz,
+ a.wtz > b.nt,
+ a.wtz > b.ntz,
+ a.wtz > b.wa,
+ a.wtz > b.wd,
+ a.wtz > b.wt,
+ a.wtz > b.waz,
+ a.wtz > b.wdz,
+ a.wtz > b.wtz
+
+FROM Dates as a CROSS JOIN Dates as b;
diff --git a/yt/yql/tests/sql/suites/blocks/date_greater_or_equal.cfg b/yt/yql/tests/sql/suites/blocks/date_greater_or_equal.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_greater_or_equal.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_greater_or_equal.sql b/yt/yql/tests/sql/suites/blocks/date_greater_or_equal.sql
new file mode 100644
index 0000000000..f8508d2d3e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_greater_or_equal.sql
@@ -0,0 +1,169 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin,FuseMultiOutsWithOuterMaps";
+
+SELECT
+ a.na >= b.na,
+ a.na >= b.naz,
+ a.na >= b.nd,
+ a.na >= b.ndz,
+ a.na >= b.nt,
+ a.na >= b.ntz,
+ a.na >= b.wa,
+ a.na >= b.wd,
+ a.na >= b.wt,
+ a.na >= b.waz,
+ a.na >= b.wdz,
+ a.na >= b.wtz,
+
+ a.naz >= b.na,
+ a.naz >= b.naz,
+ a.naz >= b.nd,
+ a.naz >= b.ndz,
+ a.naz >= b.nt,
+ a.naz >= b.ntz,
+ a.naz >= b.wa,
+ a.naz >= b.wd,
+ a.naz >= b.wt,
+ a.naz >= b.waz,
+ a.naz >= b.wdz,
+ a.naz >= b.wtz,
+
+ a.nd >= b.na,
+ a.nd >= b.naz,
+ a.nd >= b.nd,
+ a.nd >= b.ndz,
+ a.nd >= b.nt,
+ a.nd >= b.ntz,
+ a.nd >= b.wa,
+ a.nd >= b.wd,
+ a.nd >= b.wt,
+ a.nd >= b.waz,
+ a.nd >= b.wdz,
+ a.nd >= b.wtz,
+
+ a.ndz >= b.na,
+ a.ndz >= b.naz,
+ a.ndz >= b.nd,
+ a.ndz >= b.ndz,
+ a.ndz >= b.nt,
+ a.ndz >= b.ntz,
+ a.ndz >= b.wa,
+ a.ndz >= b.wd,
+ a.ndz >= b.wt,
+ a.ndz >= b.waz,
+ a.ndz >= b.wdz,
+ a.ndz >= b.wtz,
+
+ a.nt >= b.na,
+ a.nt >= b.naz,
+ a.nt >= b.nd,
+ a.nt >= b.ndz,
+ a.nt >= b.nt,
+ a.nt >= b.ntz,
+ a.nt >= b.wa,
+ a.nt >= b.wd,
+ a.nt >= b.wt,
+ a.nt >= b.waz,
+ a.nt >= b.wdz,
+ a.nt >= b.wtz,
+
+ a.ntz >= b.na,
+ a.ntz >= b.naz,
+ a.ntz >= b.nd,
+ a.ntz >= b.ndz,
+ a.ntz >= b.nt,
+ a.ntz >= b.ntz,
+ a.ntz >= b.wa,
+ a.ntz >= b.wd,
+ a.ntz >= b.wt,
+ a.ntz >= b.waz,
+ a.ntz >= b.wdz,
+ a.ntz >= b.wtz,
+
+ a.ni >= b.ni,
+ a.ni >= b.wi,
+ a.wi >= b.ni,
+ a.wi >= b.wi
+
+FROM Dates as a CROSS JOIN Dates as b;
+
+SELECT
+ a.wa >= b.na,
+ a.wa >= b.naz,
+ a.wa >= b.nd,
+ a.wa >= b.ndz,
+ a.wa >= b.nt,
+ a.wa >= b.ntz,
+ a.wa >= b.wa,
+ a.wa >= b.wd,
+ a.wa >= b.wt,
+ a.wa >= b.waz,
+ a.wa >= b.wdz,
+ a.wa >= b.wtz,
+
+ a.wd >= b.na,
+ a.wd >= b.naz,
+ a.wd >= b.nd,
+ a.wd >= b.ndz,
+ a.wd >= b.nt,
+ a.wd >= b.ntz,
+ a.wd >= b.wa,
+ a.wd >= b.wd,
+ a.wd >= b.wt,
+ a.wd >= b.waz,
+ a.wd >= b.wdz,
+ a.wd >= b.wtz,
+
+ a.wt >= b.na,
+ a.wt >= b.naz,
+ a.wt >= b.nd,
+ a.wt >= b.ndz,
+ a.wt >= b.nt,
+ a.wt >= b.ntz,
+ a.wt >= b.wa,
+ a.wt >= b.wd,
+ a.wt >= b.wt,
+ a.wt >= b.waz,
+ a.wt >= b.wdz,
+ a.wt >= b.wtz,
+
+ a.waz >= b.na,
+ a.waz >= b.naz,
+ a.waz >= b.nd,
+ a.waz >= b.ndz,
+ a.waz >= b.nt,
+ a.waz >= b.ntz,
+ a.waz >= b.wa,
+ a.waz >= b.wd,
+ a.waz >= b.wt,
+ a.waz >= b.waz,
+ a.waz >= b.wdz,
+ a.waz >= b.wtz,
+
+ a.wdz >= b.na,
+ a.wdz >= b.naz,
+ a.wdz >= b.nd,
+ a.wdz >= b.ndz,
+ a.wdz >= b.nt,
+ a.wdz >= b.ntz,
+ a.wdz >= b.wa,
+ a.wdz >= b.wd,
+ a.wdz >= b.wt,
+ a.wdz >= b.waz,
+ a.wdz >= b.wdz,
+ a.wdz >= b.wtz,
+
+ a.wtz >= b.na,
+ a.wtz >= b.naz,
+ a.wtz >= b.nd,
+ a.wtz >= b.ndz,
+ a.wtz >= b.nt,
+ a.wtz >= b.ntz,
+ a.wtz >= b.wa,
+ a.wtz >= b.wd,
+ a.wtz >= b.wt,
+ a.wtz >= b.waz,
+ a.wtz >= b.wdz,
+ a.wtz >= b.wtz
+
+FROM Dates as a CROSS JOIN Dates as b;
diff --git a/yt/yql/tests/sql/suites/blocks/date_greater_or_equal_scalar.cfg b/yt/yql/tests/sql/suites/blocks/date_greater_or_equal_scalar.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_greater_or_equal_scalar.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_greater_or_equal_scalar.sql b/yt/yql/tests/sql/suites/blocks/date_greater_or_equal_scalar.sql
new file mode 100644
index 0000000000..f200b0deaa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_greater_or_equal_scalar.sql
@@ -0,0 +1,332 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin,FuseMultiOutsWithOuterMaps";
+
+SELECT
+ Date("2000-01-01") >= na,
+ Date("2000-01-01") >= naz,
+ Date("2000-01-01") >= nd,
+ Date("2000-01-01") >= ndz,
+ Date("2000-01-01") >= nt,
+ Date("2000-01-01") >= ntz,
+ Date("2000-01-01") >= wa,
+ Date("2000-01-01") >= wd,
+ Date("2000-01-01") >= wt,
+ Date("2000-01-01") >= waz,
+ Date("2000-01-01") >= wdz,
+ Date("2000-01-01") >= wtz,
+
+ TzDate("2000-01-01,Europe/Moscow") >= na,
+ TzDate("2000-01-01,Europe/Moscow") >= naz,
+ TzDate("2000-01-01,Europe/Moscow") >= nd,
+ TzDate("2000-01-01,Europe/Moscow") >= ndz,
+ TzDate("2000-01-01,Europe/Moscow") >= nt,
+ TzDate("2000-01-01,Europe/Moscow") >= ntz,
+ TzDate("2000-01-01,Europe/Moscow") >= wa,
+ TzDate("2000-01-01,Europe/Moscow") >= wd,
+ TzDate("2000-01-01,Europe/Moscow") >= wt,
+ TzDate("2000-01-01,Europe/Moscow") >= waz,
+ TzDate("2000-01-01,Europe/Moscow") >= wdz,
+ TzDate("2000-01-01,Europe/Moscow") >= wtz,
+
+ Datetime("2000-01-01T03:04:05Z") >= na,
+ Datetime("2000-01-01T03:04:05Z") >= naz,
+ Datetime("2000-01-01T03:04:05Z") >= nd,
+ Datetime("2000-01-01T03:04:05Z") >= ndz,
+ Datetime("2000-01-01T03:04:05Z") >= nt,
+ Datetime("2000-01-01T03:04:05Z") >= ntz,
+ Datetime("2000-01-01T03:04:05Z") >= wa,
+ Datetime("2000-01-01T03:04:05Z") >= wd,
+ Datetime("2000-01-01T03:04:05Z") >= wt,
+ Datetime("2000-01-01T03:04:05Z") >= waz,
+ Datetime("2000-01-01T03:04:05Z") >= wdz,
+ Datetime("2000-01-01T03:04:05Z") >= wtz,
+
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") >= na,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") >= naz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") >= nd,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") >= ndz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") >= nt,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") >= ntz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") >= wa,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") >= wd,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") >= wt,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") >= waz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") >= wdz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") >= wtz,
+
+ Timestamp("2000-01-01T03:04:05.678912Z") >= na,
+ Timestamp("2000-01-01T03:04:05.678912Z") >= naz,
+ Timestamp("2000-01-01T03:04:05.678912Z") >= nd,
+ Timestamp("2000-01-01T03:04:05.678912Z") >= ndz,
+ Timestamp("2000-01-01T03:04:05.678912Z") >= nt,
+ Timestamp("2000-01-01T03:04:05.678912Z") >= ntz,
+ Timestamp("2000-01-01T03:04:05.678912Z") >= wa,
+ Timestamp("2000-01-01T03:04:05.678912Z") >= wd,
+ Timestamp("2000-01-01T03:04:05.678912Z") >= wt,
+ Timestamp("2000-01-01T03:04:05.678912Z") >= waz,
+ Timestamp("2000-01-01T03:04:05.678912Z") >= wdz,
+ Timestamp("2000-01-01T03:04:05.678912Z") >= wtz,
+
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") >= na,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") >= naz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") >= nd,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") >= ndz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") >= nt,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") >= ntz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") >= wa,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") >= wd,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") >= wt,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") >= waz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") >= wdz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") >= wtz
+FROM Dates;
+
+SELECT
+ Date32("1900-01-01") >= na,
+ Date32("1900-01-01") >= naz,
+ Date32("1900-01-01") >= nd,
+ Date32("1900-01-01") >= ndz,
+ Date32("1900-01-01") >= nt,
+ Date32("1900-01-01") >= ntz,
+ Date32("1900-01-01") >= wa,
+ Date32("1900-01-01") >= wd,
+ Date32("1900-01-01") >= wt,
+ Date32("1900-01-01") >= waz,
+ Date32("1900-01-01") >= wdz,
+ Date32("1900-01-01") >= wtz,
+
+ Datetime64("1900-01-01T03:04:05Z") >= na,
+ Datetime64("1900-01-01T03:04:05Z") >= naz,
+ Datetime64("1900-01-01T03:04:05Z") >= nd,
+ Datetime64("1900-01-01T03:04:05Z") >= ndz,
+ Datetime64("1900-01-01T03:04:05Z") >= nt,
+ Datetime64("1900-01-01T03:04:05Z") >= ntz,
+ Datetime64("1900-01-01T03:04:05Z") >= wa,
+ Datetime64("1900-01-01T03:04:05Z") >= wd,
+ Datetime64("1900-01-01T03:04:05Z") >= wt,
+ Datetime64("1900-01-01T03:04:05Z") >= waz,
+ Datetime64("1900-01-01T03:04:05Z") >= wdz,
+ Datetime64("1900-01-01T03:04:05Z") >= wtz,
+
+ Timestamp64("1900-01-01T03:04:05.678912Z") >= na,
+ Timestamp64("1900-01-01T03:04:05.678912Z") >= naz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") >= nd,
+ Timestamp64("1900-01-01T03:04:05.678912Z") >= ndz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") >= nt,
+ Timestamp64("1900-01-01T03:04:05.678912Z") >= ntz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") >= wa,
+ Timestamp64("1900-01-01T03:04:05.678912Z") >= wd,
+ Timestamp64("1900-01-01T03:04:05.678912Z") >= wt,
+ Timestamp64("1900-01-01T03:04:05.678912Z") >= waz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") >= wdz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") >= wtz,
+
+ TzDate32("1900-01-01,Europe/Moscow") >= na,
+ TzDate32("1900-01-01,Europe/Moscow") >= naz,
+ TzDate32("1900-01-01,Europe/Moscow") >= nd,
+ TzDate32("1900-01-01,Europe/Moscow") >= ndz,
+ TzDate32("1900-01-01,Europe/Moscow") >= nt,
+ TzDate32("1900-01-01,Europe/Moscow") >= ntz,
+ TzDate32("1900-01-01,Europe/Moscow") >= wa,
+ TzDate32("1900-01-01,Europe/Moscow") >= wd,
+ TzDate32("1900-01-01,Europe/Moscow") >= wt,
+ TzDate32("1900-01-01,Europe/Moscow") >= waz,
+ TzDate32("1900-01-01,Europe/Moscow") >= wdz,
+ TzDate32("1900-01-01,Europe/Moscow") >= wtz,
+
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") >= na,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") >= naz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") >= nd,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") >= ndz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") >= nt,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") >= ntz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") >= wa,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") >= wd,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") >= wt,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") >= waz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") >= wdz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") >= wtz,
+
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") >= na,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") >= naz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") >= nd,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") >= ndz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") >= nt,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") >= ntz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") >= wa,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") >= wd,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") >= wt,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") >= waz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") >= wdz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") >= wtz,
+
+ Interval("P1D") >= ni,
+ Interval("P1D") >= wi,
+ Interval64("P1D") >= ni,
+ Interval64("P1D") >= wi,
+FROM Dates;
+
+SELECT
+ na >= Date("2000-01-01"),
+ naz >= Date("2000-01-01"),
+ nd >= Date("2000-01-01"),
+ ndz >= Date("2000-01-01"),
+ nt >= Date("2000-01-01"),
+ ntz >= Date("2000-01-01"),
+ wa >= Date("2000-01-01"),
+ wd >= Date("2000-01-01"),
+ wt >= Date("2000-01-01"),
+ waz >= Date("2000-01-01"),
+ wdz >= Date("2000-01-01"),
+ wtz >= Date("2000-01-01"),
+
+ na >= TzDate("2000-01-01,Europe/Moscow"),
+ naz >= TzDate("2000-01-01,Europe/Moscow"),
+ nd >= TzDate("2000-01-01,Europe/Moscow"),
+ ndz >= TzDate("2000-01-01,Europe/Moscow"),
+ nt >= TzDate("2000-01-01,Europe/Moscow"),
+ ntz >= TzDate("2000-01-01,Europe/Moscow"),
+ wa >= TzDate("2000-01-01,Europe/Moscow"),
+ wd >= TzDate("2000-01-01,Europe/Moscow"),
+ wt >= TzDate("2000-01-01,Europe/Moscow"),
+ waz >= TzDate("2000-01-01,Europe/Moscow"),
+ wdz >= TzDate("2000-01-01,Europe/Moscow"),
+ wtz >= TzDate("2000-01-01,Europe/Moscow"),
+
+ na >= Datetime("2000-01-01T03:04:05Z"),
+ naz >= Datetime("2000-01-01T03:04:05Z"),
+ nd >= Datetime("2000-01-01T03:04:05Z"),
+ ndz >= Datetime("2000-01-01T03:04:05Z"),
+ nt >= Datetime("2000-01-01T03:04:05Z"),
+ ntz >= Datetime("2000-01-01T03:04:05Z"),
+ wa >= Datetime("2000-01-01T03:04:05Z"),
+ wd >= Datetime("2000-01-01T03:04:05Z"),
+ wt >= Datetime("2000-01-01T03:04:05Z"),
+ waz >= Datetime("2000-01-01T03:04:05Z"),
+ wdz >= Datetime("2000-01-01T03:04:05Z"),
+ wtz >= Datetime("2000-01-01T03:04:05Z"),
+
+ na >= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ naz >= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ nd >= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ ndz >= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ nt >= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ ntz >= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wa >= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wd >= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wt >= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ waz >= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wdz >= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wtz >= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+
+ na >= Timestamp("2000-01-01T03:04:05.678912Z"),
+ naz >= Timestamp("2000-01-01T03:04:05.678912Z"),
+ nd >= Timestamp("2000-01-01T03:04:05.678912Z"),
+ ndz >= Timestamp("2000-01-01T03:04:05.678912Z"),
+ nt >= Timestamp("2000-01-01T03:04:05.678912Z"),
+ ntz >= Timestamp("2000-01-01T03:04:05.678912Z"),
+ wa >= Timestamp("2000-01-01T03:04:05.678912Z"),
+ wd >= Timestamp("2000-01-01T03:04:05.678912Z"),
+ wt >= Timestamp("2000-01-01T03:04:05.678912Z"),
+ waz >= Timestamp("2000-01-01T03:04:05.678912Z"),
+ wdz >= Timestamp("2000-01-01T03:04:05.678912Z"),
+ wtz >= Timestamp("2000-01-01T03:04:05.678912Z"),
+
+ na >= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ naz >= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ nd >= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ ndz >= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ nt >= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ ntz >= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wa >= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wd >= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wt >= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ waz >= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wdz >= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wtz >= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow")
+FROM Dates;
+
+SELECT
+ na >= Date32("1900-01-01"),
+ naz >= Date32("1900-01-01"),
+ nd >= Date32("1900-01-01"),
+ ndz >= Date32("1900-01-01"),
+ nt >= Date32("1900-01-01"),
+ ntz >= Date32("1900-01-01"),
+ wa >= Date32("1900-01-01"),
+ wd >= Date32("1900-01-01"),
+ wt >= Date32("1900-01-01"),
+ waz >= Date32("1900-01-01"),
+ wdz >= Date32("1900-01-01"),
+ wtz >= Date32("1900-01-01"),
+
+ na >= Datetime64("1900-01-01T03:04:05Z"),
+ naz >= Datetime64("1900-01-01T03:04:05Z"),
+ nd >= Datetime64("1900-01-01T03:04:05Z"),
+ ndz >= Datetime64("1900-01-01T03:04:05Z"),
+ nt >= Datetime64("1900-01-01T03:04:05Z"),
+ ntz >= Datetime64("1900-01-01T03:04:05Z"),
+ wa >= Datetime64("1900-01-01T03:04:05Z"),
+ wd >= Datetime64("1900-01-01T03:04:05Z"),
+ wt >= Datetime64("1900-01-01T03:04:05Z"),
+ waz >= Datetime64("1900-01-01T03:04:05Z"),
+ wdz >= Datetime64("1900-01-01T03:04:05Z"),
+ wtz >= Datetime64("1900-01-01T03:04:05Z"),
+
+ na >= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ naz >= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ nd >= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ ndz >= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ nt >= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ ntz >= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wa >= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wd >= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wt >= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ waz >= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wdz >= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wtz >= Timestamp64("1900-01-01T03:04:05.678912Z"),
+
+ na >= TzDate32("1900-01-01,Europe/Moscow"),
+ naz >= TzDate32("1900-01-01,Europe/Moscow"),
+ nd >= TzDate32("1900-01-01,Europe/Moscow"),
+ ndz >= TzDate32("1900-01-01,Europe/Moscow"),
+ nt >= TzDate32("1900-01-01,Europe/Moscow"),
+ ntz >= TzDate32("1900-01-01,Europe/Moscow"),
+ wa >= TzDate32("1900-01-01,Europe/Moscow"),
+ wd >= TzDate32("1900-01-01,Europe/Moscow"),
+ wt >= TzDate32("1900-01-01,Europe/Moscow"),
+ waz >= TzDate32("1900-01-01,Europe/Moscow"),
+ wdz >= TzDate32("1900-01-01,Europe/Moscow"),
+ wtz >= TzDate32("1900-01-01,Europe/Moscow"),
+
+ na >= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ naz >= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ nd >= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ ndz >= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ nt >= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ ntz >= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wa >= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wd >= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wt >= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ waz >= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wdz >= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wtz >= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+
+ na >= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ naz >= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ nd >= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ ndz >= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ nt >= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ ntz >= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wa >= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wd >= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wt >= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ waz >= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wdz >= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wtz >= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+
+ ni >= Interval("P1D"),
+ wi >= Interval("P1D"),
+ ni >= Interval64("P1D"),
+ wi >= Interval64("P1D"),
+FROM Dates;
diff --git a/yt/yql/tests/sql/suites/blocks/date_greater_scalar.cfg b/yt/yql/tests/sql/suites/blocks/date_greater_scalar.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_greater_scalar.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_greater_scalar.sql b/yt/yql/tests/sql/suites/blocks/date_greater_scalar.sql
new file mode 100644
index 0000000000..b390aab2ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_greater_scalar.sql
@@ -0,0 +1,332 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin,FuseMultiOutsWithOuterMaps";
+
+SELECT
+ Date("2000-01-01") > na,
+ Date("2000-01-01") > naz,
+ Date("2000-01-01") > nd,
+ Date("2000-01-01") > ndz,
+ Date("2000-01-01") > nt,
+ Date("2000-01-01") > ntz,
+ Date("2000-01-01") > wa,
+ Date("2000-01-01") > wd,
+ Date("2000-01-01") > wt,
+ Date("2000-01-01") > waz,
+ Date("2000-01-01") > wdz,
+ Date("2000-01-01") > wtz,
+
+ TzDate("2000-01-01,Europe/Moscow") > na,
+ TzDate("2000-01-01,Europe/Moscow") > naz,
+ TzDate("2000-01-01,Europe/Moscow") > nd,
+ TzDate("2000-01-01,Europe/Moscow") > ndz,
+ TzDate("2000-01-01,Europe/Moscow") > nt,
+ TzDate("2000-01-01,Europe/Moscow") > ntz,
+ TzDate("2000-01-01,Europe/Moscow") > wa,
+ TzDate("2000-01-01,Europe/Moscow") > wd,
+ TzDate("2000-01-01,Europe/Moscow") > wt,
+ TzDate("2000-01-01,Europe/Moscow") > waz,
+ TzDate("2000-01-01,Europe/Moscow") > wdz,
+ TzDate("2000-01-01,Europe/Moscow") > wtz,
+
+ Datetime("2000-01-01T03:04:05Z") > na,
+ Datetime("2000-01-01T03:04:05Z") > naz,
+ Datetime("2000-01-01T03:04:05Z") > nd,
+ Datetime("2000-01-01T03:04:05Z") > ndz,
+ Datetime("2000-01-01T03:04:05Z") > nt,
+ Datetime("2000-01-01T03:04:05Z") > ntz,
+ Datetime("2000-01-01T03:04:05Z") > wa,
+ Datetime("2000-01-01T03:04:05Z") > wd,
+ Datetime("2000-01-01T03:04:05Z") > wt,
+ Datetime("2000-01-01T03:04:05Z") > waz,
+ Datetime("2000-01-01T03:04:05Z") > wdz,
+ Datetime("2000-01-01T03:04:05Z") > wtz,
+
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") > na,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") > naz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") > nd,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") > ndz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") > nt,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") > ntz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") > wa,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") > wd,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") > wt,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") > waz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") > wdz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") > wtz,
+
+ Timestamp("2000-01-01T03:04:05.678912Z") > na,
+ Timestamp("2000-01-01T03:04:05.678912Z") > naz,
+ Timestamp("2000-01-01T03:04:05.678912Z") > nd,
+ Timestamp("2000-01-01T03:04:05.678912Z") > ndz,
+ Timestamp("2000-01-01T03:04:05.678912Z") > nt,
+ Timestamp("2000-01-01T03:04:05.678912Z") > ntz,
+ Timestamp("2000-01-01T03:04:05.678912Z") > wa,
+ Timestamp("2000-01-01T03:04:05.678912Z") > wd,
+ Timestamp("2000-01-01T03:04:05.678912Z") > wt,
+ Timestamp("2000-01-01T03:04:05.678912Z") > waz,
+ Timestamp("2000-01-01T03:04:05.678912Z") > wdz,
+ Timestamp("2000-01-01T03:04:05.678912Z") > wtz,
+
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") > na,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") > naz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") > nd,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") > ndz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") > nt,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") > ntz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") > wa,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") > wd,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") > wt,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") > waz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") > wdz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") > wtz
+FROM Dates;
+
+SELECT
+ Date32("1900-01-01") > na,
+ Date32("1900-01-01") > naz,
+ Date32("1900-01-01") > nd,
+ Date32("1900-01-01") > ndz,
+ Date32("1900-01-01") > nt,
+ Date32("1900-01-01") > ntz,
+ Date32("1900-01-01") > wa,
+ Date32("1900-01-01") > wd,
+ Date32("1900-01-01") > wt,
+ Date32("1900-01-01") > waz,
+ Date32("1900-01-01") > wdz,
+ Date32("1900-01-01") > wtz,
+
+ Datetime64("1900-01-01T03:04:05Z") > na,
+ Datetime64("1900-01-01T03:04:05Z") > naz,
+ Datetime64("1900-01-01T03:04:05Z") > nd,
+ Datetime64("1900-01-01T03:04:05Z") > ndz,
+ Datetime64("1900-01-01T03:04:05Z") > nt,
+ Datetime64("1900-01-01T03:04:05Z") > ntz,
+ Datetime64("1900-01-01T03:04:05Z") > wa,
+ Datetime64("1900-01-01T03:04:05Z") > wd,
+ Datetime64("1900-01-01T03:04:05Z") > wt,
+ Datetime64("1900-01-01T03:04:05Z") > waz,
+ Datetime64("1900-01-01T03:04:05Z") > wdz,
+ Datetime64("1900-01-01T03:04:05Z") > wtz,
+
+ Timestamp64("1900-01-01T03:04:05.678912Z") > na,
+ Timestamp64("1900-01-01T03:04:05.678912Z") > naz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") > nd,
+ Timestamp64("1900-01-01T03:04:05.678912Z") > ndz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") > nt,
+ Timestamp64("1900-01-01T03:04:05.678912Z") > ntz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") > wa,
+ Timestamp64("1900-01-01T03:04:05.678912Z") > wd,
+ Timestamp64("1900-01-01T03:04:05.678912Z") > wt,
+ Timestamp64("1900-01-01T03:04:05.678912Z") > waz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") > wdz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") > wtz,
+
+ TzDate32("1900-01-01,Europe/Moscow") > na,
+ TzDate32("1900-01-01,Europe/Moscow") > naz,
+ TzDate32("1900-01-01,Europe/Moscow") > nd,
+ TzDate32("1900-01-01,Europe/Moscow") > ndz,
+ TzDate32("1900-01-01,Europe/Moscow") > nt,
+ TzDate32("1900-01-01,Europe/Moscow") > ntz,
+ TzDate32("1900-01-01,Europe/Moscow") > wa,
+ TzDate32("1900-01-01,Europe/Moscow") > wd,
+ TzDate32("1900-01-01,Europe/Moscow") > wt,
+ TzDate32("1900-01-01,Europe/Moscow") > waz,
+ TzDate32("1900-01-01,Europe/Moscow") > wdz,
+ TzDate32("1900-01-01,Europe/Moscow") > wtz,
+
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") > na,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") > naz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") > nd,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") > ndz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") > nt,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") > ntz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") > wa,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") > wd,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") > wt,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") > waz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") > wdz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") > wtz,
+
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") > na,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") > naz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") > nd,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") > ndz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") > nt,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") > ntz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") > wa,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") > wd,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") > wt,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") > waz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") > wdz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") > wtz,
+
+ Interval("P1D") > ni,
+ Interval("P1D") > wi,
+ Interval64("P1D") > ni,
+ Interval64("P1D") > wi,
+FROM Dates;
+
+SELECT
+ na > Date("2000-01-01"),
+ naz > Date("2000-01-01"),
+ nd > Date("2000-01-01"),
+ ndz > Date("2000-01-01"),
+ nt > Date("2000-01-01"),
+ ntz > Date("2000-01-01"),
+ wa > Date("2000-01-01"),
+ wd > Date("2000-01-01"),
+ wt > Date("2000-01-01"),
+ waz > Date("2000-01-01"),
+ wdz > Date("2000-01-01"),
+ wtz > Date("2000-01-01"),
+
+ na > TzDate("2000-01-01,Europe/Moscow"),
+ naz > TzDate("2000-01-01,Europe/Moscow"),
+ nd > TzDate("2000-01-01,Europe/Moscow"),
+ ndz > TzDate("2000-01-01,Europe/Moscow"),
+ nt > TzDate("2000-01-01,Europe/Moscow"),
+ ntz > TzDate("2000-01-01,Europe/Moscow"),
+ wa > TzDate("2000-01-01,Europe/Moscow"),
+ wd > TzDate("2000-01-01,Europe/Moscow"),
+ wt > TzDate("2000-01-01,Europe/Moscow"),
+ waz > TzDate("2000-01-01,Europe/Moscow"),
+ wdz > TzDate("2000-01-01,Europe/Moscow"),
+ wtz > TzDate("2000-01-01,Europe/Moscow"),
+
+ na > Datetime("2000-01-01T03:04:05Z"),
+ naz > Datetime("2000-01-01T03:04:05Z"),
+ nd > Datetime("2000-01-01T03:04:05Z"),
+ ndz > Datetime("2000-01-01T03:04:05Z"),
+ nt > Datetime("2000-01-01T03:04:05Z"),
+ ntz > Datetime("2000-01-01T03:04:05Z"),
+ wa > Datetime("2000-01-01T03:04:05Z"),
+ wd > Datetime("2000-01-01T03:04:05Z"),
+ wt > Datetime("2000-01-01T03:04:05Z"),
+ waz > Datetime("2000-01-01T03:04:05Z"),
+ wdz > Datetime("2000-01-01T03:04:05Z"),
+ wtz > Datetime("2000-01-01T03:04:05Z"),
+
+ na > TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ naz > TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ nd > TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ ndz > TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ nt > TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ ntz > TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wa > TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wd > TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wt > TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ waz > TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wdz > TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wtz > TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+
+ na > Timestamp("2000-01-01T03:04:05.678912Z"),
+ naz > Timestamp("2000-01-01T03:04:05.678912Z"),
+ nd > Timestamp("2000-01-01T03:04:05.678912Z"),
+ ndz > Timestamp("2000-01-01T03:04:05.678912Z"),
+ nt > Timestamp("2000-01-01T03:04:05.678912Z"),
+ ntz > Timestamp("2000-01-01T03:04:05.678912Z"),
+ wa > Timestamp("2000-01-01T03:04:05.678912Z"),
+ wd > Timestamp("2000-01-01T03:04:05.678912Z"),
+ wt > Timestamp("2000-01-01T03:04:05.678912Z"),
+ waz > Timestamp("2000-01-01T03:04:05.678912Z"),
+ wdz > Timestamp("2000-01-01T03:04:05.678912Z"),
+ wtz > Timestamp("2000-01-01T03:04:05.678912Z"),
+
+ na > TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ naz > TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ nd > TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ ndz > TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ nt > TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ ntz > TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wa > TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wd > TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wt > TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ waz > TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wdz > TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wtz > TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow")
+FROM Dates;
+
+SELECT
+ na > Date32("1900-01-01"),
+ naz > Date32("1900-01-01"),
+ nd > Date32("1900-01-01"),
+ ndz > Date32("1900-01-01"),
+ nt > Date32("1900-01-01"),
+ ntz > Date32("1900-01-01"),
+ wa > Date32("1900-01-01"),
+ wd > Date32("1900-01-01"),
+ wt > Date32("1900-01-01"),
+ waz > Date32("1900-01-01"),
+ wdz > Date32("1900-01-01"),
+ wtz > Date32("1900-01-01"),
+
+ na > Datetime64("1900-01-01T03:04:05Z"),
+ naz > Datetime64("1900-01-01T03:04:05Z"),
+ nd > Datetime64("1900-01-01T03:04:05Z"),
+ ndz > Datetime64("1900-01-01T03:04:05Z"),
+ nt > Datetime64("1900-01-01T03:04:05Z"),
+ ntz > Datetime64("1900-01-01T03:04:05Z"),
+ wa > Datetime64("1900-01-01T03:04:05Z"),
+ wd > Datetime64("1900-01-01T03:04:05Z"),
+ wt > Datetime64("1900-01-01T03:04:05Z"),
+ waz > Datetime64("1900-01-01T03:04:05Z"),
+ wdz > Datetime64("1900-01-01T03:04:05Z"),
+ wtz > Datetime64("1900-01-01T03:04:05Z"),
+
+ na > Timestamp64("1900-01-01T03:04:05.678912Z"),
+ naz > Timestamp64("1900-01-01T03:04:05.678912Z"),
+ nd > Timestamp64("1900-01-01T03:04:05.678912Z"),
+ ndz > Timestamp64("1900-01-01T03:04:05.678912Z"),
+ nt > Timestamp64("1900-01-01T03:04:05.678912Z"),
+ ntz > Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wa > Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wd > Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wt > Timestamp64("1900-01-01T03:04:05.678912Z"),
+ waz > Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wdz > Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wtz > Timestamp64("1900-01-01T03:04:05.678912Z"),
+
+ na > TzDate32("1900-01-01,Europe/Moscow"),
+ naz > TzDate32("1900-01-01,Europe/Moscow"),
+ nd > TzDate32("1900-01-01,Europe/Moscow"),
+ ndz > TzDate32("1900-01-01,Europe/Moscow"),
+ nt > TzDate32("1900-01-01,Europe/Moscow"),
+ ntz > TzDate32("1900-01-01,Europe/Moscow"),
+ wa > TzDate32("1900-01-01,Europe/Moscow"),
+ wd > TzDate32("1900-01-01,Europe/Moscow"),
+ wt > TzDate32("1900-01-01,Europe/Moscow"),
+ waz > TzDate32("1900-01-01,Europe/Moscow"),
+ wdz > TzDate32("1900-01-01,Europe/Moscow"),
+ wtz > TzDate32("1900-01-01,Europe/Moscow"),
+
+ na > TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ naz > TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ nd > TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ ndz > TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ nt > TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ ntz > TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wa > TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wd > TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wt > TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ waz > TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wdz > TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wtz > TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+
+ na > TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ naz > TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ nd > TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ ndz > TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ nt > TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ ntz > TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wa > TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wd > TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wt > TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ waz > TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wdz > TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wtz > TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+
+ ni > Interval("P1D"),
+ wi > Interval("P1D"),
+ ni > Interval64("P1D"),
+ wi > Interval64("P1D"),
+FROM Dates;
diff --git a/yt/yql/tests/sql/suites/blocks/date_group_by.cfg b/yt/yql/tests/sql/suites/blocks/date_group_by.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_group_by.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_group_by.sql b/yt/yql/tests/sql/suites/blocks/date_group_by.sql
new file mode 100644
index 0000000000..52354c9ea8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_group_by.sql
@@ -0,0 +1,9 @@
+USE plato;
+pragma yt.UseNativeDescSort;
+pragma yt.UsePartitionsByKeysForFinalAgg="false";
+
+SELECT
+ count(*),min(i8)
+FROM (SELECT * FROM concat(Dates,Dates)) as t
+GROUP BY na,wa,naz,waz,nd,ndz,wd,wdz,nt,ntz,wt,wtz,ni,wi;
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_less.cfg b/yt/yql/tests/sql/suites/blocks/date_less.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_less.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_less.sql b/yt/yql/tests/sql/suites/blocks/date_less.sql
new file mode 100644
index 0000000000..7145452b86
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_less.sql
@@ -0,0 +1,169 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin,FuseMultiOutsWithOuterMaps";
+
+SELECT
+ a.na < b.na,
+ a.na < b.naz,
+ a.na < b.nd,
+ a.na < b.ndz,
+ a.na < b.nt,
+ a.na < b.ntz,
+ a.na < b.wa,
+ a.na < b.wd,
+ a.na < b.wt,
+ a.na < b.waz,
+ a.na < b.wdz,
+ a.na < b.wtz,
+
+ a.naz < b.na,
+ a.naz < b.naz,
+ a.naz < b.nd,
+ a.naz < b.ndz,
+ a.naz < b.nt,
+ a.naz < b.ntz,
+ a.naz < b.wa,
+ a.naz < b.wd,
+ a.naz < b.wt,
+ a.naz < b.waz,
+ a.naz < b.wdz,
+ a.naz < b.wtz,
+
+ a.nd < b.na,
+ a.nd < b.naz,
+ a.nd < b.nd,
+ a.nd < b.ndz,
+ a.nd < b.nt,
+ a.nd < b.ntz,
+ a.nd < b.wa,
+ a.nd < b.wd,
+ a.nd < b.wt,
+ a.nd < b.waz,
+ a.nd < b.wdz,
+ a.nd < b.wtz,
+
+ a.ndz < b.na,
+ a.ndz < b.naz,
+ a.ndz < b.nd,
+ a.ndz < b.ndz,
+ a.ndz < b.nt,
+ a.ndz < b.ntz,
+ a.ndz < b.wa,
+ a.ndz < b.wd,
+ a.ndz < b.wt,
+ a.ndz < b.waz,
+ a.ndz < b.wdz,
+ a.ndz < b.wtz,
+
+ a.nt < b.na,
+ a.nt < b.naz,
+ a.nt < b.nd,
+ a.nt < b.ndz,
+ a.nt < b.nt,
+ a.nt < b.ntz,
+ a.nt < b.wa,
+ a.nt < b.wd,
+ a.nt < b.wt,
+ a.nt < b.waz,
+ a.nt < b.wdz,
+ a.nt < b.wtz,
+
+ a.ntz < b.na,
+ a.ntz < b.naz,
+ a.ntz < b.nd,
+ a.ntz < b.ndz,
+ a.ntz < b.nt,
+ a.ntz < b.ntz,
+ a.ntz < b.wa,
+ a.ntz < b.wd,
+ a.ntz < b.wt,
+ a.ntz < b.waz,
+ a.ntz < b.wdz,
+ a.ntz < b.wtz,
+
+ a.ni < b.ni,
+ a.ni < b.wi,
+ a.wi < b.ni,
+ a.wi < b.wi
+
+FROM Dates as a CROSS JOIN Dates as b;
+
+SELECT
+ a.wa < b.na,
+ a.wa < b.naz,
+ a.wa < b.nd,
+ a.wa < b.ndz,
+ a.wa < b.nt,
+ a.wa < b.ntz,
+ a.wa < b.wa,
+ a.wa < b.wd,
+ a.wa < b.wt,
+ a.wa < b.waz,
+ a.wa < b.wdz,
+ a.wa < b.wtz,
+
+ a.wd < b.na,
+ a.wd < b.naz,
+ a.wd < b.nd,
+ a.wd < b.ndz,
+ a.wd < b.nt,
+ a.wd < b.ntz,
+ a.wd < b.wa,
+ a.wd < b.wd,
+ a.wd < b.wt,
+ a.wd < b.waz,
+ a.wd < b.wdz,
+ a.wd < b.wtz,
+
+ a.wt < b.na,
+ a.wt < b.naz,
+ a.wt < b.nd,
+ a.wt < b.ndz,
+ a.wt < b.nt,
+ a.wt < b.ntz,
+ a.wt < b.wa,
+ a.wt < b.wd,
+ a.wt < b.wt,
+ a.wt < b.waz,
+ a.wt < b.wdz,
+ a.wt < b.wtz,
+
+ a.waz < b.na,
+ a.waz < b.naz,
+ a.waz < b.nd,
+ a.waz < b.ndz,
+ a.waz < b.nt,
+ a.waz < b.ntz,
+ a.waz < b.wa,
+ a.waz < b.wd,
+ a.waz < b.wt,
+ a.waz < b.waz,
+ a.waz < b.wdz,
+ a.waz < b.wtz,
+
+ a.wdz < b.na,
+ a.wdz < b.naz,
+ a.wdz < b.nd,
+ a.wdz < b.ndz,
+ a.wdz < b.nt,
+ a.wdz < b.ntz,
+ a.wdz < b.wa,
+ a.wdz < b.wd,
+ a.wdz < b.wt,
+ a.wdz < b.waz,
+ a.wdz < b.wdz,
+ a.wdz < b.wtz,
+
+ a.wtz < b.na,
+ a.wtz < b.naz,
+ a.wtz < b.nd,
+ a.wtz < b.ndz,
+ a.wtz < b.nt,
+ a.wtz < b.ntz,
+ a.wtz < b.wa,
+ a.wtz < b.wd,
+ a.wtz < b.wt,
+ a.wtz < b.waz,
+ a.wtz < b.wdz,
+ a.wtz < b.wtz
+
+FROM Dates as a CROSS JOIN Dates as b;
diff --git a/yt/yql/tests/sql/suites/blocks/date_less_or_equal.cfg b/yt/yql/tests/sql/suites/blocks/date_less_or_equal.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_less_or_equal.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_less_or_equal.sql b/yt/yql/tests/sql/suites/blocks/date_less_or_equal.sql
new file mode 100644
index 0000000000..e0ea714ca5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_less_or_equal.sql
@@ -0,0 +1,169 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin,FuseMultiOutsWithOuterMaps";
+
+SELECT
+ a.na <= b.na,
+ a.na <= b.naz,
+ a.na <= b.nd,
+ a.na <= b.ndz,
+ a.na <= b.nt,
+ a.na <= b.ntz,
+ a.na <= b.wa,
+ a.na <= b.wd,
+ a.na <= b.wt,
+ a.na <= b.waz,
+ a.na <= b.wdz,
+ a.na <= b.wtz,
+
+ a.naz <= b.na,
+ a.naz <= b.naz,
+ a.naz <= b.nd,
+ a.naz <= b.ndz,
+ a.naz <= b.nt,
+ a.naz <= b.ntz,
+ a.naz <= b.wa,
+ a.naz <= b.wd,
+ a.naz <= b.wt,
+ a.naz <= b.waz,
+ a.naz <= b.wdz,
+ a.naz <= b.wtz,
+
+ a.nd <= b.na,
+ a.nd <= b.naz,
+ a.nd <= b.nd,
+ a.nd <= b.ndz,
+ a.nd <= b.nt,
+ a.nd <= b.ntz,
+ a.nd <= b.wa,
+ a.nd <= b.wd,
+ a.nd <= b.wt,
+ a.nd <= b.waz,
+ a.nd <= b.wdz,
+ a.nd <= b.wtz,
+
+ a.ndz <= b.na,
+ a.ndz <= b.naz,
+ a.ndz <= b.nd,
+ a.ndz <= b.ndz,
+ a.ndz <= b.nt,
+ a.ndz <= b.ntz,
+ a.ndz <= b.wa,
+ a.ndz <= b.wd,
+ a.ndz <= b.wt,
+ a.ndz <= b.waz,
+ a.ndz <= b.wdz,
+ a.ndz <= b.wtz,
+
+ a.nt <= b.na,
+ a.nt <= b.naz,
+ a.nt <= b.nd,
+ a.nt <= b.ndz,
+ a.nt <= b.nt,
+ a.nt <= b.ntz,
+ a.nt <= b.wa,
+ a.nt <= b.wd,
+ a.nt <= b.wt,
+ a.nt <= b.waz,
+ a.nt <= b.wdz,
+ a.nt <= b.wtz,
+
+ a.ntz <= b.na,
+ a.ntz <= b.naz,
+ a.ntz <= b.nd,
+ a.ntz <= b.ndz,
+ a.ntz <= b.nt,
+ a.ntz <= b.ntz,
+ a.ntz <= b.wa,
+ a.ntz <= b.wd,
+ a.ntz <= b.wt,
+ a.ntz <= b.waz,
+ a.ntz <= b.wdz,
+ a.ntz <= b.wtz,
+
+ a.ni <= b.ni,
+ a.ni <= b.wi,
+ a.wi <= b.ni,
+ a.wi <= b.wi
+
+FROM Dates as a CROSS JOIN Dates as b;
+
+SELECT
+ a.wa <= b.na,
+ a.wa <= b.naz,
+ a.wa <= b.nd,
+ a.wa <= b.ndz,
+ a.wa <= b.nt,
+ a.wa <= b.ntz,
+ a.wa <= b.wa,
+ a.wa <= b.wd,
+ a.wa <= b.wt,
+ a.wa <= b.waz,
+ a.wa <= b.wdz,
+ a.wa <= b.wtz,
+
+ a.wd <= b.na,
+ a.wd <= b.naz,
+ a.wd <= b.nd,
+ a.wd <= b.ndz,
+ a.wd <= b.nt,
+ a.wd <= b.ntz,
+ a.wd <= b.wa,
+ a.wd <= b.wd,
+ a.wd <= b.wt,
+ a.wd <= b.waz,
+ a.wd <= b.wdz,
+ a.wd <= b.wtz,
+
+ a.wt <= b.na,
+ a.wt <= b.naz,
+ a.wt <= b.nd,
+ a.wt <= b.ndz,
+ a.wt <= b.nt,
+ a.wt <= b.ntz,
+ a.wt <= b.wa,
+ a.wt <= b.wd,
+ a.wt <= b.wt,
+ a.wt <= b.waz,
+ a.wt <= b.wdz,
+ a.wt <= b.wtz,
+
+ a.waz <= b.na,
+ a.waz <= b.naz,
+ a.waz <= b.nd,
+ a.waz <= b.ndz,
+ a.waz <= b.nt,
+ a.waz <= b.ntz,
+ a.waz <= b.wa,
+ a.waz <= b.wd,
+ a.waz <= b.wt,
+ a.waz <= b.waz,
+ a.waz <= b.wdz,
+ a.waz <= b.wtz,
+
+ a.wdz <= b.na,
+ a.wdz <= b.naz,
+ a.wdz <= b.nd,
+ a.wdz <= b.ndz,
+ a.wdz <= b.nt,
+ a.wdz <= b.ntz,
+ a.wdz <= b.wa,
+ a.wdz <= b.wd,
+ a.wdz <= b.wt,
+ a.wdz <= b.waz,
+ a.wdz <= b.wdz,
+ a.wdz <= b.wtz,
+
+ a.wtz <= b.na,
+ a.wtz <= b.naz,
+ a.wtz <= b.nd,
+ a.wtz <= b.ndz,
+ a.wtz <= b.nt,
+ a.wtz <= b.ntz,
+ a.wtz <= b.wa,
+ a.wtz <= b.wd,
+ a.wtz <= b.wt,
+ a.wtz <= b.waz,
+ a.wtz <= b.wdz,
+ a.wtz <= b.wtz
+
+FROM Dates as a CROSS JOIN Dates as b;
diff --git a/yt/yql/tests/sql/suites/blocks/date_less_or_equal_scalar.cfg b/yt/yql/tests/sql/suites/blocks/date_less_or_equal_scalar.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_less_or_equal_scalar.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_less_or_equal_scalar.sql b/yt/yql/tests/sql/suites/blocks/date_less_or_equal_scalar.sql
new file mode 100644
index 0000000000..2f2db17af9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_less_or_equal_scalar.sql
@@ -0,0 +1,332 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin,FuseMultiOutsWithOuterMaps";
+
+SELECT
+ Date("2000-01-01") <= na,
+ Date("2000-01-01") <= naz,
+ Date("2000-01-01") <= nd,
+ Date("2000-01-01") <= ndz,
+ Date("2000-01-01") <= nt,
+ Date("2000-01-01") <= ntz,
+ Date("2000-01-01") <= wa,
+ Date("2000-01-01") <= wd,
+ Date("2000-01-01") <= wt,
+ Date("2000-01-01") <= waz,
+ Date("2000-01-01") <= wdz,
+ Date("2000-01-01") <= wtz,
+
+ TzDate("2000-01-01,Europe/Moscow") <= na,
+ TzDate("2000-01-01,Europe/Moscow") <= naz,
+ TzDate("2000-01-01,Europe/Moscow") <= nd,
+ TzDate("2000-01-01,Europe/Moscow") <= ndz,
+ TzDate("2000-01-01,Europe/Moscow") <= nt,
+ TzDate("2000-01-01,Europe/Moscow") <= ntz,
+ TzDate("2000-01-01,Europe/Moscow") <= wa,
+ TzDate("2000-01-01,Europe/Moscow") <= wd,
+ TzDate("2000-01-01,Europe/Moscow") <= wt,
+ TzDate("2000-01-01,Europe/Moscow") <= waz,
+ TzDate("2000-01-01,Europe/Moscow") <= wdz,
+ TzDate("2000-01-01,Europe/Moscow") <= wtz,
+
+ Datetime("2000-01-01T03:04:05Z") <= na,
+ Datetime("2000-01-01T03:04:05Z") <= naz,
+ Datetime("2000-01-01T03:04:05Z") <= nd,
+ Datetime("2000-01-01T03:04:05Z") <= ndz,
+ Datetime("2000-01-01T03:04:05Z") <= nt,
+ Datetime("2000-01-01T03:04:05Z") <= ntz,
+ Datetime("2000-01-01T03:04:05Z") <= wa,
+ Datetime("2000-01-01T03:04:05Z") <= wd,
+ Datetime("2000-01-01T03:04:05Z") <= wt,
+ Datetime("2000-01-01T03:04:05Z") <= waz,
+ Datetime("2000-01-01T03:04:05Z") <= wdz,
+ Datetime("2000-01-01T03:04:05Z") <= wtz,
+
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") <= na,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") <= naz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") <= nd,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") <= ndz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") <= nt,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") <= ntz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") <= wa,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") <= wd,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") <= wt,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") <= waz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") <= wdz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") <= wtz,
+
+ Timestamp("2000-01-01T03:04:05.678912Z") <= na,
+ Timestamp("2000-01-01T03:04:05.678912Z") <= naz,
+ Timestamp("2000-01-01T03:04:05.678912Z") <= nd,
+ Timestamp("2000-01-01T03:04:05.678912Z") <= ndz,
+ Timestamp("2000-01-01T03:04:05.678912Z") <= nt,
+ Timestamp("2000-01-01T03:04:05.678912Z") <= ntz,
+ Timestamp("2000-01-01T03:04:05.678912Z") <= wa,
+ Timestamp("2000-01-01T03:04:05.678912Z") <= wd,
+ Timestamp("2000-01-01T03:04:05.678912Z") <= wt,
+ Timestamp("2000-01-01T03:04:05.678912Z") <= waz,
+ Timestamp("2000-01-01T03:04:05.678912Z") <= wdz,
+ Timestamp("2000-01-01T03:04:05.678912Z") <= wtz,
+
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") <= na,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") <= naz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") <= nd,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") <= ndz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") <= nt,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") <= ntz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") <= wa,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") <= wd,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") <= wt,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") <= waz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") <= wdz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") <= wtz
+FROM Dates;
+
+SELECT
+ Date32("1900-01-01") <= na,
+ Date32("1900-01-01") <= naz,
+ Date32("1900-01-01") <= nd,
+ Date32("1900-01-01") <= ndz,
+ Date32("1900-01-01") <= nt,
+ Date32("1900-01-01") <= ntz,
+ Date32("1900-01-01") <= wa,
+ Date32("1900-01-01") <= wd,
+ Date32("1900-01-01") <= wt,
+ Date32("1900-01-01") <= waz,
+ Date32("1900-01-01") <= wdz,
+ Date32("1900-01-01") <= wtz,
+
+ Datetime64("1900-01-01T03:04:05Z") <= na,
+ Datetime64("1900-01-01T03:04:05Z") <= naz,
+ Datetime64("1900-01-01T03:04:05Z") <= nd,
+ Datetime64("1900-01-01T03:04:05Z") <= ndz,
+ Datetime64("1900-01-01T03:04:05Z") <= nt,
+ Datetime64("1900-01-01T03:04:05Z") <= ntz,
+ Datetime64("1900-01-01T03:04:05Z") <= wa,
+ Datetime64("1900-01-01T03:04:05Z") <= wd,
+ Datetime64("1900-01-01T03:04:05Z") <= wt,
+ Datetime64("1900-01-01T03:04:05Z") <= waz,
+ Datetime64("1900-01-01T03:04:05Z") <= wdz,
+ Datetime64("1900-01-01T03:04:05Z") <= wtz,
+
+ Timestamp64("1900-01-01T03:04:05.678912Z") <= na,
+ Timestamp64("1900-01-01T03:04:05.678912Z") <= naz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") <= nd,
+ Timestamp64("1900-01-01T03:04:05.678912Z") <= ndz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") <= nt,
+ Timestamp64("1900-01-01T03:04:05.678912Z") <= ntz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") <= wa,
+ Timestamp64("1900-01-01T03:04:05.678912Z") <= wd,
+ Timestamp64("1900-01-01T03:04:05.678912Z") <= wt,
+ Timestamp64("1900-01-01T03:04:05.678912Z") <= waz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") <= wdz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") <= wtz,
+
+ TzDate32("1900-01-01,Europe/Moscow") <= na,
+ TzDate32("1900-01-01,Europe/Moscow") <= naz,
+ TzDate32("1900-01-01,Europe/Moscow") <= nd,
+ TzDate32("1900-01-01,Europe/Moscow") <= ndz,
+ TzDate32("1900-01-01,Europe/Moscow") <= nt,
+ TzDate32("1900-01-01,Europe/Moscow") <= ntz,
+ TzDate32("1900-01-01,Europe/Moscow") <= wa,
+ TzDate32("1900-01-01,Europe/Moscow") <= wd,
+ TzDate32("1900-01-01,Europe/Moscow") <= wt,
+ TzDate32("1900-01-01,Europe/Moscow") <= waz,
+ TzDate32("1900-01-01,Europe/Moscow") <= wdz,
+ TzDate32("1900-01-01,Europe/Moscow") <= wtz,
+
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") <= na,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") <= naz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") <= nd,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") <= ndz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") <= nt,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") <= ntz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") <= wa,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") <= wd,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") <= wt,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") <= waz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") <= wdz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") <= wtz,
+
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") <= na,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") <= naz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") <= nd,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") <= ndz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") <= nt,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") <= ntz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") <= wa,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") <= wd,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") <= wt,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") <= waz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") <= wdz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") <= wtz,
+
+ Interval("P1D") <= ni,
+ Interval("P1D") <= wi,
+ Interval64("P1D") <= ni,
+ Interval64("P1D") <= wi,
+FROM Dates;
+
+SELECT
+ na <= Date("2000-01-01"),
+ naz <= Date("2000-01-01"),
+ nd <= Date("2000-01-01"),
+ ndz <= Date("2000-01-01"),
+ nt <= Date("2000-01-01"),
+ ntz <= Date("2000-01-01"),
+ wa <= Date("2000-01-01"),
+ wd <= Date("2000-01-01"),
+ wt <= Date("2000-01-01"),
+ waz <= Date("2000-01-01"),
+ wdz <= Date("2000-01-01"),
+ wtz <= Date("2000-01-01"),
+
+ na <= TzDate("2000-01-01,Europe/Moscow"),
+ naz <= TzDate("2000-01-01,Europe/Moscow"),
+ nd <= TzDate("2000-01-01,Europe/Moscow"),
+ ndz <= TzDate("2000-01-01,Europe/Moscow"),
+ nt <= TzDate("2000-01-01,Europe/Moscow"),
+ ntz <= TzDate("2000-01-01,Europe/Moscow"),
+ wa <= TzDate("2000-01-01,Europe/Moscow"),
+ wd <= TzDate("2000-01-01,Europe/Moscow"),
+ wt <= TzDate("2000-01-01,Europe/Moscow"),
+ waz <= TzDate("2000-01-01,Europe/Moscow"),
+ wdz <= TzDate("2000-01-01,Europe/Moscow"),
+ wtz <= TzDate("2000-01-01,Europe/Moscow"),
+
+ na <= Datetime("2000-01-01T03:04:05Z"),
+ naz <= Datetime("2000-01-01T03:04:05Z"),
+ nd <= Datetime("2000-01-01T03:04:05Z"),
+ ndz <= Datetime("2000-01-01T03:04:05Z"),
+ nt <= Datetime("2000-01-01T03:04:05Z"),
+ ntz <= Datetime("2000-01-01T03:04:05Z"),
+ wa <= Datetime("2000-01-01T03:04:05Z"),
+ wd <= Datetime("2000-01-01T03:04:05Z"),
+ wt <= Datetime("2000-01-01T03:04:05Z"),
+ waz <= Datetime("2000-01-01T03:04:05Z"),
+ wdz <= Datetime("2000-01-01T03:04:05Z"),
+ wtz <= Datetime("2000-01-01T03:04:05Z"),
+
+ na <= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ naz <= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ nd <= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ ndz <= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ nt <= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ ntz <= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wa <= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wd <= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wt <= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ waz <= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wdz <= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wtz <= TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+
+ na <= Timestamp("2000-01-01T03:04:05.678912Z"),
+ naz <= Timestamp("2000-01-01T03:04:05.678912Z"),
+ nd <= Timestamp("2000-01-01T03:04:05.678912Z"),
+ ndz <= Timestamp("2000-01-01T03:04:05.678912Z"),
+ nt <= Timestamp("2000-01-01T03:04:05.678912Z"),
+ ntz <= Timestamp("2000-01-01T03:04:05.678912Z"),
+ wa <= Timestamp("2000-01-01T03:04:05.678912Z"),
+ wd <= Timestamp("2000-01-01T03:04:05.678912Z"),
+ wt <= Timestamp("2000-01-01T03:04:05.678912Z"),
+ waz <= Timestamp("2000-01-01T03:04:05.678912Z"),
+ wdz <= Timestamp("2000-01-01T03:04:05.678912Z"),
+ wtz <= Timestamp("2000-01-01T03:04:05.678912Z"),
+
+ na <= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ naz <= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ nd <= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ ndz <= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ nt <= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ ntz <= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wa <= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wd <= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wt <= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ waz <= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wdz <= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wtz <= TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow")
+FROM Dates;
+
+SELECT
+ na <= Date32("1900-01-01"),
+ naz <= Date32("1900-01-01"),
+ nd <= Date32("1900-01-01"),
+ ndz <= Date32("1900-01-01"),
+ nt <= Date32("1900-01-01"),
+ ntz <= Date32("1900-01-01"),
+ wa <= Date32("1900-01-01"),
+ wd <= Date32("1900-01-01"),
+ wt <= Date32("1900-01-01"),
+ waz <= Date32("1900-01-01"),
+ wdz <= Date32("1900-01-01"),
+ wtz <= Date32("1900-01-01"),
+
+ na <= Datetime64("1900-01-01T03:04:05Z"),
+ naz <= Datetime64("1900-01-01T03:04:05Z"),
+ nd <= Datetime64("1900-01-01T03:04:05Z"),
+ ndz <= Datetime64("1900-01-01T03:04:05Z"),
+ nt <= Datetime64("1900-01-01T03:04:05Z"),
+ ntz <= Datetime64("1900-01-01T03:04:05Z"),
+ wa <= Datetime64("1900-01-01T03:04:05Z"),
+ wd <= Datetime64("1900-01-01T03:04:05Z"),
+ wt <= Datetime64("1900-01-01T03:04:05Z"),
+ waz <= Datetime64("1900-01-01T03:04:05Z"),
+ wdz <= Datetime64("1900-01-01T03:04:05Z"),
+ wtz <= Datetime64("1900-01-01T03:04:05Z"),
+
+ na <= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ naz <= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ nd <= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ ndz <= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ nt <= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ ntz <= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wa <= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wd <= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wt <= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ waz <= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wdz <= Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wtz <= Timestamp64("1900-01-01T03:04:05.678912Z"),
+
+ na <= TzDate32("1900-01-01,Europe/Moscow"),
+ naz <= TzDate32("1900-01-01,Europe/Moscow"),
+ nd <= TzDate32("1900-01-01,Europe/Moscow"),
+ ndz <= TzDate32("1900-01-01,Europe/Moscow"),
+ nt <= TzDate32("1900-01-01,Europe/Moscow"),
+ ntz <= TzDate32("1900-01-01,Europe/Moscow"),
+ wa <= TzDate32("1900-01-01,Europe/Moscow"),
+ wd <= TzDate32("1900-01-01,Europe/Moscow"),
+ wt <= TzDate32("1900-01-01,Europe/Moscow"),
+ waz <= TzDate32("1900-01-01,Europe/Moscow"),
+ wdz <= TzDate32("1900-01-01,Europe/Moscow"),
+ wtz <= TzDate32("1900-01-01,Europe/Moscow"),
+
+ na <= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ naz <= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ nd <= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ ndz <= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ nt <= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ ntz <= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wa <= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wd <= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wt <= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ waz <= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wdz <= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wtz <= TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+
+ na <= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ naz <= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ nd <= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ ndz <= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ nt <= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ ntz <= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wa <= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wd <= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wt <= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ waz <= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wdz <= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wtz <= TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+
+ ni <= Interval("P1D"),
+ wi <= Interval("P1D"),
+ ni <= Interval64("P1D"),
+ wi <= Interval64("P1D"),
+FROM Dates;
diff --git a/yt/yql/tests/sql/suites/blocks/date_less_scalar.cfg b/yt/yql/tests/sql/suites/blocks/date_less_scalar.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_less_scalar.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_less_scalar.sql b/yt/yql/tests/sql/suites/blocks/date_less_scalar.sql
new file mode 100644
index 0000000000..d62f54d430
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_less_scalar.sql
@@ -0,0 +1,332 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin,FuseMultiOutsWithOuterMaps";
+
+SELECT
+ Date("2000-01-01") < na,
+ Date("2000-01-01") < naz,
+ Date("2000-01-01") < nd,
+ Date("2000-01-01") < ndz,
+ Date("2000-01-01") < nt,
+ Date("2000-01-01") < ntz,
+ Date("2000-01-01") < wa,
+ Date("2000-01-01") < wd,
+ Date("2000-01-01") < wt,
+ Date("2000-01-01") < waz,
+ Date("2000-01-01") < wdz,
+ Date("2000-01-01") < wtz,
+
+ TzDate("2000-01-01,Europe/Moscow") < na,
+ TzDate("2000-01-01,Europe/Moscow") < naz,
+ TzDate("2000-01-01,Europe/Moscow") < nd,
+ TzDate("2000-01-01,Europe/Moscow") < ndz,
+ TzDate("2000-01-01,Europe/Moscow") < nt,
+ TzDate("2000-01-01,Europe/Moscow") < ntz,
+ TzDate("2000-01-01,Europe/Moscow") < wa,
+ TzDate("2000-01-01,Europe/Moscow") < wd,
+ TzDate("2000-01-01,Europe/Moscow") < wt,
+ TzDate("2000-01-01,Europe/Moscow") < waz,
+ TzDate("2000-01-01,Europe/Moscow") < wdz,
+ TzDate("2000-01-01,Europe/Moscow") < wtz,
+
+ Datetime("2000-01-01T03:04:05Z") < na,
+ Datetime("2000-01-01T03:04:05Z") < naz,
+ Datetime("2000-01-01T03:04:05Z") < nd,
+ Datetime("2000-01-01T03:04:05Z") < ndz,
+ Datetime("2000-01-01T03:04:05Z") < nt,
+ Datetime("2000-01-01T03:04:05Z") < ntz,
+ Datetime("2000-01-01T03:04:05Z") < wa,
+ Datetime("2000-01-01T03:04:05Z") < wd,
+ Datetime("2000-01-01T03:04:05Z") < wt,
+ Datetime("2000-01-01T03:04:05Z") < waz,
+ Datetime("2000-01-01T03:04:05Z") < wdz,
+ Datetime("2000-01-01T03:04:05Z") < wtz,
+
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") < na,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") < naz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") < nd,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") < ndz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") < nt,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") < ntz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") < wa,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") < wd,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") < wt,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") < waz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") < wdz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") < wtz,
+
+ Timestamp("2000-01-01T03:04:05.678912Z") < na,
+ Timestamp("2000-01-01T03:04:05.678912Z") < naz,
+ Timestamp("2000-01-01T03:04:05.678912Z") < nd,
+ Timestamp("2000-01-01T03:04:05.678912Z") < ndz,
+ Timestamp("2000-01-01T03:04:05.678912Z") < nt,
+ Timestamp("2000-01-01T03:04:05.678912Z") < ntz,
+ Timestamp("2000-01-01T03:04:05.678912Z") < wa,
+ Timestamp("2000-01-01T03:04:05.678912Z") < wd,
+ Timestamp("2000-01-01T03:04:05.678912Z") < wt,
+ Timestamp("2000-01-01T03:04:05.678912Z") < waz,
+ Timestamp("2000-01-01T03:04:05.678912Z") < wdz,
+ Timestamp("2000-01-01T03:04:05.678912Z") < wtz,
+
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") < na,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") < naz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") < nd,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") < ndz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") < nt,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") < ntz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") < wa,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") < wd,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") < wt,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") < waz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") < wdz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") < wtz
+FROM Dates;
+
+SELECT
+ Date32("1900-01-01") < na,
+ Date32("1900-01-01") < naz,
+ Date32("1900-01-01") < nd,
+ Date32("1900-01-01") < ndz,
+ Date32("1900-01-01") < nt,
+ Date32("1900-01-01") < ntz,
+ Date32("1900-01-01") < wa,
+ Date32("1900-01-01") < wd,
+ Date32("1900-01-01") < wt,
+ Date32("1900-01-01") < waz,
+ Date32("1900-01-01") < wdz,
+ Date32("1900-01-01") < wtz,
+
+ Datetime64("1900-01-01T03:04:05Z") < na,
+ Datetime64("1900-01-01T03:04:05Z") < naz,
+ Datetime64("1900-01-01T03:04:05Z") < nd,
+ Datetime64("1900-01-01T03:04:05Z") < ndz,
+ Datetime64("1900-01-01T03:04:05Z") < nt,
+ Datetime64("1900-01-01T03:04:05Z") < ntz,
+ Datetime64("1900-01-01T03:04:05Z") < wa,
+ Datetime64("1900-01-01T03:04:05Z") < wd,
+ Datetime64("1900-01-01T03:04:05Z") < wt,
+ Datetime64("1900-01-01T03:04:05Z") < waz,
+ Datetime64("1900-01-01T03:04:05Z") < wdz,
+ Datetime64("1900-01-01T03:04:05Z") < wtz,
+
+ Timestamp64("1900-01-01T03:04:05.678912Z") < na,
+ Timestamp64("1900-01-01T03:04:05.678912Z") < naz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") < nd,
+ Timestamp64("1900-01-01T03:04:05.678912Z") < ndz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") < nt,
+ Timestamp64("1900-01-01T03:04:05.678912Z") < ntz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") < wa,
+ Timestamp64("1900-01-01T03:04:05.678912Z") < wd,
+ Timestamp64("1900-01-01T03:04:05.678912Z") < wt,
+ Timestamp64("1900-01-01T03:04:05.678912Z") < waz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") < wdz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") < wtz,
+
+ TzDate32("1900-01-01,Europe/Moscow") < na,
+ TzDate32("1900-01-01,Europe/Moscow") < naz,
+ TzDate32("1900-01-01,Europe/Moscow") < nd,
+ TzDate32("1900-01-01,Europe/Moscow") < ndz,
+ TzDate32("1900-01-01,Europe/Moscow") < nt,
+ TzDate32("1900-01-01,Europe/Moscow") < ntz,
+ TzDate32("1900-01-01,Europe/Moscow") < wa,
+ TzDate32("1900-01-01,Europe/Moscow") < wd,
+ TzDate32("1900-01-01,Europe/Moscow") < wt,
+ TzDate32("1900-01-01,Europe/Moscow") < waz,
+ TzDate32("1900-01-01,Europe/Moscow") < wdz,
+ TzDate32("1900-01-01,Europe/Moscow") < wtz,
+
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") < na,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") < naz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") < nd,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") < ndz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") < nt,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") < ntz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") < wa,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") < wd,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") < wt,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") < waz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") < wdz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") < wtz,
+
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") < na,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") < naz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") < nd,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") < ndz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") < nt,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") < ntz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") < wa,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") < wd,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") < wt,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") < waz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") < wdz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") < wtz,
+
+ Interval("P1D") < ni,
+ Interval("P1D") < wi,
+ Interval64("P1D") < ni,
+ Interval64("P1D") < wi,
+FROM Dates;
+
+SELECT
+ na < Date("2000-01-01"),
+ naz < Date("2000-01-01"),
+ nd < Date("2000-01-01"),
+ ndz < Date("2000-01-01"),
+ nt < Date("2000-01-01"),
+ ntz < Date("2000-01-01"),
+ wa < Date("2000-01-01"),
+ wd < Date("2000-01-01"),
+ wt < Date("2000-01-01"),
+ waz < Date("2000-01-01"),
+ wdz < Date("2000-01-01"),
+ wtz < Date("2000-01-01"),
+
+ na < TzDate("2000-01-01,Europe/Moscow"),
+ naz < TzDate("2000-01-01,Europe/Moscow"),
+ nd < TzDate("2000-01-01,Europe/Moscow"),
+ ndz < TzDate("2000-01-01,Europe/Moscow"),
+ nt < TzDate("2000-01-01,Europe/Moscow"),
+ ntz < TzDate("2000-01-01,Europe/Moscow"),
+ wa < TzDate("2000-01-01,Europe/Moscow"),
+ wd < TzDate("2000-01-01,Europe/Moscow"),
+ wt < TzDate("2000-01-01,Europe/Moscow"),
+ waz < TzDate("2000-01-01,Europe/Moscow"),
+ wdz < TzDate("2000-01-01,Europe/Moscow"),
+ wtz < TzDate("2000-01-01,Europe/Moscow"),
+
+ na < Datetime("2000-01-01T03:04:05Z"),
+ naz < Datetime("2000-01-01T03:04:05Z"),
+ nd < Datetime("2000-01-01T03:04:05Z"),
+ ndz < Datetime("2000-01-01T03:04:05Z"),
+ nt < Datetime("2000-01-01T03:04:05Z"),
+ ntz < Datetime("2000-01-01T03:04:05Z"),
+ wa < Datetime("2000-01-01T03:04:05Z"),
+ wd < Datetime("2000-01-01T03:04:05Z"),
+ wt < Datetime("2000-01-01T03:04:05Z"),
+ waz < Datetime("2000-01-01T03:04:05Z"),
+ wdz < Datetime("2000-01-01T03:04:05Z"),
+ wtz < Datetime("2000-01-01T03:04:05Z"),
+
+ na < TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ naz < TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ nd < TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ ndz < TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ nt < TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ ntz < TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wa < TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wd < TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wt < TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ waz < TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wdz < TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wtz < TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+
+ na < Timestamp("2000-01-01T03:04:05.678912Z"),
+ naz < Timestamp("2000-01-01T03:04:05.678912Z"),
+ nd < Timestamp("2000-01-01T03:04:05.678912Z"),
+ ndz < Timestamp("2000-01-01T03:04:05.678912Z"),
+ nt < Timestamp("2000-01-01T03:04:05.678912Z"),
+ ntz < Timestamp("2000-01-01T03:04:05.678912Z"),
+ wa < Timestamp("2000-01-01T03:04:05.678912Z"),
+ wd < Timestamp("2000-01-01T03:04:05.678912Z"),
+ wt < Timestamp("2000-01-01T03:04:05.678912Z"),
+ waz < Timestamp("2000-01-01T03:04:05.678912Z"),
+ wdz < Timestamp("2000-01-01T03:04:05.678912Z"),
+ wtz < Timestamp("2000-01-01T03:04:05.678912Z"),
+
+ na < TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ naz < TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ nd < TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ ndz < TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ nt < TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ ntz < TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wa < TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wd < TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wt < TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ waz < TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wdz < TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wtz < TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow")
+FROM Dates;
+
+SELECT
+ na < Date32("1900-01-01"),
+ naz < Date32("1900-01-01"),
+ nd < Date32("1900-01-01"),
+ ndz < Date32("1900-01-01"),
+ nt < Date32("1900-01-01"),
+ ntz < Date32("1900-01-01"),
+ wa < Date32("1900-01-01"),
+ wd < Date32("1900-01-01"),
+ wt < Date32("1900-01-01"),
+ waz < Date32("1900-01-01"),
+ wdz < Date32("1900-01-01"),
+ wtz < Date32("1900-01-01"),
+
+ na < Datetime64("1900-01-01T03:04:05Z"),
+ naz < Datetime64("1900-01-01T03:04:05Z"),
+ nd < Datetime64("1900-01-01T03:04:05Z"),
+ ndz < Datetime64("1900-01-01T03:04:05Z"),
+ nt < Datetime64("1900-01-01T03:04:05Z"),
+ ntz < Datetime64("1900-01-01T03:04:05Z"),
+ wa < Datetime64("1900-01-01T03:04:05Z"),
+ wd < Datetime64("1900-01-01T03:04:05Z"),
+ wt < Datetime64("1900-01-01T03:04:05Z"),
+ waz < Datetime64("1900-01-01T03:04:05Z"),
+ wdz < Datetime64("1900-01-01T03:04:05Z"),
+ wtz < Datetime64("1900-01-01T03:04:05Z"),
+
+ na < Timestamp64("1900-01-01T03:04:05.678912Z"),
+ naz < Timestamp64("1900-01-01T03:04:05.678912Z"),
+ nd < Timestamp64("1900-01-01T03:04:05.678912Z"),
+ ndz < Timestamp64("1900-01-01T03:04:05.678912Z"),
+ nt < Timestamp64("1900-01-01T03:04:05.678912Z"),
+ ntz < Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wa < Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wd < Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wt < Timestamp64("1900-01-01T03:04:05.678912Z"),
+ waz < Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wdz < Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wtz < Timestamp64("1900-01-01T03:04:05.678912Z"),
+
+ na < TzDate32("1900-01-01,Europe/Moscow"),
+ naz < TzDate32("1900-01-01,Europe/Moscow"),
+ nd < TzDate32("1900-01-01,Europe/Moscow"),
+ ndz < TzDate32("1900-01-01,Europe/Moscow"),
+ nt < TzDate32("1900-01-01,Europe/Moscow"),
+ ntz < TzDate32("1900-01-01,Europe/Moscow"),
+ wa < TzDate32("1900-01-01,Europe/Moscow"),
+ wd < TzDate32("1900-01-01,Europe/Moscow"),
+ wt < TzDate32("1900-01-01,Europe/Moscow"),
+ waz < TzDate32("1900-01-01,Europe/Moscow"),
+ wdz < TzDate32("1900-01-01,Europe/Moscow"),
+ wtz < TzDate32("1900-01-01,Europe/Moscow"),
+
+ na < TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ naz < TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ nd < TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ ndz < TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ nt < TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ ntz < TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wa < TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wd < TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wt < TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ waz < TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wdz < TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wtz < TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+
+ na < TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ naz < TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ nd < TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ ndz < TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ nt < TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ ntz < TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wa < TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wd < TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wt < TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ waz < TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wdz < TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wtz < TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+
+ ni < Interval("P1D"),
+ wi < Interval("P1D"),
+ ni < Interval64("P1D"),
+ wi < Interval64("P1D"),
+FROM Dates;
diff --git a/yt/yql/tests/sql/suites/blocks/date_not_equals.cfg b/yt/yql/tests/sql/suites/blocks/date_not_equals.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_not_equals.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_not_equals.sql b/yt/yql/tests/sql/suites/blocks/date_not_equals.sql
new file mode 100644
index 0000000000..098dbd0d58
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_not_equals.sql
@@ -0,0 +1,169 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin,FuseMultiOutsWithOuterMaps";
+
+SELECT
+ a.na != b.na,
+ a.na != b.naz,
+ a.na != b.nd,
+ a.na != b.ndz,
+ a.na != b.nt,
+ a.na != b.ntz,
+ a.na != b.wa,
+ a.na != b.wd,
+ a.na != b.wt,
+ a.na != b.waz,
+ a.na != b.wdz,
+ a.na != b.wtz,
+
+ a.naz != b.na,
+ a.naz != b.naz,
+ a.naz != b.nd,
+ a.naz != b.ndz,
+ a.naz != b.nt,
+ a.naz != b.ntz,
+ a.naz != b.wa,
+ a.naz != b.wd,
+ a.naz != b.wt,
+ a.naz != b.waz,
+ a.naz != b.wdz,
+ a.naz != b.wtz,
+
+ a.nd != b.na,
+ a.nd != b.naz,
+ a.nd != b.nd,
+ a.nd != b.ndz,
+ a.nd != b.nt,
+ a.nd != b.ntz,
+ a.nd != b.wa,
+ a.nd != b.wd,
+ a.nd != b.wt,
+ a.nd != b.waz,
+ a.nd != b.wdz,
+ a.nd != b.wtz,
+
+ a.ndz != b.na,
+ a.ndz != b.naz,
+ a.ndz != b.nd,
+ a.ndz != b.ndz,
+ a.ndz != b.nt,
+ a.ndz != b.ntz,
+ a.ndz != b.wa,
+ a.ndz != b.wd,
+ a.ndz != b.wt,
+ a.ndz != b.waz,
+ a.ndz != b.wdz,
+ a.ndz != b.wtz,
+
+ a.nt != b.na,
+ a.nt != b.naz,
+ a.nt != b.nd,
+ a.nt != b.ndz,
+ a.nt != b.nt,
+ a.nt != b.ntz,
+ a.nt != b.wa,
+ a.nt != b.wd,
+ a.nt != b.wt,
+ a.nt != b.waz,
+ a.nt != b.wdz,
+ a.nt != b.wtz,
+
+ a.ntz != b.na,
+ a.ntz != b.naz,
+ a.ntz != b.nd,
+ a.ntz != b.ndz,
+ a.ntz != b.nt,
+ a.ntz != b.ntz,
+ a.ntz != b.wa,
+ a.ntz != b.wd,
+ a.ntz != b.wt,
+ a.ntz != b.waz,
+ a.ntz != b.wdz,
+ a.ntz != b.wtz,
+
+ a.ni != b.ni,
+ a.ni != b.wi,
+ a.wi != b.ni,
+ a.wi != b.wi
+
+FROM Dates as a CROSS JOIN Dates as b;
+
+SELECT
+ a.wa != b.na,
+ a.wa != b.naz,
+ a.wa != b.nd,
+ a.wa != b.ndz,
+ a.wa != b.nt,
+ a.wa != b.ntz,
+ a.wa != b.wa,
+ a.wa != b.wd,
+ a.wa != b.wt,
+ a.wa != b.waz,
+ a.wa != b.wdz,
+ a.wa != b.wtz,
+
+ a.wd != b.na,
+ a.wd != b.naz,
+ a.wd != b.nd,
+ a.wd != b.ndz,
+ a.wd != b.nt,
+ a.wd != b.ntz,
+ a.wd != b.wa,
+ a.wd != b.wd,
+ a.wd != b.wt,
+ a.wd != b.waz,
+ a.wd != b.wdz,
+ a.wd != b.wtz,
+
+ a.wt != b.na,
+ a.wt != b.naz,
+ a.wt != b.nd,
+ a.wt != b.ndz,
+ a.wt != b.nt,
+ a.wt != b.ntz,
+ a.wt != b.wa,
+ a.wt != b.wd,
+ a.wt != b.wt,
+ a.wt != b.waz,
+ a.wt != b.wdz,
+ a.wt != b.wtz,
+
+ a.waz != b.na,
+ a.waz != b.naz,
+ a.waz != b.nd,
+ a.waz != b.ndz,
+ a.waz != b.nt,
+ a.waz != b.ntz,
+ a.waz != b.wa,
+ a.waz != b.wd,
+ a.waz != b.wt,
+ a.waz != b.waz,
+ a.waz != b.wdz,
+ a.waz != b.wtz,
+
+ a.wdz != b.na,
+ a.wdz != b.naz,
+ a.wdz != b.nd,
+ a.wdz != b.ndz,
+ a.wdz != b.nt,
+ a.wdz != b.ntz,
+ a.wdz != b.wa,
+ a.wdz != b.wd,
+ a.wdz != b.wt,
+ a.wdz != b.waz,
+ a.wdz != b.wdz,
+ a.wdz != b.wtz,
+
+ a.wtz != b.na,
+ a.wtz != b.naz,
+ a.wtz != b.nd,
+ a.wtz != b.ndz,
+ a.wtz != b.nt,
+ a.wtz != b.ntz,
+ a.wtz != b.wa,
+ a.wtz != b.wd,
+ a.wtz != b.wt,
+ a.wtz != b.waz,
+ a.wtz != b.wdz,
+ a.wtz != b.wtz
+
+FROM Dates as a CROSS JOIN Dates as b;
diff --git a/yt/yql/tests/sql/suites/blocks/date_not_equals_scalar.cfg b/yt/yql/tests/sql/suites/blocks/date_not_equals_scalar.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_not_equals_scalar.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_not_equals_scalar.sql b/yt/yql/tests/sql/suites/blocks/date_not_equals_scalar.sql
new file mode 100644
index 0000000000..803fcc49ee
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_not_equals_scalar.sql
@@ -0,0 +1,332 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin,FuseMultiOutsWithOuterMaps";
+
+SELECT
+ Date("2000-01-01") != na,
+ Date("2000-01-01") != naz,
+ Date("2000-01-01") != nd,
+ Date("2000-01-01") != ndz,
+ Date("2000-01-01") != nt,
+ Date("2000-01-01") != ntz,
+ Date("2000-01-01") != wa,
+ Date("2000-01-01") != wd,
+ Date("2000-01-01") != wt,
+ Date("2000-01-01") != waz,
+ Date("2000-01-01") != wdz,
+ Date("2000-01-01") != wtz,
+
+ TzDate("2000-01-01,Europe/Moscow") != na,
+ TzDate("2000-01-01,Europe/Moscow") != naz,
+ TzDate("2000-01-01,Europe/Moscow") != nd,
+ TzDate("2000-01-01,Europe/Moscow") != ndz,
+ TzDate("2000-01-01,Europe/Moscow") != nt,
+ TzDate("2000-01-01,Europe/Moscow") != ntz,
+ TzDate("2000-01-01,Europe/Moscow") != wa,
+ TzDate("2000-01-01,Europe/Moscow") != wd,
+ TzDate("2000-01-01,Europe/Moscow") != wt,
+ TzDate("2000-01-01,Europe/Moscow") != waz,
+ TzDate("2000-01-01,Europe/Moscow") != wdz,
+ TzDate("2000-01-01,Europe/Moscow") != wtz,
+
+ Datetime("2000-01-01T03:04:05Z") != na,
+ Datetime("2000-01-01T03:04:05Z") != naz,
+ Datetime("2000-01-01T03:04:05Z") != nd,
+ Datetime("2000-01-01T03:04:05Z") != ndz,
+ Datetime("2000-01-01T03:04:05Z") != nt,
+ Datetime("2000-01-01T03:04:05Z") != ntz,
+ Datetime("2000-01-01T03:04:05Z") != wa,
+ Datetime("2000-01-01T03:04:05Z") != wd,
+ Datetime("2000-01-01T03:04:05Z") != wt,
+ Datetime("2000-01-01T03:04:05Z") != waz,
+ Datetime("2000-01-01T03:04:05Z") != wdz,
+ Datetime("2000-01-01T03:04:05Z") != wtz,
+
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") != na,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") != naz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") != nd,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") != ndz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") != nt,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") != ntz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") != wa,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") != wd,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") != wt,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") != waz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") != wdz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") != wtz,
+
+ Timestamp("2000-01-01T03:04:05.678912Z") != na,
+ Timestamp("2000-01-01T03:04:05.678912Z") != naz,
+ Timestamp("2000-01-01T03:04:05.678912Z") != nd,
+ Timestamp("2000-01-01T03:04:05.678912Z") != ndz,
+ Timestamp("2000-01-01T03:04:05.678912Z") != nt,
+ Timestamp("2000-01-01T03:04:05.678912Z") != ntz,
+ Timestamp("2000-01-01T03:04:05.678912Z") != wa,
+ Timestamp("2000-01-01T03:04:05.678912Z") != wd,
+ Timestamp("2000-01-01T03:04:05.678912Z") != wt,
+ Timestamp("2000-01-01T03:04:05.678912Z") != waz,
+ Timestamp("2000-01-01T03:04:05.678912Z") != wdz,
+ Timestamp("2000-01-01T03:04:05.678912Z") != wtz,
+
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") != na,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") != naz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") != nd,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") != ndz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") != nt,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") != ntz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") != wa,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") != wd,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") != wt,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") != waz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") != wdz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") != wtz
+FROM Dates;
+
+SELECT
+ Date32("1900-01-01") != na,
+ Date32("1900-01-01") != naz,
+ Date32("1900-01-01") != nd,
+ Date32("1900-01-01") != ndz,
+ Date32("1900-01-01") != nt,
+ Date32("1900-01-01") != ntz,
+ Date32("1900-01-01") != wa,
+ Date32("1900-01-01") != wd,
+ Date32("1900-01-01") != wt,
+ Date32("1900-01-01") != waz,
+ Date32("1900-01-01") != wdz,
+ Date32("1900-01-01") != wtz,
+
+ Datetime64("1900-01-01T03:04:05Z") != na,
+ Datetime64("1900-01-01T03:04:05Z") != naz,
+ Datetime64("1900-01-01T03:04:05Z") != nd,
+ Datetime64("1900-01-01T03:04:05Z") != ndz,
+ Datetime64("1900-01-01T03:04:05Z") != nt,
+ Datetime64("1900-01-01T03:04:05Z") != ntz,
+ Datetime64("1900-01-01T03:04:05Z") != wa,
+ Datetime64("1900-01-01T03:04:05Z") != wd,
+ Datetime64("1900-01-01T03:04:05Z") != wt,
+ Datetime64("1900-01-01T03:04:05Z") != waz,
+ Datetime64("1900-01-01T03:04:05Z") != wdz,
+ Datetime64("1900-01-01T03:04:05Z") != wtz,
+
+ Timestamp64("1900-01-01T03:04:05.678912Z") != na,
+ Timestamp64("1900-01-01T03:04:05.678912Z") != naz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") != nd,
+ Timestamp64("1900-01-01T03:04:05.678912Z") != ndz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") != nt,
+ Timestamp64("1900-01-01T03:04:05.678912Z") != ntz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") != wa,
+ Timestamp64("1900-01-01T03:04:05.678912Z") != wd,
+ Timestamp64("1900-01-01T03:04:05.678912Z") != wt,
+ Timestamp64("1900-01-01T03:04:05.678912Z") != waz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") != wdz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") != wtz,
+
+ TzDate32("1900-01-01,Europe/Moscow") != na,
+ TzDate32("1900-01-01,Europe/Moscow") != naz,
+ TzDate32("1900-01-01,Europe/Moscow") != nd,
+ TzDate32("1900-01-01,Europe/Moscow") != ndz,
+ TzDate32("1900-01-01,Europe/Moscow") != nt,
+ TzDate32("1900-01-01,Europe/Moscow") != ntz,
+ TzDate32("1900-01-01,Europe/Moscow") != wa,
+ TzDate32("1900-01-01,Europe/Moscow") != wd,
+ TzDate32("1900-01-01,Europe/Moscow") != wt,
+ TzDate32("1900-01-01,Europe/Moscow") != waz,
+ TzDate32("1900-01-01,Europe/Moscow") != wdz,
+ TzDate32("1900-01-01,Europe/Moscow") != wtz,
+
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") != na,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") != naz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") != nd,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") != ndz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") != nt,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") != ntz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") != wa,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") != wd,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") != wt,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") != waz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") != wdz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") != wtz,
+
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") != na,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") != naz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") != nd,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") != ndz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") != nt,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") != ntz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") != wa,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") != wd,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") != wt,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") != waz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") != wdz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") != wtz,
+
+ Interval("P1D") != ni,
+ Interval("P1D") != wi,
+ Interval64("P1D") != ni,
+ Interval64("P1D") != wi,
+FROM Dates;
+
+SELECT
+ na != Date("2000-01-01"),
+ naz != Date("2000-01-01"),
+ nd != Date("2000-01-01"),
+ ndz != Date("2000-01-01"),
+ nt != Date("2000-01-01"),
+ ntz != Date("2000-01-01"),
+ wa != Date("2000-01-01"),
+ wd != Date("2000-01-01"),
+ wt != Date("2000-01-01"),
+ waz != Date("2000-01-01"),
+ wdz != Date("2000-01-01"),
+ wtz != Date("2000-01-01"),
+
+ na != TzDate("2000-01-01,Europe/Moscow"),
+ naz != TzDate("2000-01-01,Europe/Moscow"),
+ nd != TzDate("2000-01-01,Europe/Moscow"),
+ ndz != TzDate("2000-01-01,Europe/Moscow"),
+ nt != TzDate("2000-01-01,Europe/Moscow"),
+ ntz != TzDate("2000-01-01,Europe/Moscow"),
+ wa != TzDate("2000-01-01,Europe/Moscow"),
+ wd != TzDate("2000-01-01,Europe/Moscow"),
+ wt != TzDate("2000-01-01,Europe/Moscow"),
+ waz != TzDate("2000-01-01,Europe/Moscow"),
+ wdz != TzDate("2000-01-01,Europe/Moscow"),
+ wtz != TzDate("2000-01-01,Europe/Moscow"),
+
+ na != Datetime("2000-01-01T03:04:05Z"),
+ naz != Datetime("2000-01-01T03:04:05Z"),
+ nd != Datetime("2000-01-01T03:04:05Z"),
+ ndz != Datetime("2000-01-01T03:04:05Z"),
+ nt != Datetime("2000-01-01T03:04:05Z"),
+ ntz != Datetime("2000-01-01T03:04:05Z"),
+ wa != Datetime("2000-01-01T03:04:05Z"),
+ wd != Datetime("2000-01-01T03:04:05Z"),
+ wt != Datetime("2000-01-01T03:04:05Z"),
+ waz != Datetime("2000-01-01T03:04:05Z"),
+ wdz != Datetime("2000-01-01T03:04:05Z"),
+ wtz != Datetime("2000-01-01T03:04:05Z"),
+
+ na != TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ naz != TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ nd != TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ ndz != TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ nt != TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ ntz != TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wa != TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wd != TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wt != TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ waz != TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wdz != TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wtz != TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+
+ na != Timestamp("2000-01-01T03:04:05.678912Z"),
+ naz != Timestamp("2000-01-01T03:04:05.678912Z"),
+ nd != Timestamp("2000-01-01T03:04:05.678912Z"),
+ ndz != Timestamp("2000-01-01T03:04:05.678912Z"),
+ nt != Timestamp("2000-01-01T03:04:05.678912Z"),
+ ntz != Timestamp("2000-01-01T03:04:05.678912Z"),
+ wa != Timestamp("2000-01-01T03:04:05.678912Z"),
+ wd != Timestamp("2000-01-01T03:04:05.678912Z"),
+ wt != Timestamp("2000-01-01T03:04:05.678912Z"),
+ waz != Timestamp("2000-01-01T03:04:05.678912Z"),
+ wdz != Timestamp("2000-01-01T03:04:05.678912Z"),
+ wtz != Timestamp("2000-01-01T03:04:05.678912Z"),
+
+ na != TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ naz != TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ nd != TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ ndz != TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ nt != TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ ntz != TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wa != TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wd != TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wt != TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ waz != TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wdz != TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wtz != TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow")
+FROM Dates;
+
+SELECT
+ na != Date32("1900-01-01"),
+ naz != Date32("1900-01-01"),
+ nd != Date32("1900-01-01"),
+ ndz != Date32("1900-01-01"),
+ nt != Date32("1900-01-01"),
+ ntz != Date32("1900-01-01"),
+ wa != Date32("1900-01-01"),
+ wd != Date32("1900-01-01"),
+ wt != Date32("1900-01-01"),
+ waz != Date32("1900-01-01"),
+ wdz != Date32("1900-01-01"),
+ wtz != Date32("1900-01-01"),
+
+ na != Datetime64("1900-01-01T03:04:05Z"),
+ naz != Datetime64("1900-01-01T03:04:05Z"),
+ nd != Datetime64("1900-01-01T03:04:05Z"),
+ ndz != Datetime64("1900-01-01T03:04:05Z"),
+ nt != Datetime64("1900-01-01T03:04:05Z"),
+ ntz != Datetime64("1900-01-01T03:04:05Z"),
+ wa != Datetime64("1900-01-01T03:04:05Z"),
+ wd != Datetime64("1900-01-01T03:04:05Z"),
+ wt != Datetime64("1900-01-01T03:04:05Z"),
+ waz != Datetime64("1900-01-01T03:04:05Z"),
+ wdz != Datetime64("1900-01-01T03:04:05Z"),
+ wtz != Datetime64("1900-01-01T03:04:05Z"),
+
+ na != Timestamp64("1900-01-01T03:04:05.678912Z"),
+ naz != Timestamp64("1900-01-01T03:04:05.678912Z"),
+ nd != Timestamp64("1900-01-01T03:04:05.678912Z"),
+ ndz != Timestamp64("1900-01-01T03:04:05.678912Z"),
+ nt != Timestamp64("1900-01-01T03:04:05.678912Z"),
+ ntz != Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wa != Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wd != Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wt != Timestamp64("1900-01-01T03:04:05.678912Z"),
+ waz != Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wdz != Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wtz != Timestamp64("1900-01-01T03:04:05.678912Z"),
+
+ na != TzDate32("1900-01-01,Europe/Moscow"),
+ naz != TzDate32("1900-01-01,Europe/Moscow"),
+ nd != TzDate32("1900-01-01,Europe/Moscow"),
+ ndz != TzDate32("1900-01-01,Europe/Moscow"),
+ nt != TzDate32("1900-01-01,Europe/Moscow"),
+ ntz != TzDate32("1900-01-01,Europe/Moscow"),
+ wa != TzDate32("1900-01-01,Europe/Moscow"),
+ wd != TzDate32("1900-01-01,Europe/Moscow"),
+ wt != TzDate32("1900-01-01,Europe/Moscow"),
+ waz != TzDate32("1900-01-01,Europe/Moscow"),
+ wdz != TzDate32("1900-01-01,Europe/Moscow"),
+ wtz != TzDate32("1900-01-01,Europe/Moscow"),
+
+ na != TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ naz != TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ nd != TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ ndz != TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ nt != TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ ntz != TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wa != TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wd != TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wt != TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ waz != TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wdz != TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wtz != TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+
+ na != TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ naz != TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ nd != TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ ndz != TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ nt != TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ ntz != TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wa != TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wd != TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wt != TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ waz != TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wdz != TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wtz != TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+
+ ni != Interval("P1D"),
+ wi != Interval("P1D"),
+ ni != Interval64("P1D"),
+ wi != Interval64("P1D"),
+FROM Dates;
diff --git a/yt/yql/tests/sql/suites/blocks/date_sub.cfg b/yt/yql/tests/sql/suites/blocks/date_sub.cfg
new file mode 100644
index 0000000000..8d2d2a19fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_sub.cfg
@@ -0,0 +1 @@
+in Dates dates.txt
diff --git a/yt/yql/tests/sql/suites/blocks/date_sub.sql b/yt/yql/tests/sql/suites/blocks/date_sub.sql
new file mode 100644
index 0000000000..ec839a4199
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_sub.sql
@@ -0,0 +1,165 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin,FuseMultiOutsWithOuterMaps";
+
+SELECT
+ a.na - b.na,
+ a.na - b.naz,
+ a.na - b.nd,
+ a.na - b.ndz,
+ a.na - b.nt,
+ a.na - b.ntz,
+ a.na - b.wa,
+ a.na - b.wd,
+ a.na - b.wt,
+ a.na - b.waz,
+ a.na - b.wdz,
+ a.na - b.wtz,
+
+ a.naz - b.na,
+ a.naz - b.naz,
+ a.naz - b.nd,
+ a.naz - b.ndz,
+ a.naz - b.nt,
+ a.naz - b.ntz,
+ a.naz - b.wa,
+ a.naz - b.wd,
+ a.naz - b.wt,
+ a.naz - b.waz,
+ a.naz - b.wdz,
+ a.naz - b.wtz,
+
+ a.nd - b.na,
+ a.nd - b.naz,
+ a.nd - b.nd,
+ a.nd - b.ndz,
+ a.nd - b.nt,
+ a.nd - b.ntz,
+ a.nd - b.wa,
+ a.nd - b.wd,
+ a.nd - b.wt,
+ a.nd - b.waz,
+ a.nd - b.wdz,
+ a.nd - b.wtz,
+
+ a.ndz - b.na,
+ a.ndz - b.naz,
+ a.ndz - b.nd,
+ a.ndz - b.ndz,
+ a.ndz - b.nt,
+ a.ndz - b.ntz,
+ a.ndz - b.wa,
+ a.ndz - b.wd,
+ a.ndz - b.wt,
+ a.ndz - b.waz,
+ a.ndz - b.wdz,
+ a.ndz - b.wtz,
+
+ a.nt - b.na,
+ a.nt - b.naz,
+ a.nt - b.nd,
+ a.nt - b.ndz,
+ a.nt - b.nt,
+ a.nt - b.ntz,
+ a.nt - b.wa,
+ a.nt - b.wd,
+ a.nt - b.wt,
+ a.nt - b.waz,
+ a.nt - b.wdz,
+ a.nt - b.wtz,
+
+ a.ntz - b.na,
+ a.ntz - b.naz,
+ a.ntz - b.nd,
+ a.ntz - b.ndz,
+ a.ntz - b.nt,
+ a.ntz - b.ntz,
+ a.ntz - b.wa,
+ a.ntz - b.wd,
+ a.ntz - b.wt,
+ a.ntz - b.waz,
+ a.ntz - b.wdz,
+ a.ntz - b.wtz
+
+FROM Dates as a CROSS JOIN Dates as b;
+
+SELECT
+ a.wa - b.na,
+ a.wa - b.naz,
+ a.wa - b.nd,
+ a.wa - b.ndz,
+ a.wa - b.nt,
+ a.wa - b.ntz,
+ a.wa - b.wa,
+ a.wa - b.wd,
+ a.wa - b.wt,
+ a.wa - b.waz,
+ a.wa - b.wdz,
+ a.wa - b.wtz,
+
+ a.wd - b.na,
+ a.wd - b.naz,
+ a.wd - b.nd,
+ a.wd - b.ndz,
+ a.wd - b.nt,
+ a.wd - b.ntz,
+ a.wd - b.wa,
+ a.wd - b.wd,
+ a.wd - b.wt,
+ a.wd - b.waz,
+ a.wd - b.wdz,
+ a.wd - b.wtz,
+
+ a.wt - b.na,
+ a.wt - b.naz,
+ a.wt - b.nd,
+ a.wt - b.ndz,
+ a.wt - b.nt,
+ a.wt - b.ntz,
+ a.wt - b.wa,
+ a.wt - b.wd,
+ a.wt - b.wt,
+ a.wt - b.waz,
+ a.wt - b.wdz,
+ a.wt - b.wtz,
+
+ a.waz - b.na,
+ a.waz - b.naz,
+ a.waz - b.nd,
+ a.waz - b.ndz,
+ a.waz - b.nt,
+ a.waz - b.ntz,
+ a.waz - b.wa,
+ a.waz - b.wd,
+ a.waz - b.wt,
+ a.waz - b.waz,
+ a.waz - b.wdz,
+ a.waz - b.wtz,
+
+ a.wdz - b.na,
+ a.wdz - b.naz,
+ a.wdz - b.nd,
+ a.wdz - b.ndz,
+ a.wdz - b.nt,
+ a.wdz - b.ntz,
+ a.wdz - b.wa,
+ a.wdz - b.wd,
+ a.wdz - b.wt,
+ a.wdz - b.waz,
+ a.wdz - b.wdz,
+ a.wdz - b.wtz,
+
+ a.wtz - b.na,
+ a.wtz - b.naz,
+ a.wtz - b.nd,
+ a.wtz - b.ndz,
+ a.wtz - b.nt,
+ a.wtz - b.ntz,
+ a.wtz - b.wa,
+ a.wtz - b.wd,
+ a.wtz - b.wt,
+ a.wtz - b.waz,
+ a.wtz - b.wdz,
+ a.wtz - b.wtz,
+
+FROM Dates as a CROSS JOIN Dates as b;
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_sub_interval.cfg b/yt/yql/tests/sql/suites/blocks/date_sub_interval.cfg
new file mode 100644
index 0000000000..8d2d2a19fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_sub_interval.cfg
@@ -0,0 +1 @@
+in Dates dates.txt
diff --git a/yt/yql/tests/sql/suites/blocks/date_sub_interval.sql b/yt/yql/tests/sql/suites/blocks/date_sub_interval.sql
new file mode 100644
index 0000000000..9e9c6ce95b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_sub_interval.sql
@@ -0,0 +1,31 @@
+USE plato;
+
+SELECT
+ a.na - b.ni,
+ a.na - b.wi,
+ a.naz - b.ni,
+ a.naz - b.wi,
+ a.nd - b.ni,
+ a.nd - b.wi,
+ a.ndz - b.ni,
+ a.ndz - b.wi,
+ a.nt - b.ni,
+ a.nt - b.wi,
+ a.ntz - b.ni,
+ a.ntz - b.wi,
+
+ a.wa - b.ni,
+ a.wa - b.wi,
+ a.waz - b.ni,
+ a.waz - b.wi,
+ a.wd - b.ni,
+ a.wd - b.wi,
+ a.wdz - b.ni,
+ a.wdz - b.wi,
+ a.wt - b.ni,
+ a.wt - b.wi,
+ a.wtz - b.ni,
+ a.wtz - b.wi
+
+FROM Dates as a CROSS JOIN Dates as b
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_sub_interval_scalar.cfg b/yt/yql/tests/sql/suites/blocks/date_sub_interval_scalar.cfg
new file mode 100644
index 0000000000..8d2d2a19fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_sub_interval_scalar.cfg
@@ -0,0 +1 @@
+in Dates dates.txt
diff --git a/yt/yql/tests/sql/suites/blocks/date_sub_interval_scalar.sql b/yt/yql/tests/sql/suites/blocks/date_sub_interval_scalar.sql
new file mode 100644
index 0000000000..8b5aee81fa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_sub_interval_scalar.sql
@@ -0,0 +1,58 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin,FuseMultiOutsWithOuterMaps";
+
+SELECT
+ Date("2000-01-01") - ni,
+ Date("2000-01-01") - wi,
+ TzDate("2000-01-01,Europe/Moscow") - ni,
+ TzDate("2000-01-01,Europe/Moscow") - wi,
+ Datetime("2000-01-01T03:04:05Z") - ni,
+ Datetime("2000-01-01T03:04:05Z") - wi,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - ni,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - wi,
+ Timestamp("2000-01-01T03:04:05.678912Z") - ni,
+ Timestamp("2000-01-01T03:04:05.678912Z") - wi,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - ni,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - wi,
+ Date32("1900-01-01") - ni,
+ Date32("1900-01-01") - wi,
+ Datetime64("1900-01-01T03:04:05Z") - ni,
+ Datetime64("1900-01-01T03:04:05Z") - wi,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - ni,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - wi,
+ TzDate32("1900-01-01,Europe/Moscow") - ni,
+ TzDate32("1900-01-01,Europe/Moscow") - wi,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") - ni,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") - wi,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") - ni,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") - wi
+FROM Dates;
+
+SELECT
+ na - Interval("P1D"),
+ na - Interval64("P1D"),
+ naz - Interval("P1D"),
+ naz - Interval64("P1D"),
+ nd - Interval("P1D"),
+ nd - Interval64("P1D"),
+ ndz - Interval("P1D"),
+ ndz - Interval64("P1D"),
+ nt - Interval("P1D"),
+ nt - Interval64("P1D"),
+ ntz - Interval("P1D"),
+ ntz - Interval64("P1D"),
+ wa - Interval("P1D"),
+ wa - Interval64("P1D"),
+ wd - Interval("P1D"),
+ wd - Interval64("P1D"),
+ wt - Interval("P1D"),
+ wt - Interval64("P1D"),
+ waz - Interval("P1D"),
+ waz - Interval64("P1D"),
+ wdz - Interval("P1D"),
+ wdz - Interval64("P1D"),
+ wtz - Interval("P1D"),
+ wtz - Interval64("P1D")
+FROM Dates;
+
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_sub_scalar.cfg b/yt/yql/tests/sql/suites/blocks/date_sub_scalar.cfg
new file mode 100644
index 0000000000..8d2d2a19fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_sub_scalar.cfg
@@ -0,0 +1 @@
+in Dates dates.txt
diff --git a/yt/yql/tests/sql/suites/blocks/date_sub_scalar.sql b/yt/yql/tests/sql/suites/blocks/date_sub_scalar.sql
new file mode 100644
index 0000000000..efe5c86006
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_sub_scalar.sql
@@ -0,0 +1,326 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin,FuseMultiOutsWithOuterMaps";
+
+SELECT
+ Date("2000-01-01") - na,
+ Date("2000-01-01") - naz,
+ Date("2000-01-01") - nd,
+ Date("2000-01-01") - ndz,
+ Date("2000-01-01") - nt,
+ Date("2000-01-01") - ntz,
+ Date("2000-01-01") - wa,
+ Date("2000-01-01") - wd,
+ Date("2000-01-01") - wt,
+ Date("2000-01-01") - waz,
+ Date("2000-01-01") - wdz,
+ Date("2000-01-01") - wtz,
+
+ TzDate("2000-01-01,Europe/Moscow") - na,
+ TzDate("2000-01-01,Europe/Moscow") - naz,
+ TzDate("2000-01-01,Europe/Moscow") - nd,
+ TzDate("2000-01-01,Europe/Moscow") - ndz,
+ TzDate("2000-01-01,Europe/Moscow") - nt,
+ TzDate("2000-01-01,Europe/Moscow") - ntz,
+ TzDate("2000-01-01,Europe/Moscow") - wa,
+ TzDate("2000-01-01,Europe/Moscow") - wd,
+ TzDate("2000-01-01,Europe/Moscow") - wt,
+ TzDate("2000-01-01,Europe/Moscow") - waz,
+ TzDate("2000-01-01,Europe/Moscow") - wdz,
+ TzDate("2000-01-01,Europe/Moscow") - wtz,
+
+ Datetime("2000-01-01T03:04:05Z") - na,
+ Datetime("2000-01-01T03:04:05Z") - naz,
+ Datetime("2000-01-01T03:04:05Z") - nd,
+ Datetime("2000-01-01T03:04:05Z") - ndz,
+ Datetime("2000-01-01T03:04:05Z") - nt,
+ Datetime("2000-01-01T03:04:05Z") - ntz,
+ Datetime("2000-01-01T03:04:05Z") - wa,
+ Datetime("2000-01-01T03:04:05Z") - wd,
+ Datetime("2000-01-01T03:04:05Z") - wt,
+ Datetime("2000-01-01T03:04:05Z") - waz,
+ Datetime("2000-01-01T03:04:05Z") - wdz,
+ Datetime("2000-01-01T03:04:05Z") - wtz,
+
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - na,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - naz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - nd,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - ndz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - nt,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - ntz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - wa,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - wd,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - wt,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - waz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - wdz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - wtz,
+
+ Timestamp("2000-01-01T03:04:05.678912Z") - na,
+ Timestamp("2000-01-01T03:04:05.678912Z") - naz,
+ Timestamp("2000-01-01T03:04:05.678912Z") - nd,
+ Timestamp("2000-01-01T03:04:05.678912Z") - ndz,
+ Timestamp("2000-01-01T03:04:05.678912Z") - nt,
+ Timestamp("2000-01-01T03:04:05.678912Z") - ntz,
+ Timestamp("2000-01-01T03:04:05.678912Z") - wa,
+ Timestamp("2000-01-01T03:04:05.678912Z") - wd,
+ Timestamp("2000-01-01T03:04:05.678912Z") - wt,
+ Timestamp("2000-01-01T03:04:05.678912Z") - waz,
+ Timestamp("2000-01-01T03:04:05.678912Z") - wdz,
+ Timestamp("2000-01-01T03:04:05.678912Z") - wtz,
+
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - na,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - naz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - nd,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - ndz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - nt,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - ntz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - wa,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - wd,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - wt,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - waz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - wdz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - wtz,
+
+FROM Dates;
+
+SELECT
+ Date32("1900-01-01") - na,
+ Date32("1900-01-01") - naz,
+ Date32("1900-01-01") - nd,
+ Date32("1900-01-01") - ndz,
+ Date32("1900-01-01") - nt,
+ Date32("1900-01-01") - ntz,
+ Date32("1900-01-01") - wa,
+ Date32("1900-01-01") - wd,
+ Date32("1900-01-01") - wt,
+ Date32("1900-01-01") - waz,
+ Date32("1900-01-01") - wdz,
+ Date32("1900-01-01") - wtz,
+
+ Datetime64("1900-01-01T03:04:05Z") - na,
+ Datetime64("1900-01-01T03:04:05Z") - naz,
+ Datetime64("1900-01-01T03:04:05Z") - nd,
+ Datetime64("1900-01-01T03:04:05Z") - ndz,
+ Datetime64("1900-01-01T03:04:05Z") - nt,
+ Datetime64("1900-01-01T03:04:05Z") - ntz,
+ Datetime64("1900-01-01T03:04:05Z") - wa,
+ Datetime64("1900-01-01T03:04:05Z") - wd,
+ Datetime64("1900-01-01T03:04:05Z") - wt,
+ Datetime64("1900-01-01T03:04:05Z") - waz,
+ Datetime64("1900-01-01T03:04:05Z") - wdz,
+ Datetime64("1900-01-01T03:04:05Z") - wtz,
+
+ Timestamp64("1900-01-01T03:04:05.678912Z") - na,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - naz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - nd,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - ndz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - nt,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - ntz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - wa,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - wd,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - wt,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - waz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - wdz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - wtz,
+
+ TzDate32("1900-01-01,Europe/Moscow") - na,
+ TzDate32("1900-01-01,Europe/Moscow") - naz,
+ TzDate32("1900-01-01,Europe/Moscow") - nd,
+ TzDate32("1900-01-01,Europe/Moscow") - ndz,
+ TzDate32("1900-01-01,Europe/Moscow") - nt,
+ TzDate32("1900-01-01,Europe/Moscow") - ntz,
+ TzDate32("1900-01-01,Europe/Moscow") - wa,
+ TzDate32("1900-01-01,Europe/Moscow") - wd,
+ TzDate32("1900-01-01,Europe/Moscow") - wt,
+ TzDate32("1900-01-01,Europe/Moscow") - waz,
+ TzDate32("1900-01-01,Europe/Moscow") - wdz,
+ TzDate32("1900-01-01,Europe/Moscow") - wtz,
+
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") - na,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") - naz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") - nd,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") - ndz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") - nt,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") - ntz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") - wa,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") - wd,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") - wt,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") - waz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") - wdz,
+ TzDatetime64("1900-01-01T03:04:05,Europe/Moscow") - wtz,
+
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") - na,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") - naz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") - nd,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") - ndz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") - nt,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") - ntz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") - wa,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") - wd,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") - wt,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") - waz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") - wdz,
+ TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow") - wtz
+
+FROM Dates;
+
+SELECT
+ na - Date("2000-01-01"),
+ naz - Date("2000-01-01"),
+ nd - Date("2000-01-01"),
+ ndz - Date("2000-01-01"),
+ nt - Date("2000-01-01"),
+ ntz - Date("2000-01-01"),
+ wa - Date("2000-01-01"),
+ wd - Date("2000-01-01"),
+ wt - Date("2000-01-01"),
+ waz - Date("2000-01-01"),
+ wdz - Date("2000-01-01"),
+ wtz - Date("2000-01-01"),
+
+ na - TzDate("2000-01-01,Europe/Moscow"),
+ naz - TzDate("2000-01-01,Europe/Moscow"),
+ nd - TzDate("2000-01-01,Europe/Moscow"),
+ ndz - TzDate("2000-01-01,Europe/Moscow"),
+ nt - TzDate("2000-01-01,Europe/Moscow"),
+ ntz - TzDate("2000-01-01,Europe/Moscow"),
+ wa - TzDate("2000-01-01,Europe/Moscow"),
+ wd - TzDate("2000-01-01,Europe/Moscow"),
+ wt - TzDate("2000-01-01,Europe/Moscow"),
+ waz - TzDate("2000-01-01,Europe/Moscow"),
+ wdz - TzDate("2000-01-01,Europe/Moscow"),
+ wtz - TzDate("2000-01-01,Europe/Moscow"),
+
+ na - Datetime("2000-01-01T03:04:05Z"),
+ naz - Datetime("2000-01-01T03:04:05Z"),
+ nd - Datetime("2000-01-01T03:04:05Z"),
+ ndz - Datetime("2000-01-01T03:04:05Z"),
+ nt - Datetime("2000-01-01T03:04:05Z"),
+ ntz - Datetime("2000-01-01T03:04:05Z"),
+ wa - Datetime("2000-01-01T03:04:05Z"),
+ wd - Datetime("2000-01-01T03:04:05Z"),
+ wt - Datetime("2000-01-01T03:04:05Z"),
+ waz - Datetime("2000-01-01T03:04:05Z"),
+ wdz - Datetime("2000-01-01T03:04:05Z"),
+ wtz - Datetime("2000-01-01T03:04:05Z"),
+
+ na - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ naz - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ nd - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ ndz - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ nt - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ ntz - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wa - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wd - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wt - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ waz - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wdz - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wtz - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+
+ na - Timestamp("2000-01-01T03:04:05.678912Z"),
+ naz - Timestamp("2000-01-01T03:04:05.678912Z"),
+ nd - Timestamp("2000-01-01T03:04:05.678912Z"),
+ ndz - Timestamp("2000-01-01T03:04:05.678912Z"),
+ nt - Timestamp("2000-01-01T03:04:05.678912Z"),
+ ntz - Timestamp("2000-01-01T03:04:05.678912Z"),
+ wa - Timestamp("2000-01-01T03:04:05.678912Z"),
+ wd - Timestamp("2000-01-01T03:04:05.678912Z"),
+ wt - Timestamp("2000-01-01T03:04:05.678912Z"),
+ waz - Timestamp("2000-01-01T03:04:05.678912Z"),
+ wdz - Timestamp("2000-01-01T03:04:05.678912Z"),
+ wtz - Timestamp("2000-01-01T03:04:05.678912Z"),
+
+ na - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ naz - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ nd - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ ndz - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ nt - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ ntz - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wa - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wd - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wt - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ waz - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wdz - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wtz - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+FROM Dates;
+
+SELECT
+ na - Date32("1900-01-01"),
+ naz - Date32("1900-01-01"),
+ nd - Date32("1900-01-01"),
+ ndz - Date32("1900-01-01"),
+ nt - Date32("1900-01-01"),
+ ntz - Date32("1900-01-01"),
+ wa - Date32("1900-01-01"),
+ wd - Date32("1900-01-01"),
+ wt - Date32("1900-01-01"),
+ waz - Date32("1900-01-01"),
+ wdz - Date32("1900-01-01"),
+ wtz - Date32("1900-01-01"),
+
+ na - Datetime64("1900-01-01T03:04:05Z"),
+ naz - Datetime64("1900-01-01T03:04:05Z"),
+ nd - Datetime64("1900-01-01T03:04:05Z"),
+ ndz - Datetime64("1900-01-01T03:04:05Z"),
+ nt - Datetime64("1900-01-01T03:04:05Z"),
+ ntz - Datetime64("1900-01-01T03:04:05Z"),
+ wa - Datetime64("1900-01-01T03:04:05Z"),
+ wd - Datetime64("1900-01-01T03:04:05Z"),
+ wt - Datetime64("1900-01-01T03:04:05Z"),
+ waz - Datetime64("1900-01-01T03:04:05Z"),
+ wdz - Datetime64("1900-01-01T03:04:05Z"),
+ wtz - Datetime64("1900-01-01T03:04:05Z"),
+
+ na - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ naz - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ nd - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ ndz - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ nt - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ ntz - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wa - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wd - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wt - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ waz - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wdz - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wtz - Timestamp64("1900-01-01T03:04:05.678912Z"),
+
+ na - TzDate32("1900-01-01,Europe/Moscow"),
+ naz - TzDate32("1900-01-01,Europe/Moscow"),
+ nd - TzDate32("1900-01-01,Europe/Moscow"),
+ ndz - TzDate32("1900-01-01,Europe/Moscow"),
+ nt - TzDate32("1900-01-01,Europe/Moscow"),
+ ntz - TzDate32("1900-01-01,Europe/Moscow"),
+ wa - TzDate32("1900-01-01,Europe/Moscow"),
+ wd - TzDate32("1900-01-01,Europe/Moscow"),
+ wt - TzDate32("1900-01-01,Europe/Moscow"),
+ waz - TzDate32("1900-01-01,Europe/Moscow"),
+ wdz - TzDate32("1900-01-01,Europe/Moscow"),
+ wtz - TzDate32("1900-01-01,Europe/Moscow"),
+
+ na - TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ naz - TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ nd - TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ ndz - TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ nt - TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ ntz - TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wa - TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wd - TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wt - TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ waz - TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wdz - TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wtz - TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+
+ na - TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ naz - TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ nd - TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ ndz - TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ nt - TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ ntz - TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wa - TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wd - TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wt - TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ waz - TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wdz - TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wtz - TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow")
+
+FROM Dates;
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_top_sort.cfg b/yt/yql/tests/sql/suites/blocks/date_top_sort.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_top_sort.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/date_top_sort.sql b/yt/yql/tests/sql/suites/blocks/date_top_sort.sql
new file mode 100644
index 0000000000..a2cc856c56
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/date_top_sort.sql
@@ -0,0 +1,9 @@
+USE plato;
+pragma yt.UseNativeDescSort;
+
+SELECT
+ t.*, i8+1
+FROM (SELECT * FROM concat(Dates,Dates)) as t
+ORDER BY na,wa,naz,waz,nd,ndz,wd,wdz,nt,ntz,wt,wtz,ni,wi
+LIMIT 1;
+
diff --git a/yt/yql/tests/sql/suites/blocks/dates.txt.attr b/yt/yql/tests/sql/suites/blocks/dates.txt.attr
new file mode 100644
index 0000000000..d2ce0ed49f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/dates.txt.attr
@@ -0,0 +1,27 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["na";["DataType";"Date"]];
+ ["nd";["DataType";"Datetime"]];
+ ["nt";["DataType";"Timestamp"]];
+ ["naz";["DataType";"TzDate"]];
+ ["ndz";["DataType";"TzDatetime"]];
+ ["ntz";["DataType";"TzTimestamp"]];
+ ["wa";["DataType";"Date32"]];
+ ["wd";["DataType";"Datetime64"]];
+ ["wt";["DataType";"Timestamp64"]];
+ ["ni";["DataType";"Interval"]];
+ ["wi";["DataType";"Interval64"]];
+ ["i8";["DataType";"Int8"]];
+ ["u8";["DataType";"Uint8"]];
+ ["i16";["DataType";"Int16"]];
+ ["u16";["DataType";"Uint16"]];
+ ["i32";["DataType";"Int32"]];
+ ["u32";["DataType";"Uint32"]];
+ ["i64";["DataType";"Int64"]];
+ ["u64";["DataType";"Uint64"]];
+ ["waz";["DataType";"TzDate32"]];
+ ["wdz";["DataType";"TzDatetime64"]];
+ ["wtz";["DataType";"TzTimestamp64"]];
+ ]];
+}}
+
diff --git a/yt/yql/tests/sql/suites/blocks/decimal_avg.cfg b/yt/yql/tests/sql/suites/blocks/decimal_avg.cfg
new file mode 100644
index 0000000000..a21c6560ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/decimal_avg.cfg
@@ -0,0 +1 @@
+in Input input_decimal.txt
diff --git a/yt/yql/tests/sql/suites/blocks/decimal_avg.sql b/yt/yql/tests/sql/suites/blocks/decimal_avg.sql
new file mode 100644
index 0000000000..3e1dd49983
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/decimal_avg.sql
@@ -0,0 +1,8 @@
+USE plato;
+
+SELECT
+ avg(cs_ext_list_price), avg(cs_ext_tax),
+ avg(cs_ext_list_price) * decimal("1.1", 7, 2),
+ decimal("1.1", 7, 2) * avg(cs_ext_tax),
+FROM Input;
+
diff --git a/yt/yql/tests/sql/suites/blocks/decimal_comparison.cfg b/yt/yql/tests/sql/suites/blocks/decimal_comparison.cfg
new file mode 100644
index 0000000000..a21c6560ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/decimal_comparison.cfg
@@ -0,0 +1 @@
+in Input input_decimal.txt
diff --git a/yt/yql/tests/sql/suites/blocks/decimal_comparison.sql b/yt/yql/tests/sql/suites/blocks/decimal_comparison.sql
new file mode 100644
index 0000000000..c41cc5540e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/decimal_comparison.sql
@@ -0,0 +1,25 @@
+USE plato;
+
+SELECT
+ cs_ext_list_price == cs_ext_tax,
+ cs_ext_list_price != cs_ext_tax,
+ cs_ext_list_price < cs_ext_tax,
+ cs_ext_list_price <= cs_ext_tax,
+ cs_ext_list_price > cs_ext_tax,
+ cs_ext_list_price >= cs_ext_tax,
+
+ cs_ext_tax == decimal("26.91", 7, 2),
+ cs_ext_tax != decimal("26.91", 7, 2),
+ cs_ext_tax < decimal("26.91", 7, 2),
+ cs_ext_tax <= decimal("26.91", 7, 2),
+ cs_ext_tax > decimal("26.91", 7, 2),
+ cs_ext_tax >= decimal("26.91", 7, 2),
+
+ decimal("26.91", 7, 2) == cs_ext_tax,
+ decimal("26.91", 7, 2) != cs_ext_tax,
+ decimal("26.91", 7, 2) < cs_ext_tax,
+ decimal("26.91", 7, 2) <= cs_ext_tax,
+ decimal("26.91", 7, 2) > cs_ext_tax,
+ decimal("26.91", 7, 2) >= cs_ext_tax,
+FROM Input;
+
diff --git a/yt/yql/tests/sql/suites/blocks/decimal_multiplicative_ops.cfg b/yt/yql/tests/sql/suites/blocks/decimal_multiplicative_ops.cfg
new file mode 100644
index 0000000000..a21c6560ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/decimal_multiplicative_ops.cfg
@@ -0,0 +1 @@
+in Input input_decimal.txt
diff --git a/yt/yql/tests/sql/suites/blocks/decimal_multiplicative_ops.sql b/yt/yql/tests/sql/suites/blocks/decimal_multiplicative_ops.sql
new file mode 100644
index 0000000000..4d3166b6a5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/decimal_multiplicative_ops.sql
@@ -0,0 +1,18 @@
+USE plato;
+
+SELECT
+ cs_ext_list_price, cs_ext_tax,
+ cs_ext_list_price * cs_ext_tax, cs_ext_list_price * Just(decimal("13.37", 7, 2)), Just(decimal("42.0", 7, 2)) * cs_ext_tax,
+ cs_ext_list_price * decimal("13.37", 7, 2), decimal("42.0", 7, 2) * cs_ext_tax,
+
+ cs_ext_list_price / cs_ext_tax, cs_ext_list_price / Just(decimal("13.37", 7, 2)), Just(decimal("42.0", 7, 2)) / cs_ext_tax,
+ cs_ext_list_price / decimal("13.37", 7, 2), decimal("42.0", 7, 2) / cs_ext_tax,
+
+ cs_ext_list_price % cs_ext_tax, cs_ext_list_price % Just(decimal("13.37", 7, 2)), Just(decimal("42.0", 7, 2)) % cs_ext_tax,
+ cs_ext_list_price % decimal("13.37", 7, 2), decimal("42.0", 7, 2) % cs_ext_tax,
+
+ cs_ext_list_price * Just(13), cs_ext_list_price * 13,
+ cs_ext_list_price / Just(13), cs_ext_list_price / 13,
+ cs_ext_list_price % Just(13), cs_ext_list_price % 13,
+FROM Input;
+
diff --git a/yt/yql/tests/sql/suites/blocks/decimal_op_decimal.cfg b/yt/yql/tests/sql/suites/blocks/decimal_op_decimal.cfg
new file mode 100644
index 0000000000..a21c6560ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/decimal_op_decimal.cfg
@@ -0,0 +1 @@
+in Input input_decimal.txt
diff --git a/yt/yql/tests/sql/suites/blocks/decimal_op_decimal.sql b/yt/yql/tests/sql/suites/blocks/decimal_op_decimal.sql
new file mode 100644
index 0000000000..996ea73835
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/decimal_op_decimal.sql
@@ -0,0 +1,7 @@
+USE plato;
+
+SELECT
+ cs_ext_list_price + cs_ext_tax,
+ cs_ext_list_price - cs_ext_tax,
+FROM Input;
+
diff --git a/yt/yql/tests/sql/suites/blocks/decimal_op_decimal_scalar.cfg b/yt/yql/tests/sql/suites/blocks/decimal_op_decimal_scalar.cfg
new file mode 100644
index 0000000000..a21c6560ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/decimal_op_decimal_scalar.cfg
@@ -0,0 +1 @@
+in Input input_decimal.txt
diff --git a/yt/yql/tests/sql/suites/blocks/decimal_op_decimal_scalar.sql b/yt/yql/tests/sql/suites/blocks/decimal_op_decimal_scalar.sql
new file mode 100644
index 0000000000..81ce0f5dbf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/decimal_op_decimal_scalar.sql
@@ -0,0 +1,16 @@
+USE plato;
+
+SELECT
+ cs_ext_list_price + cast("10.2" as decimal(7,2)),
+ cs_ext_list_price + cast("99999.99" as decimal(7,2)),
+ cs_ext_list_price - cast("11.22" as decimal(7,2)),
+ cs_ext_list_price - cast("99999.99" as decimal(7,2)),
+FROM Input;
+
+SELECT
+ cast("10.2" as decimal(7,2)) + cs_ext_list_price,
+ cast("99999.99" as decimal(7,2)) + cs_ext_list_price,
+ cast("11.22" as decimal(7,2)) - cs_ext_list_price,
+ cast("99999.99" as decimal(7,2)) - cs_ext_list_price,
+FROM Input;
+
diff --git a/yt/yql/tests/sql/suites/blocks/decimal_unary.cfg b/yt/yql/tests/sql/suites/blocks/decimal_unary.cfg
new file mode 100644
index 0000000000..a21c6560ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/decimal_unary.cfg
@@ -0,0 +1 @@
+in Input input_decimal.txt
diff --git a/yt/yql/tests/sql/suites/blocks/decimal_unary.sql b/yt/yql/tests/sql/suites/blocks/decimal_unary.sql
new file mode 100644
index 0000000000..77d1170ef6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/decimal_unary.sql
@@ -0,0 +1,7 @@
+USE plato;
+
+SELECT
+ -cs_ext_list_price,
+ abs(cs_ext_tax),
+FROM Input;
+
diff --git a/yt/yql/tests/sql/suites/blocks/default.cfg b/yt/yql/tests/sql/suites/blocks/default.cfg
new file mode 100644
index 0000000000..41a0f8a733
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/default.cfg
@@ -0,0 +1,4 @@
+canonize_peephole
+peephole_use_blocks
+
+
diff --git a/yt/yql/tests/sql/suites/blocks/distinct_mixed_all.cfg b/yt/yql/tests/sql/suites/blocks/distinct_mixed_all.cfg
new file mode 100644
index 0000000000..57e52ccabb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/distinct_mixed_all.cfg
@@ -0,0 +1 @@
+in Input input_hashed_uint32.txt
diff --git a/yt/yql/tests/sql/suites/blocks/distinct_mixed_all.sql b/yt/yql/tests/sql/suites/blocks/distinct_mixed_all.sql
new file mode 100644
index 0000000000..dae808a395
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/distinct_mixed_all.sql
@@ -0,0 +1,8 @@
+pragma yt.UsePartitionsByKeysForFinalAgg="false";
+
+USE plato;
+
+SELECT
+ count(*),
+ sum(distinct key),min(distinct key)
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/distinct_mixed_keys.cfg b/yt/yql/tests/sql/suites/blocks/distinct_mixed_keys.cfg
new file mode 100644
index 0000000000..57e52ccabb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/distinct_mixed_keys.cfg
@@ -0,0 +1 @@
+in Input input_hashed_uint32.txt
diff --git a/yt/yql/tests/sql/suites/blocks/distinct_mixed_keys.sql b/yt/yql/tests/sql/suites/blocks/distinct_mixed_keys.sql
new file mode 100644
index 0000000000..8c3aac0c0b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/distinct_mixed_keys.sql
@@ -0,0 +1,10 @@
+pragma yt.UsePartitionsByKeysForFinalAgg="false";
+
+USE plato;
+
+SELECT
+ key, count(*), count(distinct subkey), sum(distinct subkey),
+ count(distinct Unwrap(subkey/2u)), sum(distinct Unwrap(subkey/2u))
+FROM Input
+GROUP BY key
+ORDER BY key
diff --git a/yt/yql/tests/sql/suites/blocks/distinct_opt_state_all.cfg b/yt/yql/tests/sql/suites/blocks/distinct_opt_state_all.cfg
new file mode 100644
index 0000000000..6ba971b075
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/distinct_opt_state_all.cfg
@@ -0,0 +1 @@
+in Input input_hashed_uint32_opt.txt
diff --git a/yt/yql/tests/sql/suites/blocks/distinct_opt_state_all.sql b/yt/yql/tests/sql/suites/blocks/distinct_opt_state_all.sql
new file mode 100644
index 0000000000..1f45427b87
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/distinct_opt_state_all.sql
@@ -0,0 +1,7 @@
+pragma yt.UsePartitionsByKeysForFinalAgg="false";
+
+USE plato;
+
+SELECT
+ count(*),max(subkey),sum(distinct subkey),avg(subkey),count(distinct subkey/2u),avg(distinct subkey/2u)
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/distinct_opt_state_keys.cfg b/yt/yql/tests/sql/suites/blocks/distinct_opt_state_keys.cfg
new file mode 100644
index 0000000000..6ba971b075
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/distinct_opt_state_keys.cfg
@@ -0,0 +1 @@
+in Input input_hashed_uint32_opt.txt
diff --git a/yt/yql/tests/sql/suites/blocks/distinct_opt_state_keys.sql b/yt/yql/tests/sql/suites/blocks/distinct_opt_state_keys.sql
new file mode 100644
index 0000000000..9b5d778b98
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/distinct_opt_state_keys.sql
@@ -0,0 +1,10 @@
+pragma yt.UsePartitionsByKeysForFinalAgg="false";
+
+USE plato;
+
+SELECT
+ key,count(*),max(subkey),sum(distinct subkey),avg(subkey),count(distinct subkey/2u),avg(distinct subkey/2u)
+FROM Input
+GROUP BY key
+ORDER BY key
+
diff --git a/yt/yql/tests/sql/suites/blocks/distinct_pure_all.cfg b/yt/yql/tests/sql/suites/blocks/distinct_pure_all.cfg
new file mode 100644
index 0000000000..57e52ccabb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/distinct_pure_all.cfg
@@ -0,0 +1 @@
+in Input input_hashed_uint32.txt
diff --git a/yt/yql/tests/sql/suites/blocks/distinct_pure_all.sql b/yt/yql/tests/sql/suites/blocks/distinct_pure_all.sql
new file mode 100644
index 0000000000..aa2865f46d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/distinct_pure_all.sql
@@ -0,0 +1,7 @@
+pragma yt.UsePartitionsByKeysForFinalAgg="false";
+
+USE plato;
+
+SELECT
+ sum(distinct key),min(distinct key)
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/distinct_pure_keys.cfg b/yt/yql/tests/sql/suites/blocks/distinct_pure_keys.cfg
new file mode 100644
index 0000000000..57e52ccabb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/distinct_pure_keys.cfg
@@ -0,0 +1 @@
+in Input input_hashed_uint32.txt
diff --git a/yt/yql/tests/sql/suites/blocks/distinct_pure_keys.sql b/yt/yql/tests/sql/suites/blocks/distinct_pure_keys.sql
new file mode 100644
index 0000000000..2acc401488
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/distinct_pure_keys.sql
@@ -0,0 +1,10 @@
+pragma yt.UsePartitionsByKeysForFinalAgg="false";
+
+USE plato;
+
+SELECT
+ key, count(distinct subkey), sum(distinct subkey),
+ count(distinct Unwrap(subkey/2u)), sum(distinct Unwrap(subkey/2u))
+FROM Input
+GROUP BY key
+ORDER BY key
diff --git a/yt/yql/tests/sql/suites/blocks/div_uint64.cfg b/yt/yql/tests/sql/suites/blocks/div_uint64.cfg
new file mode 100644
index 0000000000..5ee9471fc0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/div_uint64.cfg
@@ -0,0 +1 @@
+in Input input_uint64.txt
diff --git a/yt/yql/tests/sql/suites/blocks/div_uint64.sql b/yt/yql/tests/sql/suites/blocks/div_uint64.sql
new file mode 100644
index 0000000000..3eff1d864b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/div_uint64.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key/subkey,1000ul/key,subkey/0ul
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/div_uint64_opt2.cfg b/yt/yql/tests/sql/suites/blocks/div_uint64_opt2.cfg
new file mode 100644
index 0000000000..46fee85c7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/div_uint64_opt2.cfg
@@ -0,0 +1 @@
+in Input input_uint64_opt2.txt
diff --git a/yt/yql/tests/sql/suites/blocks/div_uint64_opt2.sql b/yt/yql/tests/sql/suites/blocks/div_uint64_opt2.sql
new file mode 100644
index 0000000000..3eff1d864b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/div_uint64_opt2.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key/subkey,1000ul/key,subkey/0ul
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/exists.cfg b/yt/yql/tests/sql/suites/blocks/exists.cfg
new file mode 100644
index 0000000000..87522c685e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/exists.cfg
@@ -0,0 +1 @@
+in Input input_exists.txt
diff --git a/yt/yql/tests/sql/suites/blocks/exists.sql b/yt/yql/tests/sql/suites/blocks/exists.sql
new file mode 100644
index 0000000000..a4a0b91d5f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/exists.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+SELECT
+ key,
+ maybe_null is NULL as is_maybe_null,
+ always_null is NULL as is_always_null,
+ never_null is NULL as is_never_null,
+FROM Input
+ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/blocks/filter_by_column_with_drop.cfg b/yt/yql/tests/sql/suites/blocks/filter_by_column_with_drop.cfg
new file mode 100644
index 0000000000..490bd1a7a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/filter_by_column_with_drop.cfg
@@ -0,0 +1 @@
+in Input input_bools.txt
diff --git a/yt/yql/tests/sql/suites/blocks/filter_by_column_with_drop.sql b/yt/yql/tests/sql/suites/blocks/filter_by_column_with_drop.sql
new file mode 100644
index 0000000000..6fd08e1d67
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/filter_by_column_with_drop.sql
@@ -0,0 +1,7 @@
+USE plato;
+
+select
+ key,
+from Input
+where b1
+order by key;
diff --git a/yt/yql/tests/sql/suites/blocks/filter_direct_col.cfg b/yt/yql/tests/sql/suites/blocks/filter_direct_col.cfg
new file mode 100644
index 0000000000..63c656a58f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/filter_direct_col.cfg
@@ -0,0 +1 @@
+in Input input_uint32_optbool_bool.txt
diff --git a/yt/yql/tests/sql/suites/blocks/filter_direct_col.sql b/yt/yql/tests/sql/suites/blocks/filter_direct_col.sql
new file mode 100644
index 0000000000..363a005ca3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/filter_direct_col.sql
@@ -0,0 +1 @@
+select * from plato.Input where value order by key;
diff --git a/yt/yql/tests/sql/suites/blocks/filter_expr.cfg b/yt/yql/tests/sql/suites/blocks/filter_expr.cfg
new file mode 100644
index 0000000000..63c656a58f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/filter_expr.cfg
@@ -0,0 +1 @@
+in Input input_uint32_optbool_bool.txt
diff --git a/yt/yql/tests/sql/suites/blocks/filter_expr.sql b/yt/yql/tests/sql/suites/blocks/filter_expr.sql
new file mode 100644
index 0000000000..07efda8677
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/filter_expr.sql
@@ -0,0 +1 @@
+select key, subkey from plato.Input where not value order by key;
diff --git a/yt/yql/tests/sql/suites/blocks/filter_partial_expr.cfg b/yt/yql/tests/sql/suites/blocks/filter_partial_expr.cfg
new file mode 100644
index 0000000000..63c656a58f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/filter_partial_expr.cfg
@@ -0,0 +1 @@
+in Input input_uint32_optbool_bool.txt
diff --git a/yt/yql/tests/sql/suites/blocks/filter_partial_expr.sql b/yt/yql/tests/sql/suites/blocks/filter_partial_expr.sql
new file mode 100644
index 0000000000..df187d75f2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/filter_partial_expr.sql
@@ -0,0 +1 @@
+select key, subkey from plato.Input where not value or Random(key) >= 0.0 order by key;
diff --git a/yt/yql/tests/sql/suites/blocks/finalize_hashed_keys.cfg b/yt/yql/tests/sql/suites/blocks/finalize_hashed_keys.cfg
new file mode 100644
index 0000000000..57e52ccabb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/finalize_hashed_keys.cfg
@@ -0,0 +1 @@
+in Input input_hashed_uint32.txt
diff --git a/yt/yql/tests/sql/suites/blocks/finalize_hashed_keys.sql b/yt/yql/tests/sql/suites/blocks/finalize_hashed_keys.sql
new file mode 100644
index 0000000000..1609c02088
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/finalize_hashed_keys.sql
@@ -0,0 +1,9 @@
+pragma yt.UsePartitionsByKeysForFinalAgg="false";
+
+USE plato;
+
+SELECT
+ key, count(*), count(subkey), min(subkey), max(subkey), sum(subkey), avg(subkey)
+FROM Input
+GROUP by key
+ORDER by key;
diff --git a/yt/yql/tests/sql/suites/blocks/group_by_complex_key.cfg b/yt/yql/tests/sql/suites/blocks/group_by_complex_key.cfg
new file mode 100644
index 0000000000..b65712414d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/group_by_complex_key.cfg
@@ -0,0 +1 @@
+in Input input_strings.txt
diff --git a/yt/yql/tests/sql/suites/blocks/group_by_complex_key.sql b/yt/yql/tests/sql/suites/blocks/group_by_complex_key.sql
new file mode 100644
index 0000000000..59e121f52f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/group_by_complex_key.sql
@@ -0,0 +1,16 @@
+USE plato;
+
+$src =
+SELECT
+ if (key != '075', AsTuple(Just(Just(key)), 123)) as k,
+ subkey,
+ value
+FROM Input;
+
+SELECT
+ k,
+ min(subkey) as min,
+ max(value) as max,
+FROM $src
+GROUP by k
+ORDER by k
diff --git a/yt/yql/tests/sql/suites/blocks/if.cfg b/yt/yql/tests/sql/suites/blocks/if.cfg
new file mode 100644
index 0000000000..b65712414d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/if.cfg
@@ -0,0 +1 @@
+in Input input_strings.txt
diff --git a/yt/yql/tests/sql/suites/blocks/if.sql b/yt/yql/tests/sql/suites/blocks/if.sql
new file mode 100644
index 0000000000..829699ce50
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/if.sql
@@ -0,0 +1,16 @@
+select
+ key,
+ subkey,
+ if (1 > 0, key, subkey) as same_as_key,
+ if (0 > 100, key, subkey) as same_as_subkey,
+ if (10 > 0, 'scalar1 selected', key) as sc1,
+ if (0 > 11, subkey, 'scalar2 selected') as sc2,
+
+
+ if(key > subkey, key, subkey) as max_of_key_subkey,
+ if(key > subkey, key, 'subkey is greater') as sc3,
+ if(subkey >= key, 'subkey is greater or eq', key) as sc4,
+ if(subkey >= key, 'subkey is greater or eq', 'key is greater') as sc5,
+
+from plato.Input
+order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/blocks/input1.txt.attr b/yt/yql/tests/sql/suites/blocks/input1.txt.attr
new file mode 100644
index 0000000000..157b4f5c1f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input1.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input2.txt.attr b/yt/yql/tests/sql/suites/blocks/input2.txt.attr
new file mode 100644
index 0000000000..157b4f5c1f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input2.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_allnums.txt.attr b/yt/yql/tests/sql/suites/blocks/input_allnums.txt.attr
new file mode 100644
index 0000000000..aaf80d991f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_allnums.txt.attr
@@ -0,0 +1,23 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["i8";["DataType";"Int8"]];
+ ["i16";["DataType";"Int16"]];
+ ["i32";["DataType";"Int32"]];
+ ["i64";["DataType";"Int64"]];
+
+ ["i8opt";["OptionalType"; ["DataType";"Int8"]]];
+ ["i16opt";["OptionalType"; ["DataType";"Int16"]]];
+ ["i32opt";["OptionalType"; ["DataType";"Int32"]]];
+ ["i64opt";["OptionalType"; ["DataType";"Int64"]]];
+
+ ["ui8";["DataType";"Uint8"]];
+ ["ui16";["DataType";"Uint16"]];
+ ["ui32";["DataType";"Uint32"]];
+ ["ui64";["DataType";"Uint64"]];
+
+ ["ui8opt";["OptionalType"; ["DataType";"Uint8"]]];
+ ["ui16opt";["OptionalType"; ["DataType";"Uint16"]]];
+ ["ui32opt";["OptionalType"; ["DataType";"Uint32"]]];
+ ["ui64opt";["OptionalType"; ["DataType";"Uint64"]]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_bool.txt.attr b/yt/yql/tests/sql/suites/blocks/input_bool.txt.attr
new file mode 100644
index 0000000000..f59e3e2a04
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_bool.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Bool"]];
+ ["subkey";["DataType";"Bool"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_bool_opt.txt.attr b/yt/yql/tests/sql/suites/blocks/input_bool_opt.txt.attr
new file mode 100644
index 0000000000..c9690dfe89
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_bool_opt.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["OptionalType";["DataType";"Bool"]]];
+ ["subkey";["OptionalType";["DataType";"Bool"]]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_bools.txt.attr b/yt/yql/tests/sql/suites/blocks/input_bools.txt.attr
new file mode 100644
index 0000000000..22b4be69d8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_bools.txt.attr
@@ -0,0 +1,9 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Int32"]];
+ ["b1";["DataType";"Bool"]];
+ ["b2";["DataType";"Bool"]];
+ ["ob1";["OptionalType";["DataType";"Bool"]]];
+ ["ob2";["OptionalType";["DataType";"Bool"]]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_decimal.txt.attr b/yt/yql/tests/sql/suites/blocks/input_decimal.txt.attr
new file mode 100644
index 0000000000..ebddf8b641
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_decimal.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["cs_ext_list_price";["OptionalType";["DataType";"Decimal";"7";"2"]]];
+ ["cs_ext_tax";["OptionalType";["DataType";"Decimal";"7";"2"]]];
+ ["cs_sales_price";["OptionalType";["DataType";"Decimal";"7";"2"]]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_double.txt.attr b/yt/yql/tests/sql/suites/blocks/input_double.txt.attr
new file mode 100644
index 0000000000..da7771ff13
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_double.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint32"]];
+ ["subkey";["DataType";"Double"]];
+ ];
+ ];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_exists.txt.attr b/yt/yql/tests/sql/suites/blocks/input_exists.txt.attr
new file mode 100644
index 0000000000..16f4c78734
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_exists.txt.attr
@@ -0,0 +1,8 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Int32"]];
+ ["always_null";["OptionalType";["DataType";"Int32"]]];
+ ["never_null";["OptionalType";["DataType";"Int32"]]];
+ ["maybe_null";["OptionalType";["DataType";"Int32"]]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_from_pg_dates.txt.attr b/yt/yql/tests/sql/suites/blocks/input_from_pg_dates.txt.attr
new file mode 100644
index 0000000000..c7b3104a66
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_from_pg_dates.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["a";["PgType";"date"]];
+ ["b";["PgType";"timestamp"]];
+ ]];
+}}
+
diff --git a/yt/yql/tests/sql/suites/blocks/input_hashed_uint32.txt.attr b/yt/yql/tests/sql/suites/blocks/input_hashed_uint32.txt.attr
new file mode 100644
index 0000000000..3a10c2a1ea
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_hashed_uint32.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint32"]];
+ ["subkey";["DataType";"Uint32"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_hashed_uint32_opt.txt.attr b/yt/yql/tests/sql/suites/blocks/input_hashed_uint32_opt.txt.attr
new file mode 100644
index 0000000000..1c249a645e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_hashed_uint32_opt.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint32"]];
+ ["subkey";["OptionalType";["DataType";"Uint32"]]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_int16.txt.attr b/yt/yql/tests/sql/suites/blocks/input_int16.txt.attr
new file mode 100644
index 0000000000..083adc01e3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_int16.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Int16"]];
+ ["subkey";["DataType";"Int16"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_int32.txt.attr b/yt/yql/tests/sql/suites/blocks/input_int32.txt.attr
new file mode 100644
index 0000000000..4776c0c3e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_int32.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Int32"]];
+ ["subkey";["DataType";"Int32"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_int32_opt.txt.attr b/yt/yql/tests/sql/suites/blocks/input_int32_opt.txt.attr
new file mode 100644
index 0000000000..3b099f504e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_int32_opt.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["k1";["DataType";"Int32"]];
+ ["k2";["OptionalType";["DataType";"Int32"]]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_int32_string.txt.attr b/yt/yql/tests/sql/suites/blocks/input_int32_string.txt.attr
new file mode 100644
index 0000000000..52153089c5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_int32_string.txt.attr
@@ -0,0 +1,8 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Int32"]];
+ ["subkey";["DataType";"Int32"]];
+ ["value";["DataType";"String"]];
+ ["value_utf";["DataType";"Utf8"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_int64.txt.attr b/yt/yql/tests/sql/suites/blocks/input_int64.txt.attr
new file mode 100644
index 0000000000..763e1cad96
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_int64.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Int64"]];
+ ["subkey";["DataType";"Int64"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_int8.txt.attr b/yt/yql/tests/sql/suites/blocks/input_int8.txt.attr
new file mode 100644
index 0000000000..c25d3bbf54
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_int8.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Int8"]];
+ ["subkey";["DataType";"Int8"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_json_document.txt.attr b/yt/yql/tests/sql/suites/blocks/input_json_document.txt.attr
new file mode 100644
index 0000000000..d8a67034ac
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_json_document.txt.attr
@@ -0,0 +1,9 @@
+{"_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ ["key";["DataType";"Int32"]];
+ ["val";["DataType";"JsonDocument"]]
+ ]
+ ]
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_nested.txt.attr b/yt/yql/tests/sql/suites/blocks/input_nested.txt.attr
new file mode 100644
index 0000000000..da87d9df75
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_nested.txt.attr
@@ -0,0 +1,8 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint32"]];
+ ["subkey";["DataType";"Uint32"]];
+ ["value";["OptionalType";["TupleType";[["DataType";"Int32"];["OptionalType"; ["OptionalType";["DataType";"Double"]]]]]]
+ ];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_pg.txt.attr b/yt/yql/tests/sql/suites/blocks/input_pg.txt.attr
new file mode 100644
index 0000000000..2e13cdd656
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_pg.txt.attr
@@ -0,0 +1,8 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["a";["PgType";"text"]];
+ ["b";["PgType";"cstring"]];
+ ["c";["PgType";"int2"]];
+ ["d";["DataType";"String"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_pg_arr.txt.attr b/yt/yql/tests/sql/suites/blocks/input_pg_arr.txt.attr
new file mode 100644
index 0000000000..f3588e8e3c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_pg_arr.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["a";["PgType";"int2"]];
+ ["b";["PgType";"text"]];
+ ["c";["PgType";"_int2"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_strings.txt.attr b/yt/yql/tests/sql/suites/blocks/input_strings.txt.attr
new file mode 100644
index 0000000000..157b4f5c1f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_strings.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_strings_opt.txt.attr b/yt/yql/tests/sql/suites/blocks/input_strings_opt.txt.attr
new file mode 100644
index 0000000000..563f941406
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_strings_opt.txt.attr
@@ -0,0 +1,8 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["OptionalType"; ["DataType";"String"]]];
+ ["s";["DataType";"String"]];
+ ["s_opt";["OptionalType"; ["DataType";"String"]]];
+ ["utf";["DataType";"Utf8"]]
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_struct.txt.attr b/yt/yql/tests/sql/suites/blocks/input_struct.txt.attr
new file mode 100644
index 0000000000..a28cc27044
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_struct.txt.attr
@@ -0,0 +1,10 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Int32"]];
+ ["val";["StructType";[
+ ["a";["DataType";"Int32"]];
+ ["x";["DataType";"Int32"]];
+ ["o";["OptionalType";["DataType";"Int32"]]];
+ ]]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_to_pg_dates.txt.attr b/yt/yql/tests/sql/suites/blocks/input_to_pg_dates.txt.attr
new file mode 100644
index 0000000000..28015822b6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_to_pg_dates.txt.attr
@@ -0,0 +1,10 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["a";["DataType";"Date"]];
+ ["b";["DataType";"Datetime"]];
+ ["c";["DataType";"Timestamp"]];
+ ["d";["DataType";"Date32"]];
+ ["e";["DataType";"Datetime64"]];
+ ["f";["DataType";"Timestamp64"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_to_pg_interval.txt.attr b/yt/yql/tests/sql/suites/blocks/input_to_pg_interval.txt.attr
new file mode 100644
index 0000000000..5a665b0202
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_to_pg_interval.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["a";["DataType";"Interval"]];
+ ["b";["DataType";"Interval64"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_to_pg_numbers.txt.attr b/yt/yql/tests/sql/suites/blocks/input_to_pg_numbers.txt.attr
new file mode 100644
index 0000000000..fea8a89ee2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_to_pg_numbers.txt.attr
@@ -0,0 +1,15 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["i8";["DataType";"Int8"]];
+ ["ui8";["DataType";"Uint8"]];
+ ["i16";["DataType";"Int16"]];
+ ["ui16";["DataType";"Uint16"]];
+ ["i32";["DataType";"Int32"]];
+ ["ui32";["DataType";"Uint32"]];
+ ["i64";["DataType";"Int64"]];
+ ["ui64";["DataType";"Uint64"]];
+ ["f4";["DataType";"Float"]];
+ ["f8";["DataType";"Double"]];
+ ]];
+}}
+
diff --git a/yt/yql/tests/sql/suites/blocks/input_to_pg_strings.txt.attr b/yt/yql/tests/sql/suites/blocks/input_to_pg_strings.txt.attr
new file mode 100644
index 0000000000..8c64c6f3cc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_to_pg_strings.txt.attr
@@ -0,0 +1,14 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["s";["DataType";"String"]];
+ ["u";["DataType";"Utf8"]];
+ ["y";["DataType";"Yson"]];
+ ["j";["DataType";"Json"]];
+ ["jd";["DataType";"JsonDocument"]];
+ ["ud";["DataType";"Uuid"]];
+ ["tzd";["DataType";"TzDate"]];
+ ["tzdt";["DataType";"TzDatetime"]];
+ ["tzts";["DataType";"TzTimestamp"]];
+ ]];
+}}
+
diff --git a/yt/yql/tests/sql/suites/blocks/input_tofrom_pg.txt.attr b/yt/yql/tests/sql/suites/blocks/input_tofrom_pg.txt.attr
new file mode 100644
index 0000000000..507d3a002b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_tofrom_pg.txt.attr
@@ -0,0 +1,11 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["a";["DataType";"Utf8"]];
+ ["b";["PgType";"text"]];
+ ["c";["PgType";"cstring"]];
+ ["d";["OptionalType";["DataType";"Utf8"]]];
+ ["e";["DataType";"Int64"]];
+ ["f";["PgType";"int8"]];
+ ["g";["OptionalType";["DataType";"Int64"]]];
+ ]];
+}} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/blocks/input_top.txt.attr b/yt/yql/tests/sql/suites/blocks/input_top.txt.attr
new file mode 100644
index 0000000000..3ddddb86b8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_top.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Int32"]];
+ ["subkey";["DataType";"Int32"]];
+ ["value";["DataType";"String"]]
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_tuple.txt.attr b/yt/yql/tests/sql/suites/blocks/input_tuple.txt.attr
new file mode 100644
index 0000000000..bad356fdd4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_tuple.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint32"]];
+ ["subkey";["DataType";"Uint32"]];
+ ["value";["TupleType";[["DataType";"Int32"];["DataType";"Double"]]]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_uint16.txt.attr b/yt/yql/tests/sql/suites/blocks/input_uint16.txt.attr
new file mode 100644
index 0000000000..99a1ee195f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_uint16.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint16"]];
+ ["subkey";["DataType";"Uint16"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_uint32.txt.attr b/yt/yql/tests/sql/suites/blocks/input_uint32.txt.attr
new file mode 100644
index 0000000000..3a10c2a1ea
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_uint32.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint32"]];
+ ["subkey";["DataType";"Uint32"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_uint32_optbool_bool.txt.attr b/yt/yql/tests/sql/suites/blocks/input_uint32_optbool_bool.txt.attr
new file mode 100644
index 0000000000..f0670909b7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_uint32_optbool_bool.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint32"]];
+ ["subkey";["OptionalType"; ["DataType";"Bool"]]];
+ ["value";["DataType";"Bool"]]
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_uint64.txt.attr b/yt/yql/tests/sql/suites/blocks/input_uint64.txt.attr
new file mode 100644
index 0000000000..7240806897
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_uint64.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint64"]];
+ ["subkey";["DataType";"Uint64"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_uint64_filter.txt.attr b/yt/yql/tests/sql/suites/blocks/input_uint64_filter.txt.attr
new file mode 100644
index 0000000000..7240806897
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_uint64_filter.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint64"]];
+ ["subkey";["DataType";"Uint64"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_uint64_filter_opt.txt.attr b/yt/yql/tests/sql/suites/blocks/input_uint64_filter_opt.txt.attr
new file mode 100644
index 0000000000..6107e21eaa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_uint64_filter_opt.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["OptionalType";["DataType";"Uint64"]]];
+ ["subkey";["DataType";"Uint64"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_uint64_nested_opt.txt.attr b/yt/yql/tests/sql/suites/blocks/input_uint64_nested_opt.txt.attr
new file mode 100644
index 0000000000..3633a48f45
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_uint64_nested_opt.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint64"]];
+ ["subkey";["OptionalType";["OptionalType";["DataType";"Uint64"]]]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_uint64_opt.txt.attr b/yt/yql/tests/sql/suites/blocks/input_uint64_opt.txt.attr
new file mode 100644
index 0000000000..6107e21eaa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_uint64_opt.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["OptionalType";["DataType";"Uint64"]]];
+ ["subkey";["DataType";"Uint64"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_uint64_opt2.txt.attr b/yt/yql/tests/sql/suites/blocks/input_uint64_opt2.txt.attr
new file mode 100644
index 0000000000..738708acf1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_uint64_opt2.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["OptionalType";["DataType";"Uint64"]]];
+ ["subkey";["OptionalType";["DataType";"Uint64"]]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_uint8.txt.attr b/yt/yql/tests/sql/suites/blocks/input_uint8.txt.attr
new file mode 100644
index 0000000000..619dbdd1bf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_uint8.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint8"]];
+ ["subkey";["DataType";"Uint8"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/input_uint8_big.txt.attr b/yt/yql/tests/sql/suites/blocks/input_uint8_big.txt.attr
new file mode 100644
index 0000000000..619dbdd1bf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/input_uint8_big.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint8"]];
+ ["subkey";["DataType";"Uint8"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/blocks/interval_add_date.cfg b/yt/yql/tests/sql/suites/blocks/interval_add_date.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_add_date.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/interval_add_date.sql b/yt/yql/tests/sql/suites/blocks/interval_add_date.sql
new file mode 100644
index 0000000000..bb395b7f75
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_add_date.sql
@@ -0,0 +1,31 @@
+USE plato;
+
+SELECT
+ b.ni + a.na,
+ b.wi + a.na,
+ b.ni + a.naz,
+ b.wi + a.naz,
+ b.ni + a.nd,
+ b.wi + a.nd,
+ b.ni + a.ndz,
+ b.wi + a.ndz,
+ b.ni + a.nt,
+ b.wi + a.nt,
+ b.ni + a.ntz,
+ b.wi + a.ntz,
+
+ b.ni + a.wa,
+ b.wi + a.wa,
+ b.ni + a.waz,
+ b.wi + a.waz,
+ b.ni + a.wd,
+ b.wi + a.wd,
+ b.ni + a.wdz,
+ b.wi + a.wdz,
+ b.ni + a.wt,
+ b.wi + a.wt,
+ b.ni + a.wtz,
+ b.wi + a.wtz
+FROM Dates as a CROSS JOIN Dates as b
+
+
diff --git a/yt/yql/tests/sql/suites/blocks/interval_add_date_scalar.cfg b/yt/yql/tests/sql/suites/blocks/interval_add_date_scalar.cfg
new file mode 100644
index 0000000000..8d2d2a19fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_add_date_scalar.cfg
@@ -0,0 +1 @@
+in Dates dates.txt
diff --git a/yt/yql/tests/sql/suites/blocks/interval_add_date_scalar.sql b/yt/yql/tests/sql/suites/blocks/interval_add_date_scalar.sql
new file mode 100644
index 0000000000..1cc7f48940
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_add_date_scalar.sql
@@ -0,0 +1,57 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin,FuseMultiOutsWithOuterMaps";
+
+SELECT
+ ni + Date("2000-01-01") ,
+ wi + Date("2000-01-01"),
+ ni + TzDate("2000-01-01,Europe/Moscow"),
+ wi + TzDate("2000-01-01,Europe/Moscow"),
+ ni + Datetime("2000-01-01T03:04:05Z"),
+ wi + Datetime("2000-01-01T03:04:05Z"),
+ ni + TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wi + TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ ni + Timestamp("2000-01-01T03:04:05.678912Z"),
+ wi + Timestamp("2000-01-01T03:04:05.678912Z"),
+ ni + TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wi + TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ ni + Date32("1900-01-01"),
+ wi + Date32("1900-01-01"),
+ ni + Datetime64("1900-01-01T03:04:05Z"),
+ wi + Datetime64("1900-01-01T03:04:05Z"),
+ ni + Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wi + Timestamp64("1900-01-01T03:04:05.678912Z"),
+ ni + TzDate32("1900-01-01,Europe/Moscow"),
+ wi + TzDate32("1900-01-01,Europe/Moscow"),
+ ni + TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ wi + TzDatetime64("1900-01-01T03:04:05,Europe/Moscow"),
+ ni + TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+ wi + TzTimestamp64("1900-01-01T03:04:05.678912,Europe/Moscow"),
+FROM Dates;
+
+SELECT
+ Interval("P1D") + na,
+ Interval64("P1D") + na,
+ Interval("P1D") + naz,
+ Interval64("P1D") + naz,
+ Interval("P1D") + nd,
+ Interval64("P1D") + nd,
+ Interval("P1D") + ndz,
+ Interval64("P1D") + ndz,
+ Interval("P1D") + nt,
+ Interval64("P1D") + nt,
+ Interval("P1D") + ntz,
+ Interval64("P1D") + ntz,
+ Interval("P1D") + wa,
+ Interval64("P1D") + wa,
+ Interval("P1D") + wd,
+ Interval64("P1D") + wd,
+ Interval("P1D") + wt,
+ Interval64("P1D") + wt,
+ Interval("P1D") + waz,
+ Interval64("P1D") + waz,
+ Interval("P1D") + wdz,
+ Interval64("P1D") + wdz,
+ Interval("P1D") + wtz,
+ Interval64("P1D") + wtz
+FROM Dates;
+
diff --git a/yt/yql/tests/sql/suites/blocks/interval_add_interval.cfg b/yt/yql/tests/sql/suites/blocks/interval_add_interval.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_add_interval.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/interval_add_interval.sql b/yt/yql/tests/sql/suites/blocks/interval_add_interval.sql
new file mode 100644
index 0000000000..e1e84d209a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_add_interval.sql
@@ -0,0 +1,10 @@
+USE plato;
+
+SELECT
+ a.ni + b.ni,
+ a.ni + b.wi,
+ a.wi + b.ni,
+ a.wi + b.wi
+FROM Dates AS a CROSS JOIN Dates as b
+
+
diff --git a/yt/yql/tests/sql/suites/blocks/interval_add_interval_scalar.cfg b/yt/yql/tests/sql/suites/blocks/interval_add_interval_scalar.cfg
new file mode 100644
index 0000000000..8d2d2a19fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_add_interval_scalar.cfg
@@ -0,0 +1 @@
+in Dates dates.txt
diff --git a/yt/yql/tests/sql/suites/blocks/interval_add_interval_scalar.sql b/yt/yql/tests/sql/suites/blocks/interval_add_interval_scalar.sql
new file mode 100644
index 0000000000..df0d35160c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_add_interval_scalar.sql
@@ -0,0 +1,16 @@
+USE plato;
+
+SELECT
+ ni + Interval("P1D"),
+ wi + Interval("P1D"),
+ ni + Interval64("P1D"),
+ wi + Interval64("P1D")
+FROM Dates;
+
+SELECT
+ Interval("P1D") + ni,
+ Interval("P1D") + wi,
+ Interval64("P1D") + ni,
+ Interval64("P1D") + wi
+FROM Dates;
+
diff --git a/yt/yql/tests/sql/suites/blocks/interval_div.cfg b/yt/yql/tests/sql/suites/blocks/interval_div.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_div.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/interval_div.sql b/yt/yql/tests/sql/suites/blocks/interval_div.sql
new file mode 100644
index 0000000000..acbb470663
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_div.sql
@@ -0,0 +1,22 @@
+USE plato;
+
+SELECT
+ a.ni / b.i8,
+ a.wi / b.i8,
+ a.ni / b.u8,
+ a.wi / b.u8,
+ a.ni / b.i16,
+ a.wi / b.i16,
+ a.ni / b.u16,
+ a.wi / b.u16,
+ a.ni / b.i32,
+ a.wi / b.i32,
+ a.ni / b.u32,
+ a.wi / b.u32,
+ a.ni / b.i64,
+ a.wi / b.i64,
+ a.ni / b.u64,
+ a.wi / b.u64,
+FROM Dates as a CROSS JOIN Dates as b;
+
+
diff --git a/yt/yql/tests/sql/suites/blocks/interval_div_scalar.cfg b/yt/yql/tests/sql/suites/blocks/interval_div_scalar.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_div_scalar.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/interval_div_scalar.sql b/yt/yql/tests/sql/suites/blocks/interval_div_scalar.sql
new file mode 100644
index 0000000000..2c9dbb8cb9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_div_scalar.sql
@@ -0,0 +1,41 @@
+USE plato;
+
+SELECT
+ ni / Int8("10"),
+ wi / Int8("10"),
+ ni / Uint8("11"),
+ wi / Uint8("11"),
+ ni / Int16("12"),
+ wi / Int16("12"),
+ ni / Uint16("13"),
+ wi / Uint16("13"),
+ ni / Int32("14"),
+ wi / Int32("14"),
+ ni / Uint32("15"),
+ wi / Uint32("15"),
+ ni / Int64("16"),
+ wi / Int64("16"),
+ ni / Uint64("17"),
+ wi / Uint64("17"),
+FROM Dates;
+
+SELECT
+ Interval("P1D") / i8,
+ Interval64("P1D") / i8,
+ Interval("P1D") / u8,
+ Interval64("P1D") / u8,
+ Interval("P1D") / i16,
+ Interval64("P1D") / i16,
+ Interval("P1D") / u16,
+ Interval64("P1D") / u16,
+ Interval("P1D") / i32,
+ Interval64("P1D") / i32,
+ Interval("P1D") / u32,
+ Interval64("P1D") / u32,
+ Interval("P1D") / i64,
+ Interval64("P1D") / i64,
+ Interval("P1D") / u64,
+ Interval64("P1D") / u64
+FROM Dates;
+
+
diff --git a/yt/yql/tests/sql/suites/blocks/interval_mul.cfg b/yt/yql/tests/sql/suites/blocks/interval_mul.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_mul.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/interval_mul.sql b/yt/yql/tests/sql/suites/blocks/interval_mul.sql
new file mode 100644
index 0000000000..bd5727a48e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_mul.sql
@@ -0,0 +1,40 @@
+USE plato;
+
+SELECT
+ a.ni * b.i8,
+ a.wi * b.i8,
+ a.ni * b.u8,
+ a.wi * b.u8,
+ a.ni * b.i16,
+ a.wi * b.i16,
+ a.ni * b.u16,
+ a.wi * b.u16,
+ a.ni * b.i32,
+ a.wi * b.i32,
+ a.ni * b.u32,
+ a.wi * b.u32,
+ a.ni * b.i64,
+ a.wi * b.i64,
+ a.ni * b.u64,
+ a.wi * b.u64,
+FROM Dates as a CROSS JOIN Dates as b;
+
+SELECT
+ b.i8 * a.ni,
+ b.i8 * a.wi,
+ b.u8 * a.ni,
+ b.u8 * a.wi,
+ b.i16 * a.ni,
+ b.i16 * a.wi,
+ b.u16 * a.ni,
+ b.u16 * a.wi,
+ b.i32 * a.ni,
+ b.i32 * a.wi,
+ b.u32 * a.ni,
+ b.u32 * a.wi,
+ b.i64 * a.ni,
+ b.i64 * a.wi,
+ b.u64 * a.ni,
+ b.u64 * a.wi,
+FROM Dates as a CROSS JOIN Dates as b;
+
diff --git a/yt/yql/tests/sql/suites/blocks/interval_mul_scalar.cfg b/yt/yql/tests/sql/suites/blocks/interval_mul_scalar.cfg
new file mode 100644
index 0000000000..d0a66cb111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_mul_scalar.cfg
@@ -0,0 +1,2 @@
+in Dates dates.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/interval_mul_scalar.sql b/yt/yql/tests/sql/suites/blocks/interval_mul_scalar.sql
new file mode 100644
index 0000000000..6fc2e88ad3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_mul_scalar.sql
@@ -0,0 +1,79 @@
+USE plato;
+
+SELECT
+ ni * Int8("10"),
+ wi * Int8("10"),
+ ni * Uint8("11"),
+ wi * Uint8("11"),
+ ni * Int16("12"),
+ wi * Int16("12"),
+ ni * Uint16("13"),
+ wi * Uint16("13"),
+ ni * Int32("14"),
+ wi * Int32("14"),
+ ni * Uint32("15"),
+ wi * Uint32("15"),
+ ni * Int64("16"),
+ wi * Int64("16"),
+ ni * Uint64("17"),
+ wi * Uint64("17"),
+FROM Dates;
+
+SELECT
+ Int8("10") * ni,
+ Int8("10") * wi,
+ Uint8("11") * ni,
+ Uint8("11") * wi,
+ Int16("12") * ni,
+ Int16("12") * wi,
+ Uint16("13") * ni,
+ Uint16("13") * wi,
+ Int32("14") * ni,
+ Int32("14") * wi,
+ Uint32("15") * ni,
+ Uint32("15") * wi,
+ Int64("16") * ni,
+ Int64("16") * wi,
+ Uint64("17") * ni,
+ Uint64("17") * wi
+FROM Dates;
+
+SELECT
+ Interval("P1D") * i8,
+ Interval64("P1D") * i8,
+ Interval("P1D") * u8,
+ Interval64("P1D") * u8,
+ Interval("P1D") * i16,
+ Interval64("P1D") * i16,
+ Interval("P1D") * u16,
+ Interval64("P1D") * u16,
+ Interval("P1D") * i32,
+ Interval64("P1D") * i32,
+ Interval("P1D") * u32,
+ Interval64("P1D") * u32,
+ Interval("P1D") * i64,
+ Interval64("P1D") * i64,
+ Interval("P1D") * u64,
+ Interval64("P1D") * u64
+FROM Dates;
+
+SELECT
+ i8 * Interval("P1D"),
+ i8 * Interval64("P1D"),
+ u8 * Interval("P1D"),
+ u8 * Interval64("P1D"),
+ i16 * Interval("P1D"),
+ i16 * Interval64("P1D"),
+ u16 * Interval("P1D"),
+ u16 * Interval64("P1D"),
+ i32 * Interval("P1D"),
+ i32 * Interval64("P1D"),
+ u32 * Interval("P1D"),
+ u32 * Interval64("P1D"),
+ i64 * Interval("P1D"),
+ i64 * Interval64("P1D"),
+ u64 * Interval("P1D"),
+ u64 * Interval64("P1D")
+FROM Dates;
+
+
diff --git a/yt/yql/tests/sql/suites/blocks/interval_sub_interval.cfg b/yt/yql/tests/sql/suites/blocks/interval_sub_interval.cfg
new file mode 100644
index 0000000000..8d2d2a19fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_sub_interval.cfg
@@ -0,0 +1 @@
+in Dates dates.txt
diff --git a/yt/yql/tests/sql/suites/blocks/interval_sub_interval.sql b/yt/yql/tests/sql/suites/blocks/interval_sub_interval.sql
new file mode 100644
index 0000000000..eaf0809d0b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_sub_interval.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+SELECT
+ a.ni - b.ni,
+ a.ni - b.wi,
+ a.wi - b.ni,
+ a.wi - b.wi
+FROM Dates as a CROSS JOIN Dates as b
+
diff --git a/yt/yql/tests/sql/suites/blocks/interval_sub_interval_scalar.cfg b/yt/yql/tests/sql/suites/blocks/interval_sub_interval_scalar.cfg
new file mode 100644
index 0000000000..8d2d2a19fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_sub_interval_scalar.cfg
@@ -0,0 +1 @@
+in Dates dates.txt
diff --git a/yt/yql/tests/sql/suites/blocks/interval_sub_interval_scalar.sql b/yt/yql/tests/sql/suites/blocks/interval_sub_interval_scalar.sql
new file mode 100644
index 0000000000..4339da03f9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/interval_sub_interval_scalar.sql
@@ -0,0 +1,16 @@
+USE plato;
+
+SELECT
+ ni - Interval("P1D"),
+ wi - Interval("P1D"),
+ ni - Interval64("P1D"),
+ wi - Interval64("P1D")
+FROM Dates;
+
+SELECT
+ Interval("P1D") - ni,
+ Interval("P1D") - wi,
+ Interval64("P1D") - ni,
+ Interval64("P1D") - wi
+FROM Dates;
+
diff --git a/yt/yql/tests/sql/suites/blocks/json_document_type.cfg b/yt/yql/tests/sql/suites/blocks/json_document_type.cfg
new file mode 100644
index 0000000000..8e18b34b94
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/json_document_type.cfg
@@ -0,0 +1 @@
+in Input input_json_document.txt
diff --git a/yt/yql/tests/sql/suites/blocks/json_document_type.sql b/yt/yql/tests/sql/suites/blocks/json_document_type.sql
new file mode 100644
index 0000000000..942f54bf80
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/json_document_type.sql
@@ -0,0 +1,8 @@
+USE plato;
+
+SELECT
+ key,
+ SOME(val) as someVal,
+FROM Input
+GROUP BY key
+ORDER BY key
diff --git a/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_basic.cfg b/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_basic.cfg
new file mode 100644
index 0000000000..34475912cb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_basic.cfg
@@ -0,0 +1,2 @@
+in Input input_strings.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_basic.sql b/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_basic.sql
new file mode 100644
index 0000000000..81a521ab93
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_basic.sql
@@ -0,0 +1,17 @@
+USE plato;
+
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin";
+
+
+$ns_tolower = ($x) -> (AssumeNonStrict(String::AsciiToLower($x)));
+$ns_toupper = ($x) -> (AssumeNonStrict(String::AsciiToUpper($x)));
+
+-- full block
+select * from Input where $ns_tolower(value) > "aaa" and subkey == "1";
+
+-- partial block due to lazy non-strict node
+select * from Input where subkey == "2" and $ns_toupper(value) <= "ZZZ";
+
+-- full block - same non strict is used in first arg of AND
+select * from Input where $ns_toupper(value) >= "AAA" and $ns_toupper(value) <= "ZZZ" and subkey == "3";
+
diff --git a/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_nested.cfg b/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_nested.cfg
new file mode 100644
index 0000000000..34475912cb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_nested.cfg
@@ -0,0 +1,2 @@
+in Input input_strings.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_nested.sql b/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_nested.sql
new file mode 100644
index 0000000000..2ae846ae4c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_nested.sql
@@ -0,0 +1,4 @@
+USE plato;
+
+-- partial blocks due to non strict in second arg of AND
+select if(value > "aaa" and String::AsciiToLower(AssumeNonStrict(subkey)) > "3", "foo", "bar"), value, subkey from Input;
diff --git a/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_with_scalar_ctx.cfg b/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_with_scalar_ctx.cfg
new file mode 100644
index 0000000000..b65712414d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_with_scalar_ctx.cfg
@@ -0,0 +1 @@
+in Input input_strings.txt
diff --git a/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_with_scalar_ctx.sql b/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_with_scalar_ctx.sql
new file mode 100644
index 0000000000..647de993e7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/lazy_nonstrict_with_scalar_ctx.sql
@@ -0,0 +1,10 @@
+USE plato;
+
+$one = select min(AssumeNonStrict(value)) from Input;
+$two = select AssumeNonStrict(min(value)) from Input;
+
+-- fully converted to blocks - scalar context is assumed strict
+select * from Input where subkey != "1" and value > $one;
+
+-- partially converted to blocks - AssumeStrict is calculated outside of scalar context
+select * from Input where subkey != "2" and value > $two;
diff --git a/yt/yql/tests/sql/suites/blocks/member.cfg b/yt/yql/tests/sql/suites/blocks/member.cfg
new file mode 100644
index 0000000000..ed506aaf28
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/member.cfg
@@ -0,0 +1 @@
+in Input input_struct.txt
diff --git a/yt/yql/tests/sql/suites/blocks/member.sql b/yt/yql/tests/sql/suites/blocks/member.sql
new file mode 100644
index 0000000000..199d5c17bd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/member.sql
@@ -0,0 +1,10 @@
+USE plato;
+
+SELECT
+ val.a as a,
+ <|qq:key,qkrq:"QKRQ"|> as q,
+ /* XXX: <AddMember> callable always expands to <AsStruct>. */
+ AddMember(val, "k", key) as wik,
+ /* XXX: <RemoveMember> callable always expands to <AsStruct>. */
+ RemoveMember(val, "x") as wox,
+FROM Input;
diff --git a/yt/yql/tests/sql/suites/blocks/minmax_strings.cfg b/yt/yql/tests/sql/suites/blocks/minmax_strings.cfg
new file mode 100644
index 0000000000..476f4bfed1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/minmax_strings.cfg
@@ -0,0 +1 @@
+in Input input_strings_opt.txt
diff --git a/yt/yql/tests/sql/suites/blocks/minmax_strings.sql b/yt/yql/tests/sql/suites/blocks/minmax_strings.sql
new file mode 100644
index 0000000000..776834e93a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/minmax_strings.sql
@@ -0,0 +1,21 @@
+pragma yt.UsePartitionsByKeysForFinalAgg="false";
+
+USE plato;
+
+select
+ key,
+
+ max(s) as maxs,
+ min(s) as mins,
+ min(s_opt) as mins_opt,
+ max(s_opt) as maxs_opt,
+
+ max(distinct utf) as dmaxs,
+ min(distinct utf) as dmins,
+ min(distinct s_opt) as dmins_opt,
+ max(distinct s_opt) as dmaxs_opt,
+
+from Input
+group by key
+order by key;
+
diff --git a/yt/yql/tests/sql/suites/blocks/minmax_strings_filter.cfg b/yt/yql/tests/sql/suites/blocks/minmax_strings_filter.cfg
new file mode 100644
index 0000000000..476f4bfed1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/minmax_strings_filter.cfg
@@ -0,0 +1 @@
+in Input input_strings_opt.txt
diff --git a/yt/yql/tests/sql/suites/blocks/minmax_strings_filter.sql b/yt/yql/tests/sql/suites/blocks/minmax_strings_filter.sql
new file mode 100644
index 0000000000..3fe3c7b524
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/minmax_strings_filter.sql
@@ -0,0 +1,17 @@
+pragma yt.UsePartitionsByKeysForFinalAgg="false";
+
+USE plato;
+
+select
+ key,
+
+ max(s) as maxs,
+ min(s) as mins,
+ min(s_opt) as mins_opt,
+ max(s_opt) as maxs_opt,
+
+from Input
+where key != "1" and s not in ("7", "8")
+group by key
+order by key;
+
diff --git a/yt/yql/tests/sql/suites/blocks/minmax_tuple.cfg b/yt/yql/tests/sql/suites/blocks/minmax_tuple.cfg
new file mode 100644
index 0000000000..b65712414d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/minmax_tuple.cfg
@@ -0,0 +1 @@
+in Input input_strings.txt
diff --git a/yt/yql/tests/sql/suites/blocks/minmax_tuple.sql b/yt/yql/tests/sql/suites/blocks/minmax_tuple.sql
new file mode 100644
index 0000000000..a785e7c958
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/minmax_tuple.sql
@@ -0,0 +1,16 @@
+pragma yt.UsePartitionsByKeysForFinalAgg="false";
+
+USE plato;
+
+select
+ key,
+ min(AsTuple(subkey, value)) as min,
+ max(AsTuple(subkey, value)) as max,
+from Input
+group by key
+order by key;
+
+select
+ min(AsTuple(subkey, value)) as min,
+ max(AsTuple(subkey, value)) as max,
+from Input;
diff --git a/yt/yql/tests/sql/suites/blocks/mod_uint64.cfg b/yt/yql/tests/sql/suites/blocks/mod_uint64.cfg
new file mode 100644
index 0000000000..5ee9471fc0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/mod_uint64.cfg
@@ -0,0 +1 @@
+in Input input_uint64.txt
diff --git a/yt/yql/tests/sql/suites/blocks/mod_uint64.sql b/yt/yql/tests/sql/suites/blocks/mod_uint64.sql
new file mode 100644
index 0000000000..9de44e5756
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/mod_uint64.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key%subkey,999ul%key,subkey%0ul
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/mod_uint64_opt2.cfg b/yt/yql/tests/sql/suites/blocks/mod_uint64_opt2.cfg
new file mode 100644
index 0000000000..46fee85c7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/mod_uint64_opt2.cfg
@@ -0,0 +1 @@
+in Input input_uint64_opt2.txt
diff --git a/yt/yql/tests/sql/suites/blocks/mod_uint64_opt2.sql b/yt/yql/tests/sql/suites/blocks/mod_uint64_opt2.sql
new file mode 100644
index 0000000000..9de44e5756
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/mod_uint64_opt2.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key%subkey,999ul%key,subkey%0ul
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/mul_uint64_opt2.cfg b/yt/yql/tests/sql/suites/blocks/mul_uint64_opt2.cfg
new file mode 100644
index 0000000000..46fee85c7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/mul_uint64_opt2.cfg
@@ -0,0 +1 @@
+in Input input_uint64_opt2.txt
diff --git a/yt/yql/tests/sql/suites/blocks/mul_uint64_opt2.sql b/yt/yql/tests/sql/suites/blocks/mul_uint64_opt2.sql
new file mode 100644
index 0000000000..52cda1db0d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/mul_uint64_opt2.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key*subkey,1000ul*key,subkey*1ul
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/nested_optionals.cfg b/yt/yql/tests/sql/suites/blocks/nested_optionals.cfg
new file mode 100644
index 0000000000..c0f7c37ee1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/nested_optionals.cfg
@@ -0,0 +1 @@
+in Input input_uint64_nested_opt.txt
diff --git a/yt/yql/tests/sql/suites/blocks/nested_optionals.sql b/yt/yql/tests/sql/suites/blocks/nested_optionals.sql
new file mode 100644
index 0000000000..f14105be2e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/nested_optionals.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key+1u,subkey
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/not.cfg b/yt/yql/tests/sql/suites/blocks/not.cfg
new file mode 100644
index 0000000000..e4a99991a0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/not.cfg
@@ -0,0 +1 @@
+in Input input_bool.txt
diff --git a/yt/yql/tests/sql/suites/blocks/not.sql b/yt/yql/tests/sql/suites/blocks/not.sql
new file mode 100644
index 0000000000..6b7883d03d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/not.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key,subkey,not key
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/not_opt.cfg b/yt/yql/tests/sql/suites/blocks/not_opt.cfg
new file mode 100644
index 0000000000..a159493a2b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/not_opt.cfg
@@ -0,0 +1 @@
+in Input input_bool_opt.txt
diff --git a/yt/yql/tests/sql/suites/blocks/not_opt.sql b/yt/yql/tests/sql/suites/blocks/not_opt.sql
new file mode 100644
index 0000000000..6b7883d03d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/not_opt.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key,subkey,not key
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/partial_blocks1.cfg b/yt/yql/tests/sql/suites/blocks/partial_blocks1.cfg
new file mode 100644
index 0000000000..5ee9471fc0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/partial_blocks1.cfg
@@ -0,0 +1 @@
+in Input input_uint64.txt
diff --git a/yt/yql/tests/sql/suites/blocks/partial_blocks1.sql b/yt/yql/tests/sql/suites/blocks/partial_blocks1.sql
new file mode 100644
index 0000000000..98b1bbd00d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/partial_blocks1.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ 2*(key+subkey),1ul+key+key+key,subkey+2ul,key
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/pg.cfg b/yt/yql/tests/sql/suites/blocks/pg.cfg
new file mode 100644
index 0000000000..72b51dc777
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg.cfg
@@ -0,0 +1 @@
+in Input input_pg.txt
diff --git a/yt/yql/tests/sql/suites/blocks/pg.sql b/yt/yql/tests/sql/suites/blocks/pg.sql
new file mode 100644
index 0000000000..050d81b633
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+SELECT
+ a,
+ b,
+ c,
+ d,
+ len(d)
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/pg_call.cfg b/yt/yql/tests/sql/suites/blocks/pg_call.cfg
new file mode 100644
index 0000000000..72b51dc777
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_call.cfg
@@ -0,0 +1 @@
+in Input input_pg.txt
diff --git a/yt/yql/tests/sql/suites/blocks/pg_call.sql b/yt/yql/tests/sql/suites/blocks/pg_call.sql
new file mode 100644
index 0000000000..cb5def9f51
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_call.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+SELECT
+ a || a, a || 'x'p, c + c, c * 10p, Pg::upper(a), Pg::concat(a,99)
+FROM Input
+
diff --git a/yt/yql/tests/sql/suites/blocks/pg_from_dates.cfg b/yt/yql/tests/sql/suites/blocks/pg_from_dates.cfg
new file mode 100644
index 0000000000..76186af27f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_from_dates.cfg
@@ -0,0 +1 @@
+in Input input_from_pg_dates.txt
diff --git a/yt/yql/tests/sql/suites/blocks/pg_from_dates.sql b/yt/yql/tests/sql/suites/blocks/pg_from_dates.sql
new file mode 100644
index 0000000000..d8fe47bd32
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_from_dates.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+SELECT
+ FromPg(a), FromPg(b)
+FROM Input
+
diff --git a/yt/yql/tests/sql/suites/blocks/pg_sort.cfg b/yt/yql/tests/sql/suites/blocks/pg_sort.cfg
new file mode 100644
index 0000000000..5356944180
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_sort.cfg
@@ -0,0 +1 @@
+in Input input_pg_arr.txt
diff --git a/yt/yql/tests/sql/suites/blocks/pg_sort.sql b/yt/yql/tests/sql/suites/blocks/pg_sort.sql
new file mode 100644
index 0000000000..8d5fcffce2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_sort.sql
@@ -0,0 +1,5 @@
+USE plato;
+SELECT
+ *
+FROM Input
+ORDER BY a,b desc,c desc
diff --git a/yt/yql/tests/sql/suites/blocks/pg_to_dates.cfg b/yt/yql/tests/sql/suites/blocks/pg_to_dates.cfg
new file mode 100644
index 0000000000..e0f8a9c251
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_to_dates.cfg
@@ -0,0 +1 @@
+in Input input_to_pg_dates.txt
diff --git a/yt/yql/tests/sql/suites/blocks/pg_to_dates.sql b/yt/yql/tests/sql/suites/blocks/pg_to_dates.sql
new file mode 100644
index 0000000000..95dcb9db02
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_to_dates.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ ToPg(a), ToPg(b), ToPg(c), ToPg(d), ToPg(e), ToPg(f)
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/pg_to_interval.cfg b/yt/yql/tests/sql/suites/blocks/pg_to_interval.cfg
new file mode 100644
index 0000000000..9280de6a86
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_to_interval.cfg
@@ -0,0 +1 @@
+in Input input_to_pg_interval.txt
diff --git a/yt/yql/tests/sql/suites/blocks/pg_to_interval.sql b/yt/yql/tests/sql/suites/blocks/pg_to_interval.sql
new file mode 100644
index 0000000000..094f64ae04
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_to_interval.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+SELECT
+ ToPg(a), ToPg(b)
+FROM Input
+
diff --git a/yt/yql/tests/sql/suites/blocks/pg_to_numbers.cfg b/yt/yql/tests/sql/suites/blocks/pg_to_numbers.cfg
new file mode 100644
index 0000000000..5d629ee015
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_to_numbers.cfg
@@ -0,0 +1,2 @@
+in Input input_to_pg_numbers.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/pg_to_numbers.sql b/yt/yql/tests/sql/suites/blocks/pg_to_numbers.sql
new file mode 100644
index 0000000000..b220cc3050
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_to_numbers.sql
@@ -0,0 +1,10 @@
+USE plato;
+
+SELECT
+ ToPg(i8), ToPg(ui8),
+ ToPg(i16), ToPg(ui16),
+ ToPg(i32), ToPg(ui32),
+ ToPg(i64), ToPg(ui64),
+ ToPg(f4), ToPg(f8)
+FROM Input
+
diff --git a/yt/yql/tests/sql/suites/blocks/pg_to_strings.cfg b/yt/yql/tests/sql/suites/blocks/pg_to_strings.cfg
new file mode 100644
index 0000000000..1b143d34c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_to_strings.cfg
@@ -0,0 +1,2 @@
+in Input input_to_pg_strings.txt
+
diff --git a/yt/yql/tests/sql/suites/blocks/pg_to_strings.sql b/yt/yql/tests/sql/suites/blocks/pg_to_strings.sql
new file mode 100644
index 0000000000..e1c3ad8b3d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_to_strings.sql
@@ -0,0 +1,15 @@
+USE plato;
+pragma yt.DisableOptimizers="OutHorizontalJoin,HorizontalJoin,MultiHorizontalJoin";
+
+SELECT
+ ToPg(s), ToPg(u),
+ ToPg(y), ToPg(j),
+ ToPg(jd)
+FROM Input;
+
+
+SELECT
+ ToPg(tzd),
+ ToPg(tzdt), ToPg(tzts),
+ ToPg(ud)
+FROM Input;
diff --git a/yt/yql/tests/sql/suites/blocks/pg_tofrom.cfg b/yt/yql/tests/sql/suites/blocks/pg_tofrom.cfg
new file mode 100644
index 0000000000..eebfc3c8df
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_tofrom.cfg
@@ -0,0 +1 @@
+in Input input_tofrom_pg.txt
diff --git a/yt/yql/tests/sql/suites/blocks/pg_tofrom.sql b/yt/yql/tests/sql/suites/blocks/pg_tofrom.sql
new file mode 100644
index 0000000000..0b6724ffa7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_tofrom.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ ToPg(a), FromPg(b), FromPg(c), ToPg(d), ToPg(e), FromPg(f), ToPg(g)
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/pg_top_sort.cfg b/yt/yql/tests/sql/suites/blocks/pg_top_sort.cfg
new file mode 100644
index 0000000000..5356944180
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_top_sort.cfg
@@ -0,0 +1 @@
+in Input input_pg_arr.txt
diff --git a/yt/yql/tests/sql/suites/blocks/pg_top_sort.sql b/yt/yql/tests/sql/suites/blocks/pg_top_sort.sql
new file mode 100644
index 0000000000..0eabce49df
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/pg_top_sort.sql
@@ -0,0 +1,5 @@
+USE plato;
+SELECT
+ *
+FROM Input
+ORDER BY a,b desc,c desc LIMIT 3
diff --git a/yt/yql/tests/sql/suites/blocks/sort_one_asc.cfg b/yt/yql/tests/sql/suites/blocks/sort_one_asc.cfg
new file mode 100644
index 0000000000..346b6ff2a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/sort_one_asc.cfg
@@ -0,0 +1 @@
+in Input input_top.txt
diff --git a/yt/yql/tests/sql/suites/blocks/sort_one_asc.sql b/yt/yql/tests/sql/suites/blocks/sort_one_asc.sql
new file mode 100644
index 0000000000..311e4b871b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/sort_one_asc.sql
@@ -0,0 +1,7 @@
+USE plato;
+pragma yt.UseNativeDescSort;
+
+SELECT
+ subkey+0 as subkey1, value
+FROM Input
+ORDER BY subkey1, value;
diff --git a/yt/yql/tests/sql/suites/blocks/sort_one_desc.cfg b/yt/yql/tests/sql/suites/blocks/sort_one_desc.cfg
new file mode 100644
index 0000000000..346b6ff2a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/sort_one_desc.cfg
@@ -0,0 +1 @@
+in Input input_top.txt
diff --git a/yt/yql/tests/sql/suites/blocks/sort_one_desc.sql b/yt/yql/tests/sql/suites/blocks/sort_one_desc.sql
new file mode 100644
index 0000000000..154842bc63
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/sort_one_desc.sql
@@ -0,0 +1,7 @@
+USE plato;
+pragma yt.UseNativeDescSort;
+
+SELECT
+ subkey+0 as subkey1, value
+FROM Input
+ORDER BY subkey1, value desc;
diff --git a/yt/yql/tests/sql/suites/blocks/sort_two_asc.cfg b/yt/yql/tests/sql/suites/blocks/sort_two_asc.cfg
new file mode 100644
index 0000000000..346b6ff2a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/sort_two_asc.cfg
@@ -0,0 +1 @@
+in Input input_top.txt
diff --git a/yt/yql/tests/sql/suites/blocks/sort_two_asc.sql b/yt/yql/tests/sql/suites/blocks/sort_two_asc.sql
new file mode 100644
index 0000000000..a379cc27bf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/sort_two_asc.sql
@@ -0,0 +1,7 @@
+USE plato;
+pragma yt.UseNativeDescSort;
+
+SELECT
+ key, subkey+0 as subkey1, value
+FROM Input
+ORDER BY key, subkey1, value;
diff --git a/yt/yql/tests/sql/suites/blocks/sort_two_desc.cfg b/yt/yql/tests/sql/suites/blocks/sort_two_desc.cfg
new file mode 100644
index 0000000000..346b6ff2a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/sort_two_desc.cfg
@@ -0,0 +1 @@
+in Input input_top.txt
diff --git a/yt/yql/tests/sql/suites/blocks/sort_two_desc.sql b/yt/yql/tests/sql/suites/blocks/sort_two_desc.sql
new file mode 100644
index 0000000000..bbb338cf3b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/sort_two_desc.sql
@@ -0,0 +1,7 @@
+USE plato;
+pragma yt.UseNativeDescSort;
+
+SELECT
+ key, subkey+0 as subkey1, value
+FROM Input
+ORDER BY key desc, subkey1 desc, value;
diff --git a/yt/yql/tests/sql/suites/blocks/sort_two_mix.cfg b/yt/yql/tests/sql/suites/blocks/sort_two_mix.cfg
new file mode 100644
index 0000000000..346b6ff2a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/sort_two_mix.cfg
@@ -0,0 +1 @@
+in Input input_top.txt
diff --git a/yt/yql/tests/sql/suites/blocks/sort_two_mix.sql b/yt/yql/tests/sql/suites/blocks/sort_two_mix.sql
new file mode 100644
index 0000000000..9d7e8fd637
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/sort_two_mix.sql
@@ -0,0 +1,7 @@
+USE plato;
+pragma yt.UseNativeDescSort;
+
+SELECT
+ key, subkey+0 as subkey1, value
+FROM Input
+ORDER BY key asc, subkey1 desc, value;
diff --git a/yt/yql/tests/sql/suites/blocks/string_as_agg_key.cfg b/yt/yql/tests/sql/suites/blocks/string_as_agg_key.cfg
new file mode 100644
index 0000000000..84150a8314
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/string_as_agg_key.cfg
@@ -0,0 +1 @@
+in Input input_int32_string.txt
diff --git a/yt/yql/tests/sql/suites/blocks/string_as_agg_key.sql b/yt/yql/tests/sql/suites/blocks/string_as_agg_key.sql
new file mode 100644
index 0000000000..25ead30441
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/string_as_agg_key.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT DISTINCT value, value_utf FROM Input ORDER BY value;
+SELECT DISTINCT value, FROM Input ORDER BY value;
+
diff --git a/yt/yql/tests/sql/suites/blocks/string_filter.cfg b/yt/yql/tests/sql/suites/blocks/string_filter.cfg
new file mode 100644
index 0000000000..84150a8314
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/string_filter.cfg
@@ -0,0 +1 @@
+in Input input_int32_string.txt
diff --git a/yt/yql/tests/sql/suites/blocks/string_filter.sql b/yt/yql/tests/sql/suites/blocks/string_filter.sql
new file mode 100644
index 0000000000..2cb1054487
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/string_filter.sql
@@ -0,0 +1,7 @@
+USE plato;
+
+SELECT
+ key, key + subkey, value, value_utf
+FROM Input
+WHERE subkey != 4
+ORDER BY key
diff --git a/yt/yql/tests/sql/suites/blocks/string_len_and_cmp.cfg b/yt/yql/tests/sql/suites/blocks/string_len_and_cmp.cfg
new file mode 100644
index 0000000000..84150a8314
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/string_len_and_cmp.cfg
@@ -0,0 +1 @@
+in Input input_int32_string.txt
diff --git a/yt/yql/tests/sql/suites/blocks/string_len_and_cmp.sql b/yt/yql/tests/sql/suites/blocks/string_len_and_cmp.sql
new file mode 100644
index 0000000000..6450080bd5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/string_len_and_cmp.sql
@@ -0,0 +1,42 @@
+USE plato;
+
+SELECT
+ key,
+
+ value == value_utf,
+ value_utf != value,
+ value < value_utf,
+ value_utf <= value_utf,
+ value > value_utf,
+ value_utf >= value_utf,
+
+ value == 'foo',
+ 'foo' != value,
+ value < 'foo',
+ 'тест' <= value_utf,
+ value > 'foo',
+ 'проверка'u >= value_utf,
+
+ '' == value_utf,
+ '' != value,
+ '' < value_utf,
+ '' <= value_utf,
+ '' > value_utf,
+ '' >= value_utf,
+
+ value == ''u,
+ value_utf != ''u,
+ value < ''u,
+ value_utf <= ''u,
+ value > ''u,
+ value_utf >= ''u,
+
+ len(value),
+ len(value_utf),
+ len(''),
+ len(''u),
+ len('проверка'),
+ len('тест'u),
+
+FROM Input
+ORDER BY key
diff --git a/yt/yql/tests/sql/suites/blocks/string_pass.cfg b/yt/yql/tests/sql/suites/blocks/string_pass.cfg
new file mode 100644
index 0000000000..84150a8314
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/string_pass.cfg
@@ -0,0 +1 @@
+in Input input_int32_string.txt
diff --git a/yt/yql/tests/sql/suites/blocks/string_pass.sql b/yt/yql/tests/sql/suites/blocks/string_pass.sql
new file mode 100644
index 0000000000..e58e6abd97
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/string_pass.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+SELECT
+ key, key + subkey, value, value_utf
+FROM Input
+ORDER BY key
diff --git a/yt/yql/tests/sql/suites/blocks/string_with.cfg b/yt/yql/tests/sql/suites/blocks/string_with.cfg
new file mode 100644
index 0000000000..84150a8314
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/string_with.cfg
@@ -0,0 +1 @@
+in Input input_int32_string.txt
diff --git a/yt/yql/tests/sql/suites/blocks/string_with.sql b/yt/yql/tests/sql/suites/blocks/string_with.sql
new file mode 100644
index 0000000000..dc677c8c28
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/string_with.sql
@@ -0,0 +1,22 @@
+pragma AnsiLike;
+pragma warning("disable", "4510");
+
+USE plato;
+
+SELECT
+ key,
+
+ YQL::StringContains(value, value_utf),
+ YQL::StringContains(value, 'o'),
+ value like 'o',
+ YQL::StringContains('foobar'u, value),
+
+ StartsWith(value, value_utf),
+ EndsWith(value, 'ar'u),
+ StartsWith('тестпроверка'u, value_utf),
+ EndsWith('тестпроверка'u, value_utf),
+
+ value like 'ba%ar',
+ value_utf like 'про%ерка',
+FROM Input
+ORDER BY key
diff --git a/yt/yql/tests/sql/suites/blocks/struct_type.cfg b/yt/yql/tests/sql/suites/blocks/struct_type.cfg
new file mode 100644
index 0000000000..ed506aaf28
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/struct_type.cfg
@@ -0,0 +1 @@
+in Input input_struct.txt
diff --git a/yt/yql/tests/sql/suites/blocks/struct_type.sql b/yt/yql/tests/sql/suites/blocks/struct_type.sql
new file mode 100644
index 0000000000..942f54bf80
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/struct_type.sql
@@ -0,0 +1,8 @@
+USE plato;
+
+SELECT
+ key,
+ SOME(val) as someVal,
+FROM Input
+GROUP BY key
+ORDER BY key
diff --git a/yt/yql/tests/sql/suites/blocks/sub_uint64_opt2.cfg b/yt/yql/tests/sql/suites/blocks/sub_uint64_opt2.cfg
new file mode 100644
index 0000000000..46fee85c7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/sub_uint64_opt2.cfg
@@ -0,0 +1 @@
+in Input input_uint64_opt2.txt
diff --git a/yt/yql/tests/sql/suites/blocks/sub_uint64_opt2.sql b/yt/yql/tests/sql/suites/blocks/sub_uint64_opt2.sql
new file mode 100644
index 0000000000..28a74bab35
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/sub_uint64_opt2.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key-subkey,1000ul-key,subkey-1ul
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/top_sort_one_asc.cfg b/yt/yql/tests/sql/suites/blocks/top_sort_one_asc.cfg
new file mode 100644
index 0000000000..346b6ff2a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/top_sort_one_asc.cfg
@@ -0,0 +1 @@
+in Input input_top.txt
diff --git a/yt/yql/tests/sql/suites/blocks/top_sort_one_asc.sql b/yt/yql/tests/sql/suites/blocks/top_sort_one_asc.sql
new file mode 100644
index 0000000000..6db7f8ea15
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/top_sort_one_asc.sql
@@ -0,0 +1,7 @@
+USE plato;
+pragma yt.UseNativeDescSort;
+
+SELECT
+ subkey+0 as subkey1, value
+FROM Input
+ORDER BY subkey1, value limit 2;
diff --git a/yt/yql/tests/sql/suites/blocks/top_sort_one_desc.cfg b/yt/yql/tests/sql/suites/blocks/top_sort_one_desc.cfg
new file mode 100644
index 0000000000..346b6ff2a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/top_sort_one_desc.cfg
@@ -0,0 +1 @@
+in Input input_top.txt
diff --git a/yt/yql/tests/sql/suites/blocks/top_sort_one_desc.sql b/yt/yql/tests/sql/suites/blocks/top_sort_one_desc.sql
new file mode 100644
index 0000000000..d0f391964f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/top_sort_one_desc.sql
@@ -0,0 +1,7 @@
+USE plato;
+pragma yt.UseNativeDescSort;
+
+SELECT
+ subkey+0 as subkey1, value
+FROM Input
+ORDER BY subkey1 desc, value limit 2;
diff --git a/yt/yql/tests/sql/suites/blocks/top_sort_two_asc.cfg b/yt/yql/tests/sql/suites/blocks/top_sort_two_asc.cfg
new file mode 100644
index 0000000000..346b6ff2a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/top_sort_two_asc.cfg
@@ -0,0 +1 @@
+in Input input_top.txt
diff --git a/yt/yql/tests/sql/suites/blocks/top_sort_two_asc.sql b/yt/yql/tests/sql/suites/blocks/top_sort_two_asc.sql
new file mode 100644
index 0000000000..3e056b21be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/top_sort_two_asc.sql
@@ -0,0 +1,7 @@
+USE plato;
+pragma yt.UseNativeDescSort;
+
+SELECT
+ key, subkey+0 as subkey1, value
+FROM Input
+ORDER BY key, subkey1, value limit 2;
diff --git a/yt/yql/tests/sql/suites/blocks/top_sort_two_desc.cfg b/yt/yql/tests/sql/suites/blocks/top_sort_two_desc.cfg
new file mode 100644
index 0000000000..346b6ff2a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/top_sort_two_desc.cfg
@@ -0,0 +1 @@
+in Input input_top.txt
diff --git a/yt/yql/tests/sql/suites/blocks/top_sort_two_desc.sql b/yt/yql/tests/sql/suites/blocks/top_sort_two_desc.sql
new file mode 100644
index 0000000000..d8b6927e0a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/top_sort_two_desc.sql
@@ -0,0 +1,7 @@
+USE plato;
+pragma yt.UseNativeDescSort;
+
+SELECT
+ key, subkey+0 as subkey1, value
+FROM Input
+ORDER BY key desc, subkey1 desc, value limit 2;
diff --git a/yt/yql/tests/sql/suites/blocks/top_sort_two_mix.cfg b/yt/yql/tests/sql/suites/blocks/top_sort_two_mix.cfg
new file mode 100644
index 0000000000..346b6ff2a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/top_sort_two_mix.cfg
@@ -0,0 +1 @@
+in Input input_top.txt
diff --git a/yt/yql/tests/sql/suites/blocks/top_sort_two_mix.sql b/yt/yql/tests/sql/suites/blocks/top_sort_two_mix.sql
new file mode 100644
index 0000000000..067e45fde2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/top_sort_two_mix.sql
@@ -0,0 +1,7 @@
+USE plato;
+pragma yt.UseNativeDescSort;
+
+SELECT
+ key, subkey+0 as subkey1, value
+FROM Input
+ORDER BY key asc, subkey1 desc, value limit 2;
diff --git a/yt/yql/tests/sql/suites/blocks/tuple_nth.cfg b/yt/yql/tests/sql/suites/blocks/tuple_nth.cfg
new file mode 100644
index 0000000000..d2b033ce45
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/tuple_nth.cfg
@@ -0,0 +1 @@
+in Input input_int64.txt
diff --git a/yt/yql/tests/sql/suites/blocks/tuple_nth.sql b/yt/yql/tests/sql/suites/blocks/tuple_nth.sql
new file mode 100644
index 0000000000..74b1c9d800
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/tuple_nth.sql
@@ -0,0 +1,16 @@
+USE plato;
+
+insert into @tmp
+SELECT
+ key,
+ (subkey,key) as a,
+ (1,key) as b,
+ Just((subkey,key)) as c,
+ Just((Just(subkey),key)) as d,
+ Nothing(Tuple<Int32,Int32>?) as e,
+ Nothing(Tuple<Int32?,Int32>?) as f,
+FROM Input;
+
+commit;
+
+select a.0,a.1,b.0,b.1,c.0,c.1,d.0,d.1,e.0,e.1,f.0,f.1 from @tmp;
diff --git a/yt/yql/tests/sql/suites/blocks/tuple_type.cfg b/yt/yql/tests/sql/suites/blocks/tuple_type.cfg
new file mode 100644
index 0000000000..2c1468d47f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/tuple_type.cfg
@@ -0,0 +1 @@
+in Input input_tuple.txt
diff --git a/yt/yql/tests/sql/suites/blocks/tuple_type.sql b/yt/yql/tests/sql/suites/blocks/tuple_type.sql
new file mode 100644
index 0000000000..e1f04fe2de
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/tuple_type.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ key+1u, (3, 4.0), value
+FROM Input
diff --git a/yt/yql/tests/sql/suites/blocks/type_and_callable_stats.cfg b/yt/yql/tests/sql/suites/blocks/type_and_callable_stats.cfg
new file mode 100644
index 0000000000..6a38002573
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/type_and_callable_stats.cfg
@@ -0,0 +1,4 @@
+with_final_result_issues
+in Input input_strings.txt
+udf string_udf
+udf re2_udf
diff --git a/yt/yql/tests/sql/suites/blocks/type_and_callable_stats.sql b/yt/yql/tests/sql/suites/blocks/type_and_callable_stats.sql
new file mode 100644
index 0000000000..5357170adb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/blocks/type_and_callable_stats.sql
@@ -0,0 +1,16 @@
+pragma BlockEngine='force';
+
+USE plato;
+$match = Re2::Match(@@\d+@@);
+$grep = Re2::Grep('911');
+
+SELECT
+ key,
+ String::EscapeC(value) as ok1,
+ $match(key) as no_block_udf1,
+ $grep(key) as no_block_udf2,
+ AsList(key) as no_block_list,
+ AsSet(key) as no_block_set_and_void,
+ cast(key as Double) as no_block_cast,
+ AsTuple(key, DyNumber("123")) as no_block_dynumber,
+FROM Input;
diff --git a/yt/yql/tests/sql/suites/case/case_multi_val.sql b/yt/yql/tests/sql/suites/case/case_multi_val.sql
new file mode 100644
index 0000000000..2a70a03167
--- /dev/null
+++ b/yt/yql/tests/sql/suites/case/case_multi_val.sql
@@ -0,0 +1 @@
+select key, subkey, case value when "jar" then "JAR" when "foo" then "FOO" else value end as value from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/case/case_size_eq_cast.sql b/yt/yql/tests/sql/suites/case/case_size_eq_cast.sql
new file mode 100644
index 0000000000..e5c5be7605
--- /dev/null
+++ b/yt/yql/tests/sql/suites/case/case_size_eq_cast.sql
@@ -0,0 +1 @@
+select key, subkey, case length(value) when cast(3 as smallint) then "JAR" else value end as value from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/case/case_then_else.sql b/yt/yql/tests/sql/suites/case/case_then_else.sql
new file mode 100644
index 0000000000..5bdda9497f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/case/case_then_else.sql
@@ -0,0 +1 @@
+select case when key != subkey then subkey else value end from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/case/case_val_then_else.sql b/yt/yql/tests/sql/suites/case/case_val_then_else.sql
new file mode 100644
index 0000000000..78ec7d4080
--- /dev/null
+++ b/yt/yql/tests/sql/suites/case/case_val_then_else.sql
@@ -0,0 +1 @@
+select case value when key then subkey else value end from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/case/case_val_when_then.sql b/yt/yql/tests/sql/suites/case/case_val_when_then.sql
new file mode 100644
index 0000000000..55b6740500
--- /dev/null
+++ b/yt/yql/tests/sql/suites/case/case_val_when_then.sql
@@ -0,0 +1 @@
+select key, subkey, case value when subkey then "WAT" else value end as value from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/case/case_when_then.sql b/yt/yql/tests/sql/suites/case/case_when_then.sql
new file mode 100644
index 0000000000..5d38925caa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/case/case_when_then.sql
@@ -0,0 +1 @@
+select key, subkey, case when value != subkey then "WAT" else value end as value from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/case/default.cfg b/yt/yql/tests/sql/suites/case/default.cfg
new file mode 100644
index 0000000000..a1f7a5a9b7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/case/default.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/coalesce/coalesce.cfg b/yt/yql/tests/sql/suites/coalesce/coalesce.cfg
new file mode 100644
index 0000000000..5640285809
--- /dev/null
+++ b/yt/yql/tests/sql/suites/coalesce/coalesce.cfg
@@ -0,0 +1 @@
+in Input input_coalesce.txt
diff --git a/yt/yql/tests/sql/suites/coalesce/coalesce.sql b/yt/yql/tests/sql/suites/coalesce/coalesce.sql
new file mode 100644
index 0000000000..92c4778505
--- /dev/null
+++ b/yt/yql/tests/sql/suites/coalesce/coalesce.sql
@@ -0,0 +1 @@
+select coalesce(cast(value as int), 999) from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/coalesce/coalesce_few_opt.cfg b/yt/yql/tests/sql/suites/coalesce/coalesce_few_opt.cfg
new file mode 100644
index 0000000000..64b3f61710
--- /dev/null
+++ b/yt/yql/tests/sql/suites/coalesce/coalesce_few_opt.cfg
@@ -0,0 +1 @@
+in Input optional.txt
diff --git a/yt/yql/tests/sql/suites/coalesce/coalesce_few_opt.sql b/yt/yql/tests/sql/suites/coalesce/coalesce_few_opt.sql
new file mode 100644
index 0000000000..1e2d541f60
--- /dev/null
+++ b/yt/yql/tests/sql/suites/coalesce/coalesce_few_opt.sql
@@ -0,0 +1,24 @@
+select
+ 'first',
+ coalesce(first_null, 22),
+ coalesce(first_num, 33),
+ coalesce(coalesce(first_null, 122), 42),
+ coalesce(coalesce(first_num, 133), 43),
+ coalesce(coalesce(coalesce(first_null, 222), 442), 100500),
+ coalesce(coalesce(coalesce(first_num, 233), 443), 100501),
+ 'second',
+ coalesce(second_null, 22),
+ coalesce(second_num, 33),
+ coalesce(coalesce(second_null, 122), 42),
+ coalesce(coalesce(second_num, 133), 43),
+ coalesce(coalesce(coalesce(second_null, 222), 442), 100500),
+ coalesce(coalesce(coalesce(second_num, 233), 443), 100501),
+ 'third',
+ coalesce(third_null, 22),
+ coalesce(third_num, 33),
+ coalesce(coalesce(third_null, 122), 42),
+ coalesce(coalesce(third_num, 133), 43),
+ coalesce(coalesce(coalesce(third_null, 222), 442), 100500),
+ coalesce(coalesce(coalesce(third_num, 233), 443), 100501),
+ 'end'
+from plato.Input;
diff --git a/yt/yql/tests/sql/suites/coalesce/coalesce_few_real.sql b/yt/yql/tests/sql/suites/coalesce/coalesce_few_real.sql
new file mode 100644
index 0000000000..0eebc69cc2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/coalesce/coalesce_few_real.sql
@@ -0,0 +1,17 @@
+/* postgres can not */
+$optDuoFloat=Just(Just(cast(2.71 as float)));
+$optDuoDouble=Just(Just(cast(3.14 as double)));
+$optDuoFloatN=Just(Just(cast(null as float)));
+$optDuoDoubleN=Just(Just(cast(null as double)));
+
+select
+ ($optDuoFloat ?? 0) ?? 1,
+ ($optDuoDouble ?? 41) ?? 42,
+ ($optDuoFloatN ?? 0) ?? 1.,
+ ($optDuoDoubleN ?? 41.) ?? 42,
+ ($optDuoFloatN ?? cast(40.1 as float)) ?? cast(40.2 as float),
+ ($optDuoDoubleN ?? cast(40.1 as float)) ?? cast(40.2 as float),
+ (($optDuoFloatN ?? 0) ?? 1.) ?? 3,
+ (($optDuoDoubleN ?? 41) ?? 42) ?? 4,
+ 'end'
+from plato.Input;
diff --git a/yt/yql/tests/sql/suites/coalesce/coalesce_sugar.sql b/yt/yql/tests/sql/suites/coalesce/coalesce_sugar.sql
new file mode 100644
index 0000000000..c9d2442ee8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/coalesce/coalesce_sugar.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+$data = (select key, cast(key as Int64)/100 as eval from plato.Input);
+select case when eval < 5 then eval else cast(Null as Int64) end ?? -1, key from $data;
diff --git a/yt/yql/tests/sql/suites/coalesce/default.cfg b/yt/yql/tests/sql/suites/coalesce/default.cfg
new file mode 100644
index 0000000000..a1f7a5a9b7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/coalesce/default.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/coalesce/optional.txt.attr b/yt/yql/tests/sql/suites/coalesce/optional.txt.attr
new file mode 100644
index 0000000000..7962199d3e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/coalesce/optional.txt.attr
@@ -0,0 +1,85 @@
+{
+ "_yql_row_spec" = {"Type" = [
+ "StructType";
+ [
+ [
+ "first_null";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ]
+ ];
+ [
+ "first_num";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ]
+ ];
+ [
+ "second_null";
+ [
+ "OptionalType";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ]
+ ]
+ ];
+ [
+ "second_num";
+ [
+ "OptionalType";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ]
+ ]
+ ];
+ [
+ "third_null";
+ [
+ "OptionalType";
+ [
+ "OptionalType";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ]
+ ]
+ ]
+ ];
+ [
+ "third_num";
+ [
+ "OptionalType";
+ [
+ "OptionalType";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]};
+}
diff --git a/yt/yql/tests/sql/suites/column_group/default.cfg b/yt/yql/tests/sql/suites/column_group/default.cfg
new file mode 100644
index 0000000000..ef47dfff66
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/default.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+providers yt
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/groups-lookup.cfg b/yt/yql/tests/sql/suites/column_group/groups-lookup.cfg
new file mode 100644
index 0000000000..5bd531763a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/groups-lookup.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
+pragma yt.OptimizeFor="lookup"
diff --git a/yt/yql/tests/sql/suites/column_group/groups-max.cfg b/yt/yql/tests/sql/suites/column_group/groups-max.cfg
new file mode 100644
index 0000000000..dd3af3af12
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/groups-max.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
+pragma yt.MaxColumnGroups="2"
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/groups-perusage.cfg b/yt/yql/tests/sql/suites/column_group/groups-perusage.cfg
new file mode 100644
index 0000000000..be63fb17e4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/groups-perusage.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/groups-single.cfg b/yt/yql/tests/sql/suites/column_group/groups-single.cfg
new file mode 100644
index 0000000000..0ccae305ff
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/groups-single.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+providers yt
+pragma yt.ColumnGroupMode="single"
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/groups.sql b/yt/yql/tests/sql/suites/column_group/groups.sql
new file mode 100644
index 0000000000..fe8ebf9ce9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/groups.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+$i = select * from Input where a > "a";
+
+select a,b,c,d from $i;
+select c,d,e,f from $i;
diff --git a/yt/yql/tests/sql/suites/column_group/hint-disable.cfg b/yt/yql/tests/sql/suites/column_group/hint-disable.cfg
new file mode 100644
index 0000000000..eb97f5b81d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint-disable.cfg
@@ -0,0 +1,8 @@
+in Input input.txt
+out Output1 output1.txt
+out Output2 output2.txt
+out Output3 output3.txt
+out Output4 output4.txt
+providers yt
+pragma yt.ColumnGroupMode="disable"
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/hint-perusage.cfg b/yt/yql/tests/sql/suites/column_group/hint-perusage.cfg
new file mode 100644
index 0000000000..c426193038
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint-perusage.cfg
@@ -0,0 +1,8 @@
+in Input input.txt
+out Output1 output1.txt
+out Output2 output2.txt
+out Output3 output3.txt
+out Output4 output4.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/hint-single.cfg b/yt/yql/tests/sql/suites/column_group/hint-single.cfg
new file mode 100644
index 0000000000..2aab65b91e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint-single.cfg
@@ -0,0 +1,8 @@
+in Input input.txt
+out Output1 output1.txt
+out Output2 output2.txt
+out Output3 output3.txt
+out Output4 output4.txt
+providers yt
+pragma yt.ColumnGroupMode="single"
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/hint.sql b/yt/yql/tests/sql/suites/column_group/hint.sql
new file mode 100644
index 0000000000..5a04cc74f0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint.sql
@@ -0,0 +1,20 @@
+USE plato;
+
+$i1 = select * from Input where a > "a"; -- several publish consumers with same groups
+$i2 = select * from Input where a > "a1"; -- several publish consumers with different groups
+$i3 = select * from Input where a < "a2"; -- several consumers including publish
+$i4 = select * from Input where a != "a"; -- several publish consumers with and without groups
+
+-- test column group spec normalization
+insert into Output1 with column_groups="{g1=[a;b;c];def=#}" select * from $i1;
+insert into Output1 with column_groups="{def=#;g1=[c;a;b];}" select * from $i2;
+
+insert into Output2 with column_groups="{def=#}" select * from $i2;
+insert into Output2 with column_groups="{def=#}" select * from $i3;
+
+insert into Output3 with column_groups="{g1=[a;b;c];def=#}" select * from $i1;
+insert into Output3 with column_groups="{g1=[a;b;c];def=#}" select * from $i4;
+
+insert into Output4 select * from $i4;
+
+select a,b,c,d from $i3;
diff --git a/yt/yql/tests/sql/suites/column_group/hint_anon-disable.cfg b/yt/yql/tests/sql/suites/column_group/hint_anon-disable.cfg
new file mode 100644
index 0000000000..648ff62ddc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_anon-disable.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+providers yt
+pragma yt.ColumnGroupMode="disable"
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/hint_anon-perusage.cfg b/yt/yql/tests/sql/suites/column_group/hint_anon-perusage.cfg
new file mode 100644
index 0000000000..be63fb17e4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_anon-perusage.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/hint_anon-single.cfg b/yt/yql/tests/sql/suites/column_group/hint_anon-single.cfg
new file mode 100644
index 0000000000..0ccae305ff
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_anon-single.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+providers yt
+pragma yt.ColumnGroupMode="single"
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/hint_anon.sql b/yt/yql/tests/sql/suites/column_group/hint_anon.sql
new file mode 100644
index 0000000000..b1d85f2d15
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_anon.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+$i = select * from Input where a > "a";
+
+select a,b,c,d from $i;
+select c,d,e,f from $i;
+
+-- Forces single group for $i
+insert into @tmp select * from $i;
diff --git a/yt/yql/tests/sql/suites/column_group/hint_anon_groups-disable.cfg b/yt/yql/tests/sql/suites/column_group/hint_anon_groups-disable.cfg
new file mode 100644
index 0000000000..648ff62ddc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_anon_groups-disable.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+providers yt
+pragma yt.ColumnGroupMode="disable"
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/hint_anon_groups-perusage.cfg b/yt/yql/tests/sql/suites/column_group/hint_anon_groups-perusage.cfg
new file mode 100644
index 0000000000..be63fb17e4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_anon_groups-perusage.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/hint_anon_groups-single.cfg b/yt/yql/tests/sql/suites/column_group/hint_anon_groups-single.cfg
new file mode 100644
index 0000000000..0ccae305ff
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_anon_groups-single.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+providers yt
+pragma yt.ColumnGroupMode="single"
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/hint_anon_groups.sql b/yt/yql/tests/sql/suites/column_group/hint_anon_groups.sql
new file mode 100644
index 0000000000..384dbcfd3b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_anon_groups.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+$i = select * from Input where a > "a";
+
+select a,b,c,d from $i;
+select c,d,e,f from $i;
+
+-- Forces specific group for $i
+insert into @tmp with column_groups="{grp=[b;c;d]}" select * from $i;
diff --git a/yt/yql/tests/sql/suites/column_group/hint_append_fail.cfg b/yt/yql/tests/sql/suites/column_group/hint_append_fail.cfg
new file mode 100644
index 0000000000..f508c61b27
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_append_fail.cfg
@@ -0,0 +1,5 @@
+xfail
+in Input input.txt
+out Output input.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
diff --git a/yt/yql/tests/sql/suites/column_group/hint_append_fail.sql b/yt/yql/tests/sql/suites/column_group/hint_append_fail.sql
new file mode 100644
index 0000000000..720052d6e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_append_fail.sql
@@ -0,0 +1,6 @@
+/* custom error:Insert with "column_groups" to existing table is not allowed*/
+USE plato;
+
+insert into Output
+with column_groups="{g1=[a;b];def=#}"
+select * from Input;
diff --git a/yt/yql/tests/sql/suites/column_group/hint_diff_grp_fail.cfg b/yt/yql/tests/sql/suites/column_group/hint_diff_grp_fail.cfg
new file mode 100644
index 0000000000..f5c8eefa7e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_diff_grp_fail.cfg
@@ -0,0 +1,5 @@
+xfail
+in Input input.txt
+out Output output.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
diff --git a/yt/yql/tests/sql/suites/column_group/hint_diff_grp_fail.sql b/yt/yql/tests/sql/suites/column_group/hint_diff_grp_fail.sql
new file mode 100644
index 0000000000..f47f4f81f9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_diff_grp_fail.sql
@@ -0,0 +1,10 @@
+/* custom error:All appends within the same commit should have the equal "column_groups" value*/
+USE plato;
+
+insert into Output
+with column_groups="{g1=[a;b];def=#}"
+select * from Input;
+
+insert into Output
+with column_groups="{g1=[c;d];def=#}"
+select * from Input;
diff --git a/yt/yql/tests/sql/suites/column_group/hint_dup_col_fail.cfg b/yt/yql/tests/sql/suites/column_group/hint_dup_col_fail.cfg
new file mode 100644
index 0000000000..f5c8eefa7e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_dup_col_fail.cfg
@@ -0,0 +1,5 @@
+xfail
+in Input input.txt
+out Output output.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
diff --git a/yt/yql/tests/sql/suites/column_group/hint_dup_col_fail.sql b/yt/yql/tests/sql/suites/column_group/hint_dup_col_fail.sql
new file mode 100644
index 0000000000..1acaba9f6d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_dup_col_fail.sql
@@ -0,0 +1,7 @@
+/* custom error:Duplicate column "a"*/
+USE plato;
+
+-- duplicate column
+insert into Output
+with column_groups="{g1=[a;a;b];def=#}"
+select * from Input;
diff --git a/yt/yql/tests/sql/suites/column_group/hint_dup_def_fail.cfg b/yt/yql/tests/sql/suites/column_group/hint_dup_def_fail.cfg
new file mode 100644
index 0000000000..f5c8eefa7e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_dup_def_fail.cfg
@@ -0,0 +1,5 @@
+xfail
+in Input input.txt
+out Output output.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
diff --git a/yt/yql/tests/sql/suites/column_group/hint_dup_def_fail.sql b/yt/yql/tests/sql/suites/column_group/hint_dup_def_fail.sql
new file mode 100644
index 0000000000..8f0db30396
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_dup_def_fail.sql
@@ -0,0 +1,7 @@
+/* custom error:Not more than one group should have # value: "def2"*/
+USE plato;
+
+-- duplicate column
+insert into Output
+with column_groups="{def1=#;def2=#}"
+select * from Input;
diff --git a/yt/yql/tests/sql/suites/column_group/hint_empty_grp_fail.cfg b/yt/yql/tests/sql/suites/column_group/hint_empty_grp_fail.cfg
new file mode 100644
index 0000000000..f5c8eefa7e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_empty_grp_fail.cfg
@@ -0,0 +1,5 @@
+xfail
+in Input input.txt
+out Output output.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
diff --git a/yt/yql/tests/sql/suites/column_group/hint_empty_grp_fail.sql b/yt/yql/tests/sql/suites/column_group/hint_empty_grp_fail.sql
new file mode 100644
index 0000000000..521675ee5d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_empty_grp_fail.sql
@@ -0,0 +1,7 @@
+/* custom error:Expected list with at least two columns, group: "g1"*/
+USE plato;
+
+-- empty group
+insert into Output
+with column_groups="{g1=[];def=#}"
+select * from Input;
diff --git a/yt/yql/tests/sql/suites/column_group/hint_non_lst_yson_fail.cfg b/yt/yql/tests/sql/suites/column_group/hint_non_lst_yson_fail.cfg
new file mode 100644
index 0000000000..f5c8eefa7e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_non_lst_yson_fail.cfg
@@ -0,0 +1,5 @@
+xfail
+in Input input.txt
+out Output output.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
diff --git a/yt/yql/tests/sql/suites/column_group/hint_non_lst_yson_fail.sql b/yt/yql/tests/sql/suites/column_group/hint_non_lst_yson_fail.sql
new file mode 100644
index 0000000000..00d0a444b5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_non_lst_yson_fail.sql
@@ -0,0 +1,7 @@
+/* custom error:Expected list value, group: "g1"*/
+USE plato;
+
+-- bad yson
+insert into Output
+with column_groups=@@{g1="a"}@@
+select * from Input;
diff --git a/yt/yql/tests/sql/suites/column_group/hint_non_map_yson_fail.cfg b/yt/yql/tests/sql/suites/column_group/hint_non_map_yson_fail.cfg
new file mode 100644
index 0000000000..f5c8eefa7e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_non_map_yson_fail.cfg
@@ -0,0 +1,5 @@
+xfail
+in Input input.txt
+out Output output.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
diff --git a/yt/yql/tests/sql/suites/column_group/hint_non_map_yson_fail.sql b/yt/yql/tests/sql/suites/column_group/hint_non_map_yson_fail.sql
new file mode 100644
index 0000000000..58b413af20
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_non_map_yson_fail.sql
@@ -0,0 +1,7 @@
+/* custom error:Expected Yson map, got: list_node*/
+USE plato;
+
+-- bad yson
+insert into Output
+with column_groups="[abc]"
+select * from Input;
diff --git a/yt/yql/tests/sql/suites/column_group/hint_non_str_yson_fail.cfg b/yt/yql/tests/sql/suites/column_group/hint_non_str_yson_fail.cfg
new file mode 100644
index 0000000000..f5c8eefa7e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_non_str_yson_fail.cfg
@@ -0,0 +1,5 @@
+xfail
+in Input input.txt
+out Output output.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
diff --git a/yt/yql/tests/sql/suites/column_group/hint_non_str_yson_fail.sql b/yt/yql/tests/sql/suites/column_group/hint_non_str_yson_fail.sql
new file mode 100644
index 0000000000..8ed51c1871
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_non_str_yson_fail.sql
@@ -0,0 +1,7 @@
+/* custom error:Expected string value in list, found int64_node, group: "g1"*/
+USE plato;
+
+-- bad yson
+insert into Output
+with column_groups="{g1=[3;a]}"
+select * from Input;
diff --git a/yt/yql/tests/sql/suites/column_group/hint_non_yson_fail.cfg b/yt/yql/tests/sql/suites/column_group/hint_non_yson_fail.cfg
new file mode 100644
index 0000000000..f5c8eefa7e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_non_yson_fail.cfg
@@ -0,0 +1,5 @@
+xfail
+in Input input.txt
+out Output output.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
diff --git a/yt/yql/tests/sql/suites/column_group/hint_non_yson_fail.sql b/yt/yql/tests/sql/suites/column_group/hint_non_yson_fail.sql
new file mode 100644
index 0000000000..209aef0e43
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_non_yson_fail.sql
@@ -0,0 +1,7 @@
+/* custom error:Unexpected '!' while parsing node*/
+USE plato;
+
+-- bad yson
+insert into Output
+with column_groups="!"
+select * from Input;
diff --git a/yt/yql/tests/sql/suites/column_group/hint_short_grp_fail.cfg b/yt/yql/tests/sql/suites/column_group/hint_short_grp_fail.cfg
new file mode 100644
index 0000000000..f5c8eefa7e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_short_grp_fail.cfg
@@ -0,0 +1,5 @@
+xfail
+in Input input.txt
+out Output output.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
diff --git a/yt/yql/tests/sql/suites/column_group/hint_short_grp_fail.sql b/yt/yql/tests/sql/suites/column_group/hint_short_grp_fail.sql
new file mode 100644
index 0000000000..895f4cbd61
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_short_grp_fail.sql
@@ -0,0 +1,7 @@
+/* custom error:Expected list with at least two columns, group: "g1"*/
+USE plato;
+
+-- too short group
+insert into Output
+with column_groups="{g1=[a];def=#}"
+select * from Input;
diff --git a/yt/yql/tests/sql/suites/column_group/hint_unk_col_fail.cfg b/yt/yql/tests/sql/suites/column_group/hint_unk_col_fail.cfg
new file mode 100644
index 0000000000..f5c8eefa7e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_unk_col_fail.cfg
@@ -0,0 +1,5 @@
+xfail
+in Input input.txt
+out Output output.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
diff --git a/yt/yql/tests/sql/suites/column_group/hint_unk_col_fail.sql b/yt/yql/tests/sql/suites/column_group/hint_unk_col_fail.sql
new file mode 100644
index 0000000000..64a49820a9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/hint_unk_col_fail.sql
@@ -0,0 +1,8 @@
+/* custom error:Column group "g1" refers to unknown column "l"*/
+USE plato;
+
+-- unknown column
+insert into Output
+with column_groups="{g1=[l;b;c];def=#}"
+select * from Input;
+
diff --git a/yt/yql/tests/sql/suites/column_group/input.txt.attr b/yt/yql/tests/sql/suites/column_group/input.txt.attr
new file mode 100644
index 0000000000..b337b62c6b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/input.txt.attr
@@ -0,0 +1,10 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["a";["DataType";"String"]];
+ ["b";["DataType";"String"]];
+ ["c";["DataType";"String"]];
+ ["d";["DataType";"String"]];
+ ["e";["DataType";"String"]];
+ ["f";["DataType";"String"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/column_group/insert_diff_groups1_fail.cfg b/yt/yql/tests/sql/suites/column_group/insert_diff_groups1_fail.cfg
new file mode 100644
index 0000000000..351cce8968
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/insert_diff_groups1_fail.cfg
@@ -0,0 +1,4 @@
+xfail
+in Input input.txt
+providers yt
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/insert_diff_groups1_fail.sql b/yt/yql/tests/sql/suites/column_group/insert_diff_groups1_fail.sql
new file mode 100644
index 0000000000..e962ccf194
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/insert_diff_groups1_fail.sql
@@ -0,0 +1,15 @@
+/* custom error:Insert with different "column_groups" to existing table is not allowed*/
+USE plato;
+
+pragma yt.ColumnGroupMode="perusage";
+
+$s1 = select * from Input where a != "";
+$s2 = select * from Input where a > "a1";
+
+insert into @a
+select * from $s1;
+
+commit;
+
+insert into @a with column_groups="{a=#}"
+select * from $s2;
diff --git a/yt/yql/tests/sql/suites/column_group/insert_diff_groups2_fail.cfg b/yt/yql/tests/sql/suites/column_group/insert_diff_groups2_fail.cfg
new file mode 100644
index 0000000000..ab4dec69ea
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/insert_diff_groups2_fail.cfg
@@ -0,0 +1,5 @@
+xfail
+in Input input.txt
+out Output output.txt
+providers yt
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/insert_diff_groups2_fail.sql b/yt/yql/tests/sql/suites/column_group/insert_diff_groups2_fail.sql
new file mode 100644
index 0000000000..18ef3246fa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/insert_diff_groups2_fail.sql
@@ -0,0 +1,15 @@
+/* custom error:Insert with different "column_groups" to existing table is not allowed*/
+USE plato;
+
+pragma yt.ColumnGroupMode="perusage";
+
+$s1 = select * from Input where a != "";
+$s2 = select * from Input where a > "a1";
+
+insert into Output
+select * from $s1;
+
+commit;
+
+insert into Output with column_groups="{a=#}"
+select * from $s2;
diff --git a/yt/yql/tests/sql/suites/column_group/insert_diff_groups3_fail.cfg b/yt/yql/tests/sql/suites/column_group/insert_diff_groups3_fail.cfg
new file mode 100644
index 0000000000..356863d2ae
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/insert_diff_groups3_fail.cfg
@@ -0,0 +1,5 @@
+xfail
+in Input input.txt
+out Output input.txt
+providers yt
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/insert_diff_groups3_fail.sql b/yt/yql/tests/sql/suites/column_group/insert_diff_groups3_fail.sql
new file mode 100644
index 0000000000..1e0a1a4734
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/insert_diff_groups3_fail.sql
@@ -0,0 +1,7 @@
+/* custom error:Insert with "column_groups" to existing table is not allowed*/
+USE plato;
+
+pragma yt.ColumnGroupMode="perusage";
+
+insert into Output with column_groups="{a=#}"
+select * from Input where a != "";
diff --git a/yt/yql/tests/sql/suites/column_group/length-perusage.cfg b/yt/yql/tests/sql/suites/column_group/length-perusage.cfg
new file mode 100644
index 0000000000..eaefb06bd5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/length-perusage.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+out Output output.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/length-single.cfg b/yt/yql/tests/sql/suites/column_group/length-single.cfg
new file mode 100644
index 0000000000..c48072ee21
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/length-single.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+out Output output.txt
+providers yt
+pragma yt.ColumnGroupMode="single"
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/length.sql b/yt/yql/tests/sql/suites/column_group/length.sql
new file mode 100644
index 0000000000..85ef54124a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/length.sql
@@ -0,0 +1,7 @@
+USE plato;
+
+$i = select * from Input where a > "a";
+
+select a,b,c,d from $i;
+select c,d,e,f from $i;
+select count(*) from $i;
diff --git a/yt/yql/tests/sql/suites/column_group/many_inserts.cfg b/yt/yql/tests/sql/suites/column_group/many_inserts.cfg
new file mode 100644
index 0000000000..4a98bc6feb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/many_inserts.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+out Output output.txt
+providers yt
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/many_inserts.sql b/yt/yql/tests/sql/suites/column_group/many_inserts.sql
new file mode 100644
index 0000000000..b0ead4fad6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/many_inserts.sql
@@ -0,0 +1,32 @@
+USE plato;
+
+pragma yt.ColumnGroupMode="perusage";
+
+$s1 = select * from Input where a != "";
+$s2 = select * from Input where a > "a1";
+
+insert into @a with column_groups="{a=#}"
+select * from $s1;
+
+insert into @b
+select * from $s1;
+
+insert into @c
+select * from $s1;
+
+insert into Output with column_groups="{a=#}"
+select * from $s1;
+
+commit;
+
+insert into @a with column_groups="{a=#}"
+select * from $s2;
+
+insert into @b
+select * from $s2;
+
+insert into @c with column_groups="{default=#}"
+select * from $s2;
+
+insert into Output with column_groups="{a=#}"
+select * from $s2;
diff --git a/yt/yql/tests/sql/suites/column_group/min_group.sql b/yt/yql/tests/sql/suites/column_group/min_group.sql
new file mode 100644
index 0000000000..f99d380f15
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/min_group.sql
@@ -0,0 +1,8 @@
+USE plato;
+pragma yt.MinColumnGroupSize="3";
+pragma yt.ColumnGroupMode="perusage";
+
+$i = select * from Input where a > "a";
+
+select a,b from $i;
+select c,d,e,f from $i;
diff --git a/yt/yql/tests/sql/suites/column_group/publish-perusage.cfg b/yt/yql/tests/sql/suites/column_group/publish-perusage.cfg
new file mode 100644
index 0000000000..eaefb06bd5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/publish-perusage.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+out Output output.txt
+providers yt
+pragma yt.ColumnGroupMode="perusage"
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/publish-single.cfg b/yt/yql/tests/sql/suites/column_group/publish-single.cfg
new file mode 100644
index 0000000000..c48072ee21
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/publish-single.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+out Output output.txt
+providers yt
+pragma yt.ColumnGroupMode="single"
+pragma yt.OptimizeFor="scan"
diff --git a/yt/yql/tests/sql/suites/column_group/publish.sql b/yt/yql/tests/sql/suites/column_group/publish.sql
new file mode 100644
index 0000000000..d9f7b9e855
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_group/publish.sql
@@ -0,0 +1,8 @@
+USE plato;
+
+$i = select * from Input where a > "a";
+
+select a,b,c,d from $i;
+select c,d,e,f from $i;
+
+insert into Output select * from $i;
diff --git a/yt/yql/tests/sql/suites/column_order/align_publish.cfg b/yt/yql/tests/sql/suites/column_order/align_publish.cfg
new file mode 100644
index 0000000000..9b85bd0ae8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/align_publish.cfg
@@ -0,0 +1 @@
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/column_order/align_publish.sql b/yt/yql/tests/sql/suites/column_order/align_publish.sql
new file mode 100644
index 0000000000..7c56456e8c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/align_publish.sql
@@ -0,0 +1,10 @@
+PRAGMA OrderedColumns;
+USE plato;
+
+INSERT INTO @table1 WITH TRUNCATE (a, c, b) VALUES ('1', '2', '3');
+COMMIT;
+
+INSERT INTO Output WITH TRUNCATE
+SELECT x.c AS d, x.b AS b, json('{}') AS a
+FROM @table1 AS x
+ORDER BY d
diff --git a/yt/yql/tests/sql/suites/column_order/align_publish_native.cfg b/yt/yql/tests/sql/suites/column_order/align_publish_native.cfg
new file mode 100644
index 0000000000..9b85bd0ae8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/align_publish_native.cfg
@@ -0,0 +1 @@
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/column_order/align_publish_native.sql b/yt/yql/tests/sql/suites/column_order/align_publish_native.sql
new file mode 100644
index 0000000000..f483b40019
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/align_publish_native.sql
@@ -0,0 +1,12 @@
+/* ignore runonopt plan diff */
+PRAGMA OrderedColumns;
+PRAGMA yt.UseNativeYtTypes;
+USE plato;
+
+INSERT INTO @table1 WITH TRUNCATE (a, c, b) VALUES ('1', '2', '3');
+COMMIT;
+
+INSERT INTO Output WITH TRUNCATE
+SELECT x.c AS d, x.b AS b, json('{}') AS a
+FROM @table1 AS x
+ORDER BY d
diff --git a/yt/yql/tests/sql/suites/column_order/default.cfg b/yt/yql/tests/sql/suites/column_order/default.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/default.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/column_order/input.txt.attr b/yt/yql/tests/sql/suites/column_order/input.txt.attr
new file mode 100644
index 0000000000..88356bebbc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/input.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["value";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["key";["DataType";"String"]]
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/column_order/insert.cfg b/yt/yql/tests/sql/suites/column_order/insert.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/insert.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/column_order/insert.sql b/yt/yql/tests/sql/suites/column_order/insert.sql
new file mode 100644
index 0000000000..5367b6913b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/insert.sql
@@ -0,0 +1,26 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+
+insert into Input
+select key, subkey, value from Input;
+
+commit;
+
+select * from Input order by subkey, key;
+
+insert into Output
+select * from Input order by subkey, key;
+
+commit;
+
+select * from Output order by subkey, key;
+
+insert into Output with truncate
+select key,value,subkey from Input order by subkey, key;
+
+select * from Output order by subkey, key;
+commit;
+select * from Output order by subkey, key;
+
diff --git a/yt/yql/tests/sql/suites/column_order/insert_reorder_without_columnorder.cfg b/yt/yql/tests/sql/suites/column_order/insert_reorder_without_columnorder.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/insert_reorder_without_columnorder.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/column_order/insert_reorder_without_columnorder.sql b/yt/yql/tests/sql/suites/column_order/insert_reorder_without_columnorder.sql
new file mode 100644
index 0000000000..0b9f6613ac
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/insert_reorder_without_columnorder.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+use plato;
+pragma DisableOrderedColumns;
+pragma warning("disable", "4517");
+
+$Group = 1u;
+
+INSERT INTO Output(Group, Name)
+SELECT
+ $Group,
+ value
+FROM Input
+WHERE key = "150"
+LIMIT 1;
diff --git a/yt/yql/tests/sql/suites/column_order/insert_tmp.sql b/yt/yql/tests/sql/suites/column_order/insert_tmp.sql
new file mode 100644
index 0000000000..be3485553e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/insert_tmp.sql
@@ -0,0 +1,18 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+
+insert into @tmp
+select * from Input order by subkey, key;
+commit;
+
+select * from @tmp order by subkey, key;
+
+insert into @tmp with truncate
+select key, value, subkey from Input order by subkey, key;
+
+select * from @tmp order by subkey, key;
+commit;
+select * from @tmp order by subkey, key;
+
diff --git a/yt/yql/tests/sql/suites/column_order/insert_with_desc_sort_and_native_types.sql b/yt/yql/tests/sql/suites/column_order/insert_with_desc_sort_and_native_types.sql
new file mode 100644
index 0000000000..a97c43f38b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/insert_with_desc_sort_and_native_types.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+/* hybridfile can not YQL-17743 */
+USE plato;
+
+PRAGMA OrderedColumns;
+PRAGMA yt.UseNativeYtTypes;
+
+insert into @tmp
+select key, AsList(subkey), value
+from Input
+where key > '000'
+order by value desc;
diff --git a/yt/yql/tests/sql/suites/column_order/insert_with_new_cols.cfg b/yt/yql/tests/sql/suites/column_order/insert_with_new_cols.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/insert_with_new_cols.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/column_order/insert_with_new_cols.sql b/yt/yql/tests/sql/suites/column_order/insert_with_new_cols.sql
new file mode 100644
index 0000000000..54c1afc925
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/insert_with_new_cols.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+
+insert into Output with truncate
+select a.*
+, count(key) over (partition by subkey) as cnt
+from Input as a
diff --git a/yt/yql/tests/sql/suites/column_order/insert_with_reorder_cols.cfg b/yt/yql/tests/sql/suites/column_order/insert_with_reorder_cols.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/insert_with_reorder_cols.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/column_order/insert_with_reorder_cols.sql b/yt/yql/tests/sql/suites/column_order/insert_with_reorder_cols.sql
new file mode 100644
index 0000000000..eff98969d9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/insert_with_reorder_cols.sql
@@ -0,0 +1,20 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+
+PRAGMA PositionalUnionAll;
+PRAGMA yt.UseNativeYtTypes;
+
+$i =
+SELECT
+ key,
+ AGGREGATE_LIST(subkey) as lst
+FROM Input
+GROUP BY key;
+
+INSERT INTO Output
+SELECT
+ a.key as key,
+ lst ?? [] as lst,
+ 2 as anum,
+FROM $i as a; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/column_order/join.cfg b/yt/yql/tests/sql/suites/column_order/join.cfg
new file mode 100644
index 0000000000..1acaa00cf7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/join.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/column_order/join.sql b/yt/yql/tests/sql/suites/column_order/join.sql
new file mode 100644
index 0000000000..9b356e0a4f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/join.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+
+$foo = select 1 as sk, "150" as key, 2 as v;
+
+select * from $foo as b join Input as a using(key);
+select a.* from $foo as b join Input as a using(key);
+select b.* from $foo as b join Input as a using(key);
+select a.*, b.* from $foo as b join Input as a using(key);
diff --git a/yt/yql/tests/sql/suites/column_order/join_nosimple.cfg b/yt/yql/tests/sql/suites/column_order/join_nosimple.cfg
new file mode 100644
index 0000000000..1acaa00cf7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/join_nosimple.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/column_order/join_nosimple.sql b/yt/yql/tests/sql/suites/column_order/join_nosimple.sql
new file mode 100644
index 0000000000..8784238898
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/join_nosimple.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+pragma DisableSimpleColumns;
+
+$foo = select 1 as sk, "150" as key, 2 as v;
+
+select * from $foo as b join Input as a using(key);
+select a.* from $foo as b join Input as a using(key);
+select b.* from $foo as b join Input as a using(key);
+select a.*, b.* from $foo as b join Input as a using(key);
diff --git a/yt/yql/tests/sql/suites/column_order/ordered_plus_native.cfg b/yt/yql/tests/sql/suites/column_order/ordered_plus_native.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/ordered_plus_native.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/column_order/ordered_plus_native.sql b/yt/yql/tests/sql/suites/column_order/ordered_plus_native.sql
new file mode 100644
index 0000000000..589b74ccc8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/ordered_plus_native.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+
+PRAGMA OrderedColumns;
+PRAGMA yt.UseNativeYtTypes;
+
+
+INSERT INTO Output WITH TRUNCATE
+SELECT
+ aggr_list(subkey) as subkey,
+ key,
+FROM Input AS a
+GROUP BY a.key as key;
diff --git a/yt/yql/tests/sql/suites/column_order/select_action.sql b/yt/yql/tests/sql/suites/column_order/select_action.sql
new file mode 100644
index 0000000000..e26c75a06f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/select_action.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+
+evaluate for $i in ["1", "2", "3"] do begin
+ select * from Input where subkey = $i;
+end do;
diff --git a/yt/yql/tests/sql/suites/column_order/select_distinct_star.sql b/yt/yql/tests/sql/suites/column_order/select_distinct_star.sql
new file mode 100644
index 0000000000..5c229a512f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/select_distinct_star.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+
+select distinct * from Input order by subkey, key;
+
diff --git a/yt/yql/tests/sql/suites/column_order/select_groupby_with_star.sql b/yt/yql/tests/sql/suites/column_order/select_groupby_with_star.sql
new file mode 100644
index 0000000000..ffb116362a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/select_groupby_with_star.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+
+select * from Input group by value, key order by key, value;
+select * from Input group by value, key having key = "150";
+select * from Input group by subkey, key || "x" as key order by subkey, key;
diff --git a/yt/yql/tests/sql/suites/column_order/select_limit_offset.sql b/yt/yql/tests/sql/suites/column_order/select_limit_offset.sql
new file mode 100644
index 0000000000..2da2186ca6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/select_limit_offset.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+
+select * from Input order by key limit 1 offset 3;
+select * from Input order by value limit 0 offset 3;
+select * from Input limit 0;
+
diff --git a/yt/yql/tests/sql/suites/column_order/select_limit_offset_reorder.sql b/yt/yql/tests/sql/suites/column_order/select_limit_offset_reorder.sql
new file mode 100644
index 0000000000..e8a9cf93db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/select_limit_offset_reorder.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+
+select subkey, key, value from (select * from Input) as x order by key, subkey limit 1 offset 1;
diff --git a/yt/yql/tests/sql/suites/column_order/select_orderby.sql b/yt/yql/tests/sql/suites/column_order/select_orderby.sql
new file mode 100644
index 0000000000..12bfaa33d3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/select_orderby.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+
+select * from Input order by key;
+
diff --git a/yt/yql/tests/sql/suites/column_order/select_plain.sql b/yt/yql/tests/sql/suites/column_order/select_plain.sql
new file mode 100644
index 0000000000..b495924f3d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/select_plain.sql
@@ -0,0 +1,16 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+
+select * from Input order by subkey;
+select * without key from Input order by subkey;
+
+select a.* from Input as a order by a.subkey;
+select a.* without key from Input as a order by a.subkey;
+
+select 1 as z, 2 as x, a.* from Input as a order by a.subkey;
+select 1 as z, 2 as x, a.* without key from Input as a order by a.subkey;
+
+select 1 as c, 2 as b, 3 as a;
+
diff --git a/yt/yql/tests/sql/suites/column_order/select_plain_nosimple.sql b/yt/yql/tests/sql/suites/column_order/select_plain_nosimple.sql
new file mode 100644
index 0000000000..9f3c6de79b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/select_plain_nosimple.sql
@@ -0,0 +1,17 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+pragma DisableSimpleColumns;
+
+select * from Input;
+select * without key from Input;
+
+select a.* from Input as a;
+select a.* without key from Input as a;
+
+select 1 as z, 2 as x, a.* from Input as a;
+select 1 as z, 2 as x, a.* without key from Input as a;
+
+select 1 as c, 2 as b, 3 as a;
+
diff --git a/yt/yql/tests/sql/suites/column_order/select_sample.sql b/yt/yql/tests/sql/suites/column_order/select_sample.sql
new file mode 100644
index 0000000000..af4555f2a4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/select_sample.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+
+select * from Input tablesample bernoulli(100.0);
+
diff --git a/yt/yql/tests/sql/suites/column_order/select_subquery.sql b/yt/yql/tests/sql/suites/column_order/select_subquery.sql
new file mode 100644
index 0000000000..c00407dfdc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/select_subquery.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+
+define subquery $select_star($table) as
+ select * without subkey from $table;
+end define;
+
+select * from $select_star("Input");
+
diff --git a/yt/yql/tests/sql/suites/column_order/select_where.sql b/yt/yql/tests/sql/suites/column_order/select_where.sql
new file mode 100644
index 0000000000..d08d7cae43
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/select_where.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+
+select * from Input where key="150";
+
diff --git a/yt/yql/tests/sql/suites/column_order/select_win_func.sql b/yt/yql/tests/sql/suites/column_order/select_win_func.sql
new file mode 100644
index 0000000000..4ce0668d97
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/select_win_func.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+
+select
+ min(subkey) over (partition by key) as zz,
+ row_number() over (order by key, subkey) as z,
+ a.*
+from Input as a
+order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/column_order/union_all.sql b/yt/yql/tests/sql/suites/column_order/union_all.sql
new file mode 100644
index 0000000000..ea88506906
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/union_all.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+/* syntax version 1 */
+pragma OrderedColumns;
+
+select 1 as z, 2 as y, 3 as x
+union all
+select 1 as z, 2 as y
+union all
+select 1 as z;
+
+select 1 as z, 2 as y, 3 as x
+union all
+select 1 as z, 2 as y
+union all
+select 1 as a;
diff --git a/yt/yql/tests/sql/suites/column_order/union_all_positional_columns_count_fail.cfg b/yt/yql/tests/sql/suites/column_order/union_all_positional_columns_count_fail.cfg
new file mode 100644
index 0000000000..5dae597903
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/union_all_positional_columns_count_fail.cfg
@@ -0,0 +1 @@
+xfail
diff --git a/yt/yql/tests/sql/suites/column_order/union_all_positional_columns_count_fail.sql b/yt/yql/tests/sql/suites/column_order/union_all_positional_columns_count_fail.sql
new file mode 100644
index 0000000000..3b5fd2428b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/union_all_positional_columns_count_fail.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+/* syntax version 1 */
+/* custom error:Different column counts in UNION ALL inputs: input #0 has 3 column, input #1 has 2 columns*/
+pragma PositionalUnionAll;
+
+select 1 as c, 2 as b, 3 as a
+union all
+select 1 as c, 2 as b;
diff --git a/yt/yql/tests/sql/suites/column_order/union_all_positional_unordered_fail.cfg b/yt/yql/tests/sql/suites/column_order/union_all_positional_unordered_fail.cfg
new file mode 100644
index 0000000000..5dae597903
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/union_all_positional_unordered_fail.cfg
@@ -0,0 +1 @@
+xfail
diff --git a/yt/yql/tests/sql/suites/column_order/union_all_positional_unordered_fail.sql b/yt/yql/tests/sql/suites/column_order/union_all_positional_unordered_fail.sql
new file mode 100644
index 0000000000..c4128ac9be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/union_all_positional_unordered_fail.sql
@@ -0,0 +1,7 @@
+/* custom error:Input #1 does not have ordered columns. Consider making column order explicit by using SELECT with column names*/
+pragma PositionalUnionAll;
+
+select 1 as c, 2 as b, 3 as a
+union all
+select * from as_table([<|c:1, b:2, a:3|>]);
+
diff --git a/yt/yql/tests/sql/suites/column_order/winfunc.sql b/yt/yql/tests/sql/suites/column_order/winfunc.sql
new file mode 100644
index 0000000000..eb5751334a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/column_order/winfunc.sql
@@ -0,0 +1,9 @@
+use plato;
+pragma OrderedColumns;
+
+select
+ a.*
+ , lag(key) over (order by subkey) as prev_k
+ , min(key) over (order by subkey) as min_k
+from Input as a
+order by subkey
diff --git a/yt/yql/tests/sql/suites/count/boolean_count.cfg b/yt/yql/tests/sql/suites/count/boolean_count.cfg
new file mode 100644
index 0000000000..28975418d4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/boolean_count.cfg
@@ -0,0 +1 @@
+in Input count_input.txt
diff --git a/yt/yql/tests/sql/suites/count/boolean_count.sql b/yt/yql/tests/sql/suites/count/boolean_count.sql
new file mode 100644
index 0000000000..8ecebf2391
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/boolean_count.sql
@@ -0,0 +1,3 @@
+select count(*) from plato.Input;
+select count(e) from plato.Input;
+select count(distinct e) from plato.Input;
diff --git a/yt/yql/tests/sql/suites/count/count.cfg b/yt/yql/tests/sql/suites/count/count.cfg
new file mode 100644
index 0000000000..28975418d4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count.cfg
@@ -0,0 +1 @@
+in Input count_input.txt
diff --git a/yt/yql/tests/sql/suites/count/count.sql b/yt/yql/tests/sql/suites/count/count.sql
new file mode 100644
index 0000000000..9c01b87439
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+select a, aggregate_list(b), count(*) from plato.Input group by a order by a;
+select b, aggregate_list(a), count(*) from plato.Input group by b order by b;
+select c, aggregate_list(a), count(*) from plato.Input group by c order by c;
+select d, aggregate_list(a), count(*) from plato.Input group by d order by d;
+select e, aggregate_list(a), count(*) from plato.Input group by e order by e;
diff --git a/yt/yql/tests/sql/suites/count/count_all.sql b/yt/yql/tests/sql/suites/count/count_all.sql
new file mode 100644
index 0000000000..1e638449b7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count_all.sql
@@ -0,0 +1 @@
+select count(*) from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/count/count_all_grouped-empty.cfg b/yt/yql/tests/sql/suites/count/count_all_grouped-empty.cfg
new file mode 100644
index 0000000000..3bccc051db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count_all_grouped-empty.cfg
@@ -0,0 +1 @@
+in Input empty.txt
diff --git a/yt/yql/tests/sql/suites/count/count_all_grouped.cfg b/yt/yql/tests/sql/suites/count/count_all_grouped.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count_all_grouped.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/count/count_all_grouped.sql b/yt/yql/tests/sql/suites/count/count_all_grouped.sql
new file mode 100644
index 0000000000..234ad3625a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count_all_grouped.sql
@@ -0,0 +1 @@
+select key, count(*) from plato.Input group by key order by key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/count/count_all_view_concat.cfg b/yt/yql/tests/sql/suites/count/count_all_view_concat.cfg
new file mode 100644
index 0000000000..8b7633b301
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count_all_view_concat.cfg
@@ -0,0 +1 @@
+in Input view_input.txt
diff --git a/yt/yql/tests/sql/suites/count/count_all_view_concat.sql b/yt/yql/tests/sql/suites/count/count_all_view_concat.sql
new file mode 100644
index 0000000000..1dba44bcdd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count_all_view_concat.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* syntax version 1 */
+select count(*) as count from plato.concat(Input view ksv, Input view ksv);
diff --git a/yt/yql/tests/sql/suites/count/count_by_nulls.cfg b/yt/yql/tests/sql/suites/count/count_by_nulls.cfg
new file mode 100644
index 0000000000..1af92ac7be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count_by_nulls.cfg
@@ -0,0 +1 @@
+in Input input_intersect_with_holes.txt
diff --git a/yt/yql/tests/sql/suites/count/count_by_nulls.sql b/yt/yql/tests/sql/suites/count/count_by_nulls.sql
new file mode 100644
index 0000000000..6265a21122
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count_by_nulls.sql
@@ -0,0 +1 @@
+select count(cast(subkey as int)) as not_null_subkeys from plato.Input;
diff --git a/yt/yql/tests/sql/suites/count/count_const_no_grouping.sql b/yt/yql/tests/sql/suites/count/count_const_no_grouping.sql
new file mode 100644
index 0000000000..0590d2c282
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count_const_no_grouping.sql
@@ -0,0 +1 @@
+select count(1) from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/count/count_distinct_from_view_concat.cfg b/yt/yql/tests/sql/suites/count/count_distinct_from_view_concat.cfg
new file mode 100644
index 0000000000..8b7633b301
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count_distinct_from_view_concat.cfg
@@ -0,0 +1 @@
+in Input view_input.txt
diff --git a/yt/yql/tests/sql/suites/count/count_distinct_from_view_concat.sql b/yt/yql/tests/sql/suites/count/count_distinct_from_view_concat.sql
new file mode 100644
index 0000000000..d45d8742ad
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count_distinct_from_view_concat.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* syntax version 1 */
+select count(distinct k) as count from plato.concat(Input view ksv, Input view ksv);
diff --git a/yt/yql/tests/sql/suites/count/count_input.txt.attr b/yt/yql/tests/sql/suites/count/count_input.txt.attr
new file mode 100644
index 0000000000..3176be619e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count_input.txt.attr
@@ -0,0 +1,3 @@
+{
+ "_read_schema"=[{"type"="int64";"name"="a"};{"type"="uint64";"name"="b"};{"type"="double";"name"="c"};{"type"="string";"name"="d"};{"type"="boolean";name="e"};{"type"="any";"name"="f"}]
+}
diff --git a/yt/yql/tests/sql/suites/count/count_no_grouping.sql b/yt/yql/tests/sql/suites/count/count_no_grouping.sql
new file mode 100644
index 0000000000..7b0b662f41
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count_no_grouping.sql
@@ -0,0 +1 @@
+select count(value) from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/count/count_nullable.cfg b/yt/yql/tests/sql/suites/count/count_nullable.cfg
new file mode 100644
index 0000000000..8153a1f3e5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count_nullable.cfg
@@ -0,0 +1 @@
+in Input avg_and_sum_by_value.txt
diff --git a/yt/yql/tests/sql/suites/count/count_nullable.sql b/yt/yql/tests/sql/suites/count/count_nullable.sql
new file mode 100644
index 0000000000..4b70423490
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count_nullable.sql
@@ -0,0 +1 @@
+select count(cast(key as int)), value from plato.Input group by value order by value; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/count/count_nullable_sub.sql b/yt/yql/tests/sql/suites/count/count_nullable_sub.sql
new file mode 100644
index 0000000000..0f962a7138
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/count_nullable_sub.sql
@@ -0,0 +1,8 @@
+select
+ count(val) as subkey,
+ cast(avg(val) as int) as value,
+ value as key
+from
+ (select case key when '0' then NULL else cast(subkey as int) / cast(key as int) end as val, value from plato.Input2) as res
+group by value
+order by value; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/count/default.cfg b/yt/yql/tests/sql/suites/count/default.cfg
new file mode 100644
index 0000000000..8d2f379d10
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/default.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+in Input2 input2.txt
diff --git a/yt/yql/tests/sql/suites/count/view_input.txt.attr b/yt/yql/tests/sql/suites/count/view_input.txt.attr
new file mode 100644
index 0000000000..07386c98e5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/count/view_input.txt.attr
@@ -0,0 +1,32 @@
+{
+ "_yql_view_ksv"="SELECT key as k, subkey as s, value as v FROM self";
+ "_yql_view_key"="SELECT key FROM self";
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/csee/default.cfg b/yt/yql/tests/sql/suites/csee/default.cfg
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/csee/default.cfg
diff --git a/yt/yql/tests/sql/suites/csee/yql-7237.cfg b/yt/yql/tests/sql/suites/csee/yql-7237.cfg
new file mode 100644
index 0000000000..c7f999ccb9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/csee/yql-7237.cfg
@@ -0,0 +1 @@
+udf strings_udf
diff --git a/yt/yql/tests/sql/suites/csee/yql-7237.sql b/yt/yql/tests/sql/suites/csee/yql-7237.sql
new file mode 100644
index 0000000000..52a0a68ea7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/csee/yql-7237.sql
@@ -0,0 +1,68 @@
+/* syntax version 1 */
+USE plato;
+
+$push_final_data = AsList(
+ AsStruct("manufacturer" AS manufacturer, "state" AS state));
+
+INSERT INTO @push_final
+SELECT * FROM AS_TABLE($push_final_data);
+COMMIT;
+
+$manufacturer_name_fix = ($manufacturer) -> {
+ $lowered_manufacturer = CAST(Unicode::ToLower(CAST(String::Strip($manufacturer) AS Utf8)) AS String);
+ $in = AsList(
+ "oysters", -- bullshit in naming
+ "qumo", -- bullshit in naming
+ "texet", -- bullshit in naming
+ "alcatel", -- bullshit in naming
+ "dexp", -- bullshit in naming
+ "haier", -- bullshit in naming
+ "dexp", -- bullshit in naming
+ "asus", -- ASUSTek Computer Inc & ASUS both usable
+ "yota", -- Yota Devices & Yota Devices Limited ...
+ "ark" -- "ark" & "ark electronic technology" & "ark_electronic_technology"
+ );
+ $lambda = ($substring) -> {
+ RETURN FIND($lowered_manufacturer, $substring) IS NULL;
+ };
+ $list = ListSkipWhile($in, $lambda);
+ RETURN IF(ListHasItems($list), $list[0], $lowered_manufacturer);
+};
+
+$manufacturers_whitelist = (
+ SELECT
+ man as manufacturer
+ FROM
+ (
+ SELECT
+ man, COUNT(*) as cnt
+ FROM
+ @push_final
+ GROUP BY
+ $manufacturer_name_fix(manufacturer) as man
+ )
+ WHERE
+ cnt > 1000
+);
+
+$push_final_preprocessing = (
+ SELECT
+ $manufacturer_name_fix(manufacturer) as manufacturer,
+ state
+ FROM
+ @push_final
+);
+
+SELECT
+ COALESCE(fixed_manufacturer, "other") as manufacturer,
+ L.* WITHOUT L.manufacturer
+FROM
+ $push_final_preprocessing as L
+ LEFT JOIN
+ (
+ SELECT
+ manufacturer as fixed_manufacturer
+ FROM
+ $manufacturers_whitelist
+ ) as R
+ ON(L.manufacturer = R.fixed_manufacturer);
diff --git a/yt/yql/tests/sql/suites/datetime/date_tz_table_sort_asc.cfg b/yt/yql/tests/sql/suites/datetime/date_tz_table_sort_asc.cfg
new file mode 100644
index 0000000000..4e01ee544a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/datetime/date_tz_table_sort_asc.cfg
@@ -0,0 +1,2 @@
+in Input date_tz.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/datetime/date_tz_table_sort_asc.sql b/yt/yql/tests/sql/suites/datetime/date_tz_table_sort_asc.sql
new file mode 100644
index 0000000000..72954c51bf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/datetime/date_tz_table_sort_asc.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+/* multirun can not */
+use plato;
+
+insert into Output with truncate
+select
+ cast(value as tzdatetime) as x
+from Input
+order by x asc;
+commit;
+
+select * from Output;
diff --git a/yt/yql/tests/sql/suites/datetime/date_tz_table_sort_desc.cfg b/yt/yql/tests/sql/suites/datetime/date_tz_table_sort_desc.cfg
new file mode 100644
index 0000000000..4e01ee544a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/datetime/date_tz_table_sort_desc.cfg
@@ -0,0 +1,2 @@
+in Input date_tz.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/datetime/date_tz_table_sort_desc.sql b/yt/yql/tests/sql/suites/datetime/date_tz_table_sort_desc.sql
new file mode 100644
index 0000000000..4f21122ede
--- /dev/null
+++ b/yt/yql/tests/sql/suites/datetime/date_tz_table_sort_desc.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+/* multirun can not */
+use plato;
+
+insert into Output with truncate
+select
+ cast(value as tzdatetime) as x
+from Input
+order by x desc;
+commit;
+
+select * from Output;
diff --git a/yt/yql/tests/sql/suites/datetime/default.cfg b/yt/yql/tests/sql/suites/datetime/default.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/datetime/default.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/distinct/default.cfg b/yt/yql/tests/sql/suites/distinct/default.cfg
new file mode 100644
index 0000000000..389a8e8f21
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/default.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_and_join.cfg b/yt/yql/tests/sql/suites/distinct/distinct_and_join.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_and_join.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_and_join.sql b/yt/yql/tests/sql/suites/distinct/distinct_and_join.sql
new file mode 100644
index 0000000000..3f36ed9841
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_and_join.sql
@@ -0,0 +1,8 @@
+SELECT
+DISTINCT
+ i1.key,
+ i2.key,
+ i1.subkey
+FROM plato.Input AS i1 JOIN plato.Input AS i2 on i1.key == i2.subkey
+ORDER BY i1.key, i2.key, i1.subkey
+;
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_by_tuple.sql b/yt/yql/tests/sql/suites/distinct/distinct_by_tuple.sql
new file mode 100644
index 0000000000..ba6c707502
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_by_tuple.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select distinct key from (select AsTuple(Just(key), Just(key)) as key, subkey, value from plato.Input) order by key;
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_columns.sql b/yt/yql/tests/sql/suites/distinct/distinct_columns.sql
new file mode 100644
index 0000000000..75428df492
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_columns.sql
@@ -0,0 +1 @@
+select distinct key, subkey, value from plato.Input3 order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_columns_after_group.sql b/yt/yql/tests/sql/suites/distinct/distinct_columns_after_group.sql
new file mode 100644
index 0000000000..0d98c79f1d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_columns_after_group.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+select distinct avg_key, min_val from (
+ select avg(cast(key as int)) as avg_key, min(value) as min_val from plato.Input3 group by subkey
+) as x order by avg_key, min_val; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_count_and_avg.sql b/yt/yql/tests/sql/suites/distinct/distinct_count_and_avg.sql
new file mode 100644
index 0000000000..ac99b592f4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_count_and_avg.sql
@@ -0,0 +1 @@
+select count(distinct key) as count, avg(numKey) as avg from (select key, cast(key as int) as numKey, value from plato.Input2) as x group by value order by count; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_count_and_full_count.sql b/yt/yql/tests/sql/suites/distinct/distinct_count_and_full_count.sql
new file mode 100644
index 0000000000..84900dc016
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_count_and_full_count.sql
@@ -0,0 +1 @@
+select value, count(distinct key) as dist, count(key) as full from plato.Input2 group by value order by value; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_count_no_gouping.sql b/yt/yql/tests/sql/suites/distinct/distinct_count_no_gouping.sql
new file mode 100644
index 0000000000..aec6be38e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_count_no_gouping.sql
@@ -0,0 +1 @@
+select count(distinct key) as dist, count(key) as full from plato.Input2; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_count_only.sql b/yt/yql/tests/sql/suites/distinct/distinct_count_only.sql
new file mode 100644
index 0000000000..45c1ec2740
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_count_only.sql
@@ -0,0 +1 @@
+select count(distinct key) from plato.Input2; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_groupby.sql b/yt/yql/tests/sql/suites/distinct/distinct_groupby.sql
new file mode 100644
index 0000000000..232a2b5a96
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_groupby.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+
+use plato;
+
+select distinct k || "_" as k1, "_" || v as v1 from Input2 group by key as k, value as v order by k1,v1;
+
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_having_no_agg.sql b/yt/yql/tests/sql/suites/distinct/distinct_having_no_agg.sql
new file mode 100644
index 0000000000..dfc8943362
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_having_no_agg.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+pragma warning("disable", "4526");
+use plato;
+
+select distinct key from Input2 having key != '0';
+
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_join.sql b/yt/yql/tests/sql/suites/distinct/distinct_join.sql
new file mode 100644
index 0000000000..0e2aba1c5c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_join.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+
+use plato;
+
+select distinct * from (select Unwrap(cast(key as Int32)) as key, value from Input2) as a
+join (select Just(1ul) as key, 123 as subkey) as b
+using(key) order by value;
+
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_list_after_group.sql b/yt/yql/tests/sql/suites/distinct/distinct_list_after_group.sql
new file mode 100644
index 0000000000..33a780ea0d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_list_after_group.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+select listsort(aggregate_list(distinct key)) as key_list, value as name from plato.Input3 group by value order by name;
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_one_count.sql b/yt/yql/tests/sql/suites/distinct/distinct_one_count.sql
new file mode 100644
index 0000000000..a5778dfe30
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_one_count.sql
@@ -0,0 +1 @@
+select value, count(distinct key) as count from plato.Input2 group by value order by value; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_star.sql b/yt/yql/tests/sql/suites/distinct/distinct_star.sql
new file mode 100644
index 0000000000..ac96695c1f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_star.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+
+use plato;
+
+select distinct * from Input2 order by key, subkey;
+
+select distinct * without subkey from Input2 order by key, value;
+
+select distinct a.*, TableName() as tn, without subkey from Input2 as a order by key, value;
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_star1.cfg b/yt/yql/tests/sql/suites/distinct/distinct_star1.cfg
new file mode 100644
index 0000000000..d1dbe1ff8c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_star1.cfg
@@ -0,0 +1 @@
+in Input input_dups.txt
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_star1.sql b/yt/yql/tests/sql/suites/distinct/distinct_star1.sql
new file mode 100644
index 0000000000..775d2ac81d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_star1.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+
+select distinct * from plato.Input order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_union_all.sql b/yt/yql/tests/sql/suites/distinct/distinct_union_all.sql
new file mode 100644
index 0000000000..7ddf2e4906
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_union_all.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+
+use plato;
+pragma AnsiOrderByLimitInUnionAll;
+
+select distinct key, value from Input2
+union all
+select key, value from Input2 order by key, value;
+
diff --git a/yt/yql/tests/sql/suites/distinct/distinct_window.sql b/yt/yql/tests/sql/suites/distinct/distinct_window.sql
new file mode 100644
index 0000000000..ab37cd91a6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/distinct/distinct_window.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+
+use plato;
+
+select distinct AGGREGATE_LIST(value) over w as values, key from Input2
+window w as (partition by key order by value rows between unbounded preceding and unbounded following)
+order by key;
+
diff --git a/yt/yql/tests/sql/suites/dq/blacklisted_pragmas.cfg b/yt/yql/tests/sql/suites/dq/blacklisted_pragmas.cfg
new file mode 100644
index 0000000000..628ba758c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/blacklisted_pragmas.cfg
@@ -0,0 +1,3 @@
+providers dq
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/dq/blacklisted_pragmas.sql b/yt/yql/tests/sql/suites/dq/blacklisted_pragmas.sql
new file mode 100644
index 0000000000..48ed7e56a7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/blacklisted_pragmas.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+/* dq can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+pragma yt.MaxRowWeight='32M';
+
+insert into Input
+select key, subkey, value from Input;
+
diff --git a/yt/yql/tests/sql/suites/dq/blacklisted_pragmas1.cfg b/yt/yql/tests/sql/suites/dq/blacklisted_pragmas1.cfg
new file mode 100644
index 0000000000..628ba758c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/blacklisted_pragmas1.cfg
@@ -0,0 +1,3 @@
+providers dq
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/dq/blacklisted_pragmas1.sql b/yt/yql/tests/sql/suites/dq/blacklisted_pragmas1.sql
new file mode 100644
index 0000000000..a5ff262828
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/blacklisted_pragmas1.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+/* dq can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+pragma yt.PoolTrees='test';
+
+insert into Input
+select key, subkey, value from Input;
+
diff --git a/yt/yql/tests/sql/suites/dq/default.cfg b/yt/yql/tests/sql/suites/dq/default.cfg
new file mode 100644
index 0000000000..5a04bd7d71
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/default.cfg
@@ -0,0 +1,2 @@
+providers dq
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/dq/dq_replicate_ok.sql b/yt/yql/tests/sql/suites/dq/dq_replicate_ok.sql
new file mode 100644
index 0000000000..7fe22bdd86
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/dq_replicate_ok.sql
@@ -0,0 +1,6 @@
+use plato;
+SELECT key
+ , COUNT(*) AS cnt
+ , COUNT(DISTINCT value) AS uniq
+FROM Input
+GROUP BY key
diff --git a/yt/yql/tests/sql/suites/dq/join_cbo_native_3_tables.cfg b/yt/yql/tests/sql/suites/dq/join_cbo_native_3_tables.cfg
new file mode 100644
index 0000000000..041e8638ac
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/join_cbo_native_3_tables.cfg
@@ -0,0 +1,5 @@
+providers dq
+in Input1 input.txt
+in Input2 input.txt
+in Input3 input.txt
+in Input4 input.txt
diff --git a/yt/yql/tests/sql/suites/dq/join_cbo_native_3_tables.sql b/yt/yql/tests/sql/suites/dq/join_cbo_native_3_tables.sql
new file mode 100644
index 0000000000..163762e45a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/join_cbo_native_3_tables.sql
@@ -0,0 +1,10 @@
+use plato;
+
+pragma CostBasedOptimizer="native";
+
+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/dq/mem_limit.cfg b/yt/yql/tests/sql/suites/dq/mem_limit.cfg
new file mode 100644
index 0000000000..33c765a8f2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/mem_limit.cfg
@@ -0,0 +1,2 @@
+xfail
+providers dq
diff --git a/yt/yql/tests/sql/suites/dq/mem_limit.sql b/yt/yql/tests/sql/suites/dq/mem_limit.sql
new file mode 100644
index 0000000000..b3bac08441
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/mem_limit.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* dqfile can not */
+USE plato;
+
+PRAGMA DqEngine="force";
+PRAGMA dq.MemoryLimit="1M";
+SELECT String::JoinFromList(ListMap(ListFromRange(0, 1000000), ($_) -> { return "0"; }), "");
diff --git a/yt/yql/tests/sql/suites/dq/pool_trees_whitelist.cfg b/yt/yql/tests/sql/suites/dq/pool_trees_whitelist.cfg
new file mode 100644
index 0000000000..628ba758c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/pool_trees_whitelist.cfg
@@ -0,0 +1,3 @@
+providers dq
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/dq/pool_trees_whitelist.sql b/yt/yql/tests/sql/suites/dq/pool_trees_whitelist.sql
new file mode 100644
index 0000000000..cb4b754ff4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/pool_trees_whitelist.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma OrderedColumns;
+pragma yt.PoolTrees='physical,cloud';
+
+insert into Input
+select key, subkey, value from Input;
diff --git a/yt/yql/tests/sql/suites/dq/precompute_asyncfile.cfg b/yt/yql/tests/sql/suites/dq/precompute_asyncfile.cfg
new file mode 100644
index 0000000000..144206fd2c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/precompute_asyncfile.cfg
@@ -0,0 +1,4 @@
+providers dq
+in Input input.txt
+file list.txt list.txt
+udf file_udf \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/dq/precompute_asyncfile.sql b/yt/yql/tests/sql/suites/dq/precompute_asyncfile.sql
new file mode 100644
index 0000000000..a75d060c8e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/precompute_asyncfile.sql
@@ -0,0 +1,5 @@
+use plato;
+
+$a = select max(key) from Input where key in ParseFile("String", "list.txt");
+
+select * from Input where key >= $a;
diff --git a/yt/yql/tests/sql/suites/dq/precompute_parallel.cfg b/yt/yql/tests/sql/suites/dq/precompute_parallel.cfg
new file mode 100644
index 0000000000..cf64efcf8e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/precompute_parallel.cfg
@@ -0,0 +1,4 @@
+providers dq
+in Input input.txt
+out Output1 output1.txt
+out Output2 output2.txt
diff --git a/yt/yql/tests/sql/suites/dq/precompute_parallel.sql b/yt/yql/tests/sql/suites/dq/precompute_parallel.sql
new file mode 100644
index 0000000000..4f3924af4c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/precompute_parallel.sql
@@ -0,0 +1,7 @@
+use plato;
+
+$a = select key from Input order by key limit 1;
+
+insert into Output1 select * from Input where key <= $a;
+insert into Output2 select * from Input where key >= $a;
+
diff --git a/yt/yql/tests/sql/suites/dq/precompute_parallel_indep.cfg b/yt/yql/tests/sql/suites/dq/precompute_parallel_indep.cfg
new file mode 100644
index 0000000000..1ff2e85554
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/precompute_parallel_indep.cfg
@@ -0,0 +1,5 @@
+providers dq
+in Input1 input.txt
+in Input2 input.txt
+in Input3 input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/dq/precompute_parallel_indep.sql b/yt/yql/tests/sql/suites/dq/precompute_parallel_indep.sql
new file mode 100644
index 0000000000..c9a5dbc8f4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/precompute_parallel_indep.sql
@@ -0,0 +1,5 @@
+use plato;
+
+insert into Output select sum(cast(key as int32)) from Input1;
+insert into Output select sum(cast(key as int32)) from Input2;
+insert into Output select sum(cast(key as int32)) from Input3;
diff --git a/yt/yql/tests/sql/suites/dq/precompute_parallel_mix.cfg b/yt/yql/tests/sql/suites/dq/precompute_parallel_mix.cfg
new file mode 100644
index 0000000000..cf64efcf8e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/precompute_parallel_mix.cfg
@@ -0,0 +1,4 @@
+providers dq
+in Input input.txt
+out Output1 output1.txt
+out Output2 output2.txt
diff --git a/yt/yql/tests/sql/suites/dq/precompute_parallel_mix.sql b/yt/yql/tests/sql/suites/dq/precompute_parallel_mix.sql
new file mode 100644
index 0000000000..f68eaabcc9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/precompute_parallel_mix.sql
@@ -0,0 +1,7 @@
+use plato;
+
+$a = select key from Input order by key limit 1;
+$b = select key from Input order by key limit 1 offset 1;
+
+insert into Output1 select * from Input where key <= $a;
+insert into Output2 select * from Input where key >= $a and key != $b;
diff --git a/yt/yql/tests/sql/suites/dq/precompute_result.sql b/yt/yql/tests/sql/suites/dq/precompute_result.sql
new file mode 100644
index 0000000000..c00a9af0de
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/precompute_result.sql
@@ -0,0 +1,6 @@
+use plato;
+
+$l = select min(cast(key as uint64)) as key from Input;
+$l = EvaluateExpr($l);
+
+select * from Input limit $l ?? 0;
diff --git a/yt/yql/tests/sql/suites/dq/precompute_tree.sql b/yt/yql/tests/sql/suites/dq/precompute_tree.sql
new file mode 100644
index 0000000000..2073f261e3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/precompute_tree.sql
@@ -0,0 +1,9 @@
+use plato;
+
+$a = select max(key) from Input;
+
+$b = select min(subkey) from Input where key < $a;
+
+$c = select min(key) from Input where key < "080";
+
+select * from Input where key > $c and subkey > $b;
diff --git a/yt/yql/tests/sql/suites/dq/read_cost.sql b/yt/yql/tests/sql/suites/dq/read_cost.sql
new file mode 100644
index 0000000000..173c2f1593
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/read_cost.sql
@@ -0,0 +1,8 @@
+pragma warning("disable", "4510");
+pragma CostBasedOptimizer="PG";
+use plato;
+
+$foo = select subkey, key, value as v from Input order by subkey asc, key desc limit 10;
+$x = process $foo;
+
+select YQL::CostsOf($x) as costs;
diff --git a/yt/yql/tests/sql/suites/dq/read_cost_native.sql b/yt/yql/tests/sql/suites/dq/read_cost_native.sql
new file mode 100644
index 0000000000..65e744bb77
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/read_cost_native.sql
@@ -0,0 +1,8 @@
+pragma warning("disable", "4510");
+pragma CostBasedOptimizer="Native";
+use plato;
+
+$foo = select subkey, key, value as v from Input order by subkey asc, key desc limit 10;
+$x = process $foo;
+
+select YQL::CostsOf($x) as costs;
diff --git a/yt/yql/tests/sql/suites/dq/truncate_local.sql b/yt/yql/tests/sql/suites/dq/truncate_local.sql
new file mode 100644
index 0000000000..71872dcf16
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/truncate_local.sql
@@ -0,0 +1,3 @@
+pragma DqEngine="auto";
+select * from AS_TABLE(ListMap(ListFromRange(1,10000),($x)->(<|a:$x|>)));
+
diff --git a/yt/yql/tests/sql/suites/dq/wrong_script.cfg b/yt/yql/tests/sql/suites/dq/wrong_script.cfg
new file mode 100644
index 0000000000..33c765a8f2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/wrong_script.cfg
@@ -0,0 +1,2 @@
+xfail
+providers dq
diff --git a/yt/yql/tests/sql/suites/dq/wrong_script.sql b/yt/yql/tests/sql/suites/dq/wrong_script.sql
new file mode 100644
index 0000000000..7774e498a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/wrong_script.sql
@@ -0,0 +1,13 @@
+/* custom error:Failed to cast arguments*/
+/* dqfile can not */
+USE plato;
+
+$f=Python3::f(@@
+def f(x):
+ """
+ Callable<(Int32)->Int32>
+ """
+ return ""
+@@);
+
+select $f(0);
diff --git a/yt/yql/tests/sql/suites/dq/wrong_script_segf.cfg b/yt/yql/tests/sql/suites/dq/wrong_script_segf.cfg
new file mode 100644
index 0000000000..33c765a8f2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/wrong_script_segf.cfg
@@ -0,0 +1,2 @@
+xfail
+providers dq
diff --git a/yt/yql/tests/sql/suites/dq/wrong_script_segf.sql b/yt/yql/tests/sql/suites/dq/wrong_script_segf.sql
new file mode 100644
index 0000000000..a679ed4c2c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/wrong_script_segf.sql
@@ -0,0 +1,17 @@
+/* custom error:PrintBacktraceToStderr*/
+/* dqfile can not */
+USE plato;
+
+$f=Python3::f(@@
+def f(x):
+ """
+ Callable<(Int32)->Int32>
+ """
+ import ctypes
+ def deref(addr, typ):
+ return ctypes.cast(addr, ctypes.POINTER(typ)).contents
+ print(deref(1, ctypes.c_int))
+ return 0
+@@);
+
+select $f(0);
diff --git a/yt/yql/tests/sql/suites/dq/wrong_script_timeout.sql b/yt/yql/tests/sql/suites/dq/wrong_script_timeout.sql
new file mode 100644
index 0000000000..8493ab87e8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/dq/wrong_script_timeout.sql
@@ -0,0 +1,14 @@
+/* dqfile can not */
+USE plato;
+
+$f=Python3::f(@@
+def f(x):
+ """
+ Callable<(Int32)->Int32>
+ """
+ import time
+ time.sleep(60)
+ return 0
+@@);
+
+select $f(0);
diff --git a/yt/yql/tests/sql/suites/epochs/default.cfg b/yt/yql/tests/sql/suites/epochs/default.cfg
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/epochs/default.cfg
diff --git a/yt/yql/tests/sql/suites/epochs/modify.txt.attr b/yt/yql/tests/sql/suites/epochs/modify.txt.attr
new file mode 100644
index 0000000000..36b3c00c90
--- /dev/null
+++ b/yt/yql/tests/sql/suites/epochs/modify.txt.attr
@@ -0,0 +1,5 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[["key";["DataType";"String";];];["subkey";["DataType";"String";];];["value";["DataType";"String";];];];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/epochs/read_modified.cfg b/yt/yql/tests/sql/suites/epochs/read_modified.cfg
new file mode 100644
index 0000000000..91ba34f663
--- /dev/null
+++ b/yt/yql/tests/sql/suites/epochs/read_modified.cfg
@@ -0,0 +1,2 @@
+out Output modify.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/epochs/read_modified.sql b/yt/yql/tests/sql/suites/epochs/read_modified.sql
new file mode 100644
index 0000000000..b30996c785
--- /dev/null
+++ b/yt/yql/tests/sql/suites/epochs/read_modified.sql
@@ -0,0 +1,17 @@
+/* postgres can not */
+/* multirun can not */
+use plato;
+
+insert into Output select * from Output;
+insert into Output select * from Output;
+
+commit;
+
+select count(*) from Output;
+
+insert into Output select * from Output;
+insert into Output select * from Output;
+
+commit;
+
+select count(*) from Output;
diff --git a/yt/yql/tests/sql/suites/epochs/reset_sortness_on_append.cfg b/yt/yql/tests/sql/suites/epochs/reset_sortness_on_append.cfg
new file mode 100644
index 0000000000..7cbf80703f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/epochs/reset_sortness_on_append.cfg
@@ -0,0 +1,2 @@
+out Output output.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/epochs/reset_sortness_on_append.sql b/yt/yql/tests/sql/suites/epochs/reset_sortness_on_append.sql
new file mode 100644
index 0000000000..8127e25a0a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/epochs/reset_sortness_on_append.sql
@@ -0,0 +1,18 @@
+/* postgres can not */
+/* multirun can not */
+use plato;
+
+insert into Output with truncate (a, b) values
+('00', '10'),
+('11', '20'),
+('21', '30'),
+('31', '40'),
+('41', '50');
+
+commit;
+
+insert into Output select * from Output order by a;
+
+commit;
+
+select * from Output where a > '11'
diff --git a/yt/yql/tests/sql/suites/epochs/use_and_drop_anonymous.cfg b/yt/yql/tests/sql/suites/epochs/use_and_drop_anonymous.cfg
new file mode 100644
index 0000000000..2e3eaf9682
--- /dev/null
+++ b/yt/yql/tests/sql/suites/epochs/use_and_drop_anonymous.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+out Output output.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/epochs/use_and_drop_anonymous.sql b/yt/yql/tests/sql/suites/epochs/use_and_drop_anonymous.sql
new file mode 100644
index 0000000000..ee5c907dc9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/epochs/use_and_drop_anonymous.sql
@@ -0,0 +1,21 @@
+/* postgres can not */
+/* multirun can not */
+use plato;
+
+insert into @tmp select * from Input where key > "100";
+commit;
+
+insert into Output
+select * from @tmp where key != "150";
+
+drop table @tmp;
+commit;
+
+insert into @tmp select * from Input where key > "200";
+commit;
+
+insert into Output
+select * from @tmp where key != "150";
+
+drop table @tmp;
+commit;
diff --git a/yt/yql/tests/sql/suites/epochs/use_sorted_by_complex_type.cfg b/yt/yql/tests/sql/suites/epochs/use_sorted_by_complex_type.cfg
new file mode 100644
index 0000000000..fe2b19a9ff
--- /dev/null
+++ b/yt/yql/tests/sql/suites/epochs/use_sorted_by_complex_type.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output output.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/epochs/use_sorted_by_complex_type.sql b/yt/yql/tests/sql/suites/epochs/use_sorted_by_complex_type.sql
new file mode 100644
index 0000000000..28c1f2e062
--- /dev/null
+++ b/yt/yql/tests/sql/suites/epochs/use_sorted_by_complex_type.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+/* multirun can not */
+USE plato;
+
+insert into Output
+select
+ key as key,
+ aggr_list(subkey) as lst
+from Input
+group by key
+order by key, lst;
+
+commit;
+
+select * from Output where key > "150"; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/expr/as_table_emptylist.cfg b/yt/yql/tests/sql/suites/expr/as_table_emptylist.cfg
new file mode 100644
index 0000000000..9b85bd0ae8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/as_table_emptylist.cfg
@@ -0,0 +1 @@
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/expr/as_table_emptylist.sql b/yt/yql/tests/sql/suites/expr/as_table_emptylist.sql
new file mode 100644
index 0000000000..6896846199
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/as_table_emptylist.sql
@@ -0,0 +1,17 @@
+/* syntax version 1 */
+/* postgres can not */
+select * from as_table([]);
+select x+1 from as_table([]);
+select * from as_table([]) order by x limit 5 offset 2;
+select x from as_table([]) order by x;
+select count(*) from as_table([]);
+select x, count(*) from as_table([]) group by x;
+select x, count(*) from as_table([]) group by x having count(x) > 1;
+select lead(x) over w, lag(x) over w, row_number() over w,
+ count(*) over w from as_table([]) window w as ();
+
+select lead(x) over w, lag(x) over w, rank() over w, denserank() over w,
+ count(*) over w from as_table([]) window w as (order by x);
+
+insert into plato.Output
+select * from as_table([]);
diff --git a/yt/yql/tests/sql/suites/expr/constraints_of.cfg b/yt/yql/tests/sql/suites/expr/constraints_of.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/constraints_of.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/expr/constraints_of.sql b/yt/yql/tests/sql/suites/expr/constraints_of.sql
new file mode 100644
index 0000000000..2306ba3532
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/constraints_of.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+pragma warning("disable", "4510");
+use plato;
+
+$foo = select subkey, key, value as v from Input order by subkey asc, key desc limit 0;
+$x = process $foo;
+
+select YQL::ConstraintsOf($x) as constraints;
+
diff --git a/yt/yql/tests/sql/suites/expr/default.cfg b/yt/yql/tests/sql/suites/expr/default.cfg
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/default.cfg
diff --git a/yt/yql/tests/sql/suites/expr/double.txt.attr b/yt/yql/tests/sql/suites/expr/double.txt.attr
new file mode 100644
index 0000000000..f0f906d3f7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/double.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Double"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]]
+}}
diff --git a/yt/yql/tests/sql/suites/expr/double_join_with_list_from_range.cfg b/yt/yql/tests/sql/suites/expr/double_join_with_list_from_range.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/double_join_with_list_from_range.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/expr/double_join_with_list_from_range.sql b/yt/yql/tests/sql/suites/expr/double_join_with_list_from_range.sql
new file mode 100644
index 0000000000..9a430a536d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/double_join_with_list_from_range.sql
@@ -0,0 +1,18 @@
+/* postgres can not */
+$list = select lst, row_number() over (order by lst) as rn from (
+ select * from (
+ select ListFromRange(1us, 333us) as lst
+ ) FLATTEN LIST by lst
+);
+
+$usr = select value, CAST(key AS Uint16) + 3us AS age, CAST(key AS Uint16) + 7us as age1
+from plato.Input;
+
+select
+ u.*,
+ l1.rn as rn1,
+ l2.rn as rn2
+from $usr as u
+join $list as l1 on u.age == l1.lst
+join $list as l2 on u.age1 == l2.lst
+order by value;
diff --git a/yt/yql/tests/sql/suites/expr/empty_iterator.cfg b/yt/yql/tests/sql/suites/expr/empty_iterator.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/empty_iterator.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/expr/empty_iterator.sql b/yt/yql/tests/sql/suites/expr/empty_iterator.sql
new file mode 100644
index 0000000000..0399f810a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/empty_iterator.sql
@@ -0,0 +1,20 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$train =
+SELECT * FROM Input WHERE key > "900" GROUP BY value;
+
+$method = ($stream) -> {
+ $func = Callable(
+ CallableType(0, TypeOf($stream), TypeOf($stream)),
+ ($_1) -> { return $_1; }
+ );
+ RETURN $func($stream);
+};
+
+$prediction =
+ PROCESS $train
+ USING $method(TableRows());
+
+SELECT * FROM $prediction;
diff --git a/yt/yql/tests/sql/suites/expr/empty_iterator2.cfg b/yt/yql/tests/sql/suites/expr/empty_iterator2.cfg
new file mode 100644
index 0000000000..e68191f82c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/empty_iterator2.cfg
@@ -0,0 +1 @@
+in Input input.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/expr/empty_iterator2.sql b/yt/yql/tests/sql/suites/expr/empty_iterator2.sql
new file mode 100644
index 0000000000..39164341d4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/empty_iterator2.sql
@@ -0,0 +1,20 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$train =
+SELECT key, value FROM Input GROUP BY key, value having key > "900";
+
+$method = ($stream) -> {
+ $func = Callable(
+ CallableType(0, TypeOf($stream), TypeOf($stream)),
+ ($_1) -> { return $_1; }
+ );
+ RETURN $func($stream);
+};
+
+$prediction =
+ PROCESS $train
+ USING $method(TableRows());
+
+SELECT * FROM $prediction;
diff --git a/yt/yql/tests/sql/suites/expr/evaluate_parse_inf_nan.cfg b/yt/yql/tests/sql/suites/expr/evaluate_parse_inf_nan.cfg
new file mode 100644
index 0000000000..88d007fa60
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/evaluate_parse_inf_nan.cfg
@@ -0,0 +1,3 @@
+in Input double.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/expr/evaluate_parse_inf_nan.sql b/yt/yql/tests/sql/suites/expr/evaluate_parse_inf_nan.sql
new file mode 100644
index 0000000000..ee49564f89
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/evaluate_parse_inf_nan.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+use plato;
+
+$foo = process Input;
+select ListSort(EvaluateExpr($foo), ($item) -> (AsTuple($item.key, $item.subkey)));
+
diff --git a/yt/yql/tests/sql/suites/expr/inline_call.cfg b/yt/yql/tests/sql/suites/expr/inline_call.cfg
new file mode 100644
index 0000000000..2c6a0d040b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/inline_call.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+udf math_udf
+
diff --git a/yt/yql/tests/sql/suites/expr/inline_call.sql b/yt/yql/tests/sql/suites/expr/inline_call.sql
new file mode 100644
index 0000000000..f93b2b64fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/inline_call.sql
@@ -0,0 +1,28 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+$x = AsStruct(1 as a);
+select $x.a;
+
+$y = AsTuple(2,3);
+select $y.1;
+
+select length("foo");
+
+select Math::Pi();
+
+$f = () -> {
+ return () -> {
+ return AsDict(AsTuple("foo",AsList(AsStruct(AsTuple(1) as bar))));
+ }
+};
+
+select $f()()["foo"][0].bar.0;
+
+select ()->{return 1}();
+
+$type = Callable<()->List<Int32>>;
+$g = AsStruct(Yql::Callable($type, ()->{return AsList(1,2,3)}) as foo);
+
+select $g.foo()[0];
diff --git a/yt/yql/tests/sql/suites/expr/len.cfg b/yt/yql/tests/sql/suites/expr/len.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/len.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/expr/len.sql b/yt/yql/tests/sql/suites/expr/len.sql
new file mode 100644
index 0000000000..9e35dda177
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/len.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT LEN("My String");
+
+SELECT LEN(key) from Input;
diff --git a/yt/yql/tests/sql/suites/expr/non_persistable_group_by_column_fail.cfg b/yt/yql/tests/sql/suites/expr/non_persistable_group_by_column_fail.cfg
new file mode 100644
index 0000000000..4f32e1efb8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/non_persistable_group_by_column_fail.cfg
@@ -0,0 +1,2 @@
+xfail
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/expr/non_persistable_group_by_column_fail.sql b/yt/yql/tests/sql/suites/expr/non_persistable_group_by_column_fail.sql
new file mode 100644
index 0000000000..b20bac6443
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/non_persistable_group_by_column_fail.sql
@@ -0,0 +1,7 @@
+/* custom error:Expected hashable and equatable type for key column: key, but got: Resource<'MTRand'>*/
+PRAGMA Warning("error", '1104');
+
+USE plato;
+
+SELECT COUNT(*) FROM Input
+GROUP BY YQL::NewMTRand(length(value)) as key;
diff --git a/yt/yql/tests/sql/suites/expr/non_persistable_group_by_having_some_fail.cfg b/yt/yql/tests/sql/suites/expr/non_persistable_group_by_having_some_fail.cfg
new file mode 100644
index 0000000000..4f32e1efb8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/non_persistable_group_by_having_some_fail.cfg
@@ -0,0 +1,2 @@
+xfail
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/expr/non_persistable_group_by_having_some_fail.sql b/yt/yql/tests/sql/suites/expr/non_persistable_group_by_having_some_fail.sql
new file mode 100644
index 0000000000..d7e1dba4ad
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/non_persistable_group_by_having_some_fail.sql
@@ -0,0 +1,10 @@
+/* custom error:Persistable required*/
+PRAGMA Warning("error", '1104');
+
+USE plato;
+
+SELECT
+ key
+FROM Input
+GROUP BY key
+HAVING Yql::NextMtRand(SOME(YQL::NewMTRand(1))).0 > 100;
diff --git a/yt/yql/tests/sql/suites/expr/non_persistable_group_by_some_fail.cfg b/yt/yql/tests/sql/suites/expr/non_persistable_group_by_some_fail.cfg
new file mode 100644
index 0000000000..4f32e1efb8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/non_persistable_group_by_some_fail.cfg
@@ -0,0 +1,2 @@
+xfail
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/expr/non_persistable_group_by_some_fail.sql b/yt/yql/tests/sql/suites/expr/non_persistable_group_by_some_fail.sql
new file mode 100644
index 0000000000..9c99d9a10f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/non_persistable_group_by_some_fail.sql
@@ -0,0 +1,7 @@
+/* custom error:Persistable required*/
+PRAGMA Warning("error", '1104');
+
+USE plato;
+
+SELECT SOME(YQL::NewMTRand(1)) FROM Input
+GROUP BY key;
diff --git a/yt/yql/tests/sql/suites/expr/non_persistable_inner_select_fail.cfg b/yt/yql/tests/sql/suites/expr/non_persistable_inner_select_fail.cfg
new file mode 100644
index 0000000000..4f32e1efb8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/non_persistable_inner_select_fail.cfg
@@ -0,0 +1,2 @@
+xfail
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/expr/non_persistable_inner_select_fail.sql b/yt/yql/tests/sql/suites/expr/non_persistable_inner_select_fail.sql
new file mode 100644
index 0000000000..a01042a41c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/non_persistable_inner_select_fail.sql
@@ -0,0 +1,10 @@
+/* custom error:Persistable required*/
+PRAGMA Warning("error", '1104');
+
+USE plato;
+
+SELECT 1 FROM (
+ SELECT
+ YQL::NewMTRand(1) as x
+ FROM Input
+)
diff --git a/yt/yql/tests/sql/suites/expr/non_persistable_insert_into_fail.cfg b/yt/yql/tests/sql/suites/expr/non_persistable_insert_into_fail.cfg
new file mode 100644
index 0000000000..5625fb3b45
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/non_persistable_insert_into_fail.cfg
@@ -0,0 +1,2 @@
+xfail
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/expr/non_persistable_insert_into_fail.sql b/yt/yql/tests/sql/suites/expr/non_persistable_insert_into_fail.sql
new file mode 100644
index 0000000000..56b73236a9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/non_persistable_insert_into_fail.sql
@@ -0,0 +1,9 @@
+/* custom error:Persistable required*/
+PRAGMA Warning("error", '1104');
+
+USE plato;
+
+INSERT INTO
+ Output (key, value)
+VALUES
+ ("foo", YQL::NewMTRand(1));
diff --git a/yt/yql/tests/sql/suites/expr/non_persistable_order_by_fail.cfg b/yt/yql/tests/sql/suites/expr/non_persistable_order_by_fail.cfg
new file mode 100644
index 0000000000..4f32e1efb8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/non_persistable_order_by_fail.cfg
@@ -0,0 +1,2 @@
+xfail
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/expr/non_persistable_order_by_fail.sql b/yt/yql/tests/sql/suites/expr/non_persistable_order_by_fail.sql
new file mode 100644
index 0000000000..d600f8d474
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/non_persistable_order_by_fail.sql
@@ -0,0 +1,7 @@
+/* custom error:Persistable required*/
+PRAGMA Warning("error", '1104');
+
+USE plato;
+
+SELECT key, value FROM Input
+ORDER BY YQL::NewMTRand(length(value));
diff --git a/yt/yql/tests/sql/suites/expr/tagged_runtime.sql b/yt/yql/tests/sql/suites/expr/tagged_runtime.sql
new file mode 100644
index 0000000000..8d185b767e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/tagged_runtime.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+use plato;
+insert into @tmp
+select Just((
+ AsTagged(1,"A"),
+ AsTagged(just(2),"B"),
+ AsTagged(null,"C"),
+ AsTagged(Nothing(Int32?),"D"),
+ AsTagged(Nothing(pgint4?),"E")
+ )) as x;
+commit;
+select x.0, x.1, x.2, x.3, x.4 from @tmp
diff --git a/yt/yql/tests/sql/suites/expr/yql-10180.sql b/yt/yql/tests/sql/suites/expr/yql-10180.sql
new file mode 100644
index 0000000000..9fa1d68e31
--- /dev/null
+++ b/yt/yql/tests/sql/suites/expr/yql-10180.sql
@@ -0,0 +1,23 @@
+/* syntax version 1 */
+USE plato;
+
+$logs_path = "//logs/antirobot-daemon-log2/1d";
+$results_path = "//home/antispam/antirobot/sharding_daily";
+$logs_per_run = 10;
+
+DEFINE SUBQUERY $last_tables($path, $limit) AS
+ SELECT AGGREGATE_LIST(Name)
+ FROM (
+ SELECT ListLast(String::SplitToList(Path, "/")) as Name
+ FROM FOLDER($path)
+ WHERE Type = "table"
+ ORDER BY Name DESC
+ LIMIT $limit
+ )
+END DEFINE;
+
+
+$logs = (SELECT * FROM $last_tables($logs_path, $logs_per_run));
+$processed_logs = (SELECT * FROM $last_tables($results_path, $logs_per_run));
+
+SELECT SetDifference(ToSet($logs), ToSet($processed_logs))
diff --git a/yt/yql/tests/sql/suites/file/bools.lst b/yt/yql/tests/sql/suites/file/bools.lst
new file mode 100644
index 0000000000..f811fea266
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/bools.lst
@@ -0,0 +1,8 @@
+0
+1
+1
+false
+0
+1
+true
+0
diff --git a/yt/yql/tests/sql/suites/file/file_constness.cfg b/yt/yql/tests/sql/suites/file/file_constness.cfg
new file mode 100644
index 0000000000..34dab9d3e0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/file_constness.cfg
@@ -0,0 +1,3 @@
+in Input input_intersect.txt
+file keyid.lst keyid.lst
+udf file_udf
diff --git a/yt/yql/tests/sql/suites/file/file_constness.sql b/yt/yql/tests/sql/suites/file/file_constness.sql
new file mode 100644
index 0000000000..b0adb1b5ee
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/file_constness.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* syntax version 1 */
+select key,
+ FileContent("keyid.lst") as content,
+ ListCollect(ParseFile('int32', "keyid.lst")) as content_list,
+from plato.Input group by key order by key;
diff --git a/yt/yql/tests/sql/suites/file/file_list_simple.cfg b/yt/yql/tests/sql/suites/file/file_list_simple.cfg
new file mode 100644
index 0000000000..9756b704ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/file_list_simple.cfg
@@ -0,0 +1,4 @@
+in Input input_intersect.txt
+file keyid.lst keyid.lst
+udf file_udf
+udf string_udf \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/file/file_list_simple.sql b/yt/yql/tests/sql/suites/file/file_list_simple.sql
new file mode 100644
index 0000000000..aabaacc753
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/file_list_simple.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+/* syntax version 1 */
+-- compiles to different code in v0/v1 due to different SplitToList settings
+select * from plato.Input where key in String::SplitToList(FileContent("keyid.lst"), "\n", true);
diff --git a/yt/yql/tests/sql/suites/file/keyid.lst b/yt/yql/tests/sql/suites/file/keyid.lst
new file mode 100644
index 0000000000..5c9644f627
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/keyid.lst
@@ -0,0 +1,7 @@
+911
+884
+350
+23
+150
+200
+250
diff --git a/yt/yql/tests/sql/suites/file/parse_file_in_select_as_int.cfg b/yt/yql/tests/sql/suites/file/parse_file_in_select_as_int.cfg
new file mode 100644
index 0000000000..0b503dd816
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/parse_file_in_select_as_int.cfg
@@ -0,0 +1,3 @@
+in Input input_intersect.txt
+file keyid.lst keyid.lst
+udf file_udf \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/file/parse_file_in_select_as_int.sql b/yt/yql/tests/sql/suites/file/parse_file_in_select_as_int.sql
new file mode 100644
index 0000000000..ca58dc1af0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/parse_file_in_select_as_int.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select key, value, cast(key as int32) ?? 0 in ParseFile('int32', "keyid.lst") as privilege from plato.Input;
diff --git a/yt/yql/tests/sql/suites/file/parse_file_in_select_as_str.cfg b/yt/yql/tests/sql/suites/file/parse_file_in_select_as_str.cfg
new file mode 100644
index 0000000000..0b503dd816
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/parse_file_in_select_as_str.cfg
@@ -0,0 +1,3 @@
+in Input input_intersect.txt
+file keyid.lst keyid.lst
+udf file_udf \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/file/parse_file_in_select_as_str.sql b/yt/yql/tests/sql/suites/file/parse_file_in_select_as_str.sql
new file mode 100644
index 0000000000..47bf7969a8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/parse_file_in_select_as_str.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select key, value, key in ParseFile('string', "keyid.lst") as privilege from plato.Input;
diff --git a/yt/yql/tests/sql/suites/file/parse_file_in_select_as_uint64.cfg b/yt/yql/tests/sql/suites/file/parse_file_in_select_as_uint64.cfg
new file mode 100644
index 0000000000..34dab9d3e0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/parse_file_in_select_as_uint64.cfg
@@ -0,0 +1,3 @@
+in Input input_intersect.txt
+file keyid.lst keyid.lst
+udf file_udf
diff --git a/yt/yql/tests/sql/suites/file/parse_file_in_select_as_uint64.sql b/yt/yql/tests/sql/suites/file/parse_file_in_select_as_uint64.sql
new file mode 100644
index 0000000000..2e1b948ef1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/parse_file_in_select_as_uint64.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select key, value, cast(key as int32) in ParseFile('uint64', "keyid.lst") as privilege from plato.Input;
diff --git a/yt/yql/tests/sql/suites/file/where_key_in_file_content.cfg b/yt/yql/tests/sql/suites/file/where_key_in_file_content.cfg
new file mode 100644
index 0000000000..34dab9d3e0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/where_key_in_file_content.cfg
@@ -0,0 +1,3 @@
+in Input input_intersect.txt
+file keyid.lst keyid.lst
+udf file_udf
diff --git a/yt/yql/tests/sql/suites/file/where_key_in_file_content.sql b/yt/yql/tests/sql/suites/file/where_key_in_file_content.sql
new file mode 100644
index 0000000000..12579fbf51
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/where_key_in_file_content.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select * from plato.Input where key in ParseFile('String', "keyid.lst");
diff --git a/yt/yql/tests/sql/suites/file/where_key_in_file_content_typed.cfg b/yt/yql/tests/sql/suites/file/where_key_in_file_content_typed.cfg
new file mode 100644
index 0000000000..34dab9d3e0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/where_key_in_file_content_typed.cfg
@@ -0,0 +1,3 @@
+in Input input_intersect.txt
+file keyid.lst keyid.lst
+udf file_udf
diff --git a/yt/yql/tests/sql/suites/file/where_key_in_file_content_typed.sql b/yt/yql/tests/sql/suites/file/where_key_in_file_content_typed.sql
new file mode 100644
index 0000000000..337a419ac5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/where_key_in_file_content_typed.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select * from plato.Input where cast(key as Uint32) in ParseFile('uint32', "keyid.lst");
diff --git a/yt/yql/tests/sql/suites/file/where_key_in_get_file_content.cfg b/yt/yql/tests/sql/suites/file/where_key_in_get_file_content.cfg
new file mode 100644
index 0000000000..9ad7c33313
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/where_key_in_get_file_content.cfg
@@ -0,0 +1,4 @@
+in Input input_intersect.txt
+file keyid.lst keyid.lst
+udf file_udf
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/file/where_key_in_get_file_content.sql b/yt/yql/tests/sql/suites/file/where_key_in_get_file_content.sql
new file mode 100644
index 0000000000..aabaacc753
--- /dev/null
+++ b/yt/yql/tests/sql/suites/file/where_key_in_get_file_content.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+/* syntax version 1 */
+-- compiles to different code in v0/v1 due to different SplitToList settings
+select * from plato.Input where key in String::SplitToList(FileContent("keyid.lst"), "\n", true);
diff --git a/yt/yql/tests/sql/suites/flatten_by/default.cfg b/yt/yql/tests/sql/suites/flatten_by/default.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/default.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_and_where.cfg b/yt/yql/tests/sql/suites/flatten_by/flatten_and_where.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_and_where.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_and_where.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_and_where.sql
new file mode 100644
index 0000000000..df60a53b83
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_and_where.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+$data = (select mod, aggregate_list(value) as lv from plato.Input group by cast(key as uint32) % 10 as mod);
+
+select mod, iv from $data as d flatten by lv as iv where iv < 'd' order by mod, iv;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_by_aster_opt.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_by_aster_opt.sql
new file mode 100644
index 0000000000..7294949685
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_by_aster_opt.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* syntax version 1 */
+select * from (select d.*, Just(key) as ok from plato.Input as d) flatten by ok;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_by_opt_dict.cfg b/yt/yql/tests/sql/suites/flatten_by/flatten_by_opt_dict.cfg
new file mode 100644
index 0000000000..bf1b560b58
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_by_opt_dict.cfg
@@ -0,0 +1 @@
+in Input input_intersect_sorted.txt
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_by_opt_dict.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_by_opt_dict.sql
new file mode 100644
index 0000000000..1182060308
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_by_opt_dict.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+$data_dict = (select mod, Just(ToDict(ListEnumerate(ListTake(ListSort(aggregate_list(key)), 1)))) as dk, ListTake(ListSort(aggregate_list(value)), 1) as lv from plato.Input group by cast(subkey as uint32) % 10 as mod);
+
+select * from $data_dict flatten dict by dk order by mod;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_by_typed_table.cfg b/yt/yql/tests/sql/suites/flatten_by/flatten_by_typed_table.cfg
new file mode 100644
index 0000000000..eaccb9ef55
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_by_typed_table.cfg
@@ -0,0 +1 @@
+in Input typed_table.txt
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_by_typed_table.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_by_typed_table.sql
new file mode 100644
index 0000000000..10cf6ca887
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_by_typed_table.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* syntax version 1 */
+select bb from plato.Input view opt_struct flatten by b as bb;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_columns.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_columns.sql
new file mode 100644
index 0000000000..12fe13e98d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_columns.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+USE plato;
+
+SELECT * FROM (
+SELECT
+ AsStruct(key as key, subkey as subkey),
+ AsStruct("value: " || value as value)
+FROM Input
+)
+FLATTEN COLUMNS;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_columns_by_aggregate.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_columns_by_aggregate.sql
new file mode 100644
index 0000000000..3ab01cc18d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_columns_by_aggregate.sql
@@ -0,0 +1,16 @@
+/* postgres can not */
+USE plato;
+
+$input = (SELECT *
+ FROM (
+ SELECT Unwrap(some(row))
+ FROM (
+ SELECT TableRow() as row
+ FROM Input
+ )
+ ) FLATTEN COLUMNS
+);
+
+--INSERT INTO Output WITH TRUNCATE
+SELECT *
+FROM $input
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_corr_name_column.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_corr_name_column.sql
new file mode 100644
index 0000000000..666a9f5706
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_corr_name_column.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$data = select 1 as n, AsList(4, 5, 6) as l, AsStruct(10 as n, AsList(1, 2, 3) as l) as s union all
+ select 2 as n, AsList(4, 5) as l, AsStruct(20 as n, AsList(1, 2) as l) as s;
+
+select n,l from $data as l flatten by l order by n,l;
+select n,l from $data as l flatten by l.l order by n,l;
+
+select n,l from $data as s flatten by s.l order by n,l;
+select n,newl from $data as s flatten by (s.l as newl) order by n,newl;
+
+select n,l from $data as s flatten by (s.s.l as l) order by n,l;
+
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_dict.cfg b/yt/yql/tests/sql/suites/flatten_by/flatten_dict.cfg
new file mode 100644
index 0000000000..bf1b560b58
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_dict.cfg
@@ -0,0 +1 @@
+in Input input_intersect_sorted.txt
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_dict.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_dict.sql
new file mode 100644
index 0000000000..a9618c7aac
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_dict.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+pragma sampleselect;
+
+$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 plato.Input group by cast(key as uint32) % 10 as mod);
+
+select
+ mod, iv, ls,
+ dd.di.0 as key,
+ dd.di.1 as value
+from $data_dict as dd
+flatten by (dk as di, lv as iv, ls)
+order by mod, iv, ls, key, value;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_dict_by_opt.cfg b/yt/yql/tests/sql/suites/flatten_by/flatten_dict_by_opt.cfg
new file mode 100644
index 0000000000..bf1b560b58
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_dict_by_opt.cfg
@@ -0,0 +1 @@
+in Input input_intersect_sorted.txt
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_dict_by_opt.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_dict_by_opt.sql
new file mode 100644
index 0000000000..79acee152b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_dict_by_opt.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+$data_dict = (select mod, YQL::ToIndexDict(ListTake(ListSort(aggregate_list(Just(key))), 1)) as dk, ListTake(ListSort(aggregate_list(subkey)), 1) as ls from plato.Input group by cast(key as uint32) % 10 as mod);
+
+select * from $data_dict flatten by (dk as di, ls, mod) order by mod;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_expr_join.cfg b/yt/yql/tests/sql/suites/flatten_by/flatten_expr_join.cfg
new file mode 100644
index 0000000000..c1a1de6dd0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_expr_join.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+udf string_udf
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_expr_join.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_expr_join.sql
new file mode 100644
index 0000000000..810c8b615d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_expr_join.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$data = SELECT "075,020,075,020" AS a, "x" AS c;
+
+SELECT * FROM ANY $data as x FLATTEN BY (String::SplitToList(a, ",") as aa) JOIN Input as y ON x.aa = y.key ORDER BY aa;
+
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_expr_struct.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_expr_struct.sql
new file mode 100644
index 0000000000..35ca94eeb8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_expr_struct.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$data = select 1 as n, AsList(4, 5, 6) as l, AsStruct(10 as n, AsList(1, 2, 3) as l) as s union all
+ select 2 as n, AsList(4, 5) as l, AsStruct(20 as n, AsList(1, 2) as l) as s;
+
+select n,l from $data flatten by s.l as l order by n,l;
+select n,l from $data flatten by (s.l as l) order by n,l;
+select n,l from $data flatten by (ListExtend(s.l, AsList(100)) as l) order by n,l;
+
+select n,l,sl from $data flatten by (l, s.l as sl) order by n,l,sl
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_few_fields.cfg b/yt/yql/tests/sql/suites/flatten_by/flatten_few_fields.cfg
new file mode 100644
index 0000000000..bf1b560b58
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_few_fields.cfg
@@ -0,0 +1 @@
+in Input input_intersect_sorted.txt
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_few_fields.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_few_fields.sql
new file mode 100644
index 0000000000..2f7ccd4bbb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_few_fields.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+/* postgres can not */
+pragma sampleselect;
+
+$data_deep = (select mod, aggregate_list(key) as lk, aggregate_list(subkey) as ls, aggregate_list(value) as lv from plato.Input group by cast(key as uint32) % 10 as mod);
+
+-- order to have same results on yamr and yt
+select * from $data_deep flatten by (lk as ik, ls, lv) order by mod, ik, ls, lv;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_list.cfg b/yt/yql/tests/sql/suites/flatten_by/flatten_list.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_list.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_list.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_list.sql
new file mode 100644
index 0000000000..4a7c16bac7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_list.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+$data = (select mod, aggregate_list(value) as lv from plato.Input group by cast(key as uint32) % 10 as mod);
+
+select mod, iv from $data flatten by lv as iv order by mod, iv;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.cfg b/yt/yql/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.cfg
new file mode 100644
index 0000000000..2513e0a9c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.cfg
@@ -0,0 +1 @@
+in Input flatten_list_on_flatten_by.txt
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.sql
new file mode 100644
index 0000000000..dfb14aea15
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.sql
@@ -0,0 +1,22 @@
+/* syntax version 1 */
+USE plato;
+
+$flatten = (
+ SELECT
+ answer_and_clicks.0 AS permalink,
+ bc_type_tuple
+ FROM Input AS a
+ FLATTEN BY parsed_answers_and_clicks as answer_and_clicks
+ WHERE answer_and_clicks.1 = 1
+);
+
+SELECT
+ bc_type,
+ permalink,
+FROM (
+ SELECT
+ asList(bc_type_tuple.0, 'total') as bc_type,
+ a.* WITHOUT bc_type_tuple
+ FROM $flatten as a
+ )
+FLATTEN LIST BY bc_type;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.txt.attr b/yt/yql/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.txt.attr
new file mode 100644
index 0000000000..1f5a7568d4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.txt.attr
@@ -0,0 +1,55 @@
+{
+"_yql_row_spec"= {
+ "StrictSchema"= true;
+"Type"= [
+ "StructType";
+ [
+ [
+ "bc_type_tuple";
+ [
+ "TupleType";
+ [
+ [
+ "DataType";
+ "String"
+ ];
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ];
+ [
+ "parsed_answers_and_clicks";
+ [
+ "ListType";
+ [
+ "TupleType";
+ [
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Int64"
+ ]
+ ];
+ [
+ "DataType";
+ "Int32"
+ ];
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ };
+}
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_member_is_struct.cfg b/yt/yql/tests/sql/suites/flatten_by/flatten_member_is_struct.cfg
new file mode 100644
index 0000000000..ff4186ea03
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_member_is_struct.cfg
@@ -0,0 +1 @@
+in Input input_opt_struct_field.txt
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_member_is_struct.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_member_is_struct.sql
new file mode 100644
index 0000000000..20bcbb42be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_member_is_struct.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+USE plato;
+
+--INSERT INTO Output
+SELECT
+ countIf(kkstritem % 10 == 0) as count_dec,
+ countIf(kkstritem < 100) as count_small,
+ countIf(kkstritem > 900) as count_huge
+FROM (
+ SELECT keyitem.kk as kkstr FROM Input as d FLATTEN BY key as keyitem
+)
+FLATTEN BY kkstr as kkstritem
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_mode.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_mode.sql
new file mode 100644
index 0000000000..655c4940e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_mode.sql
@@ -0,0 +1,40 @@
+/* postgres can not */
+USE plato;
+
+SELECT
+ *
+FROM (SELECT Just(1) AS x)
+FLATTEN OPTIONAL BY x;
+
+$lst = AsList(1,2,3);
+SELECT
+ *
+FROM (SELECT $lst AS x)
+FLATTEN LIST BY x ORDER BY x;
+
+SELECT
+ x
+FROM (SELECT Just($lst) AS x)
+FLATTEN LIST BY x ORDER BY x;
+
+SELECT
+ *
+FROM (SELECT Just($lst) AS x)
+FLATTEN OPTIONAL BY x ORDER BY x;
+
+$dct = AsDict(AsTuple(1,"foo"),AsTuple(2,"bar"),AsTuple(3,"baz"));
+
+SELECT
+ *
+FROM (SELECT $dct AS x)
+FLATTEN DICT BY x ORDER BY x;
+
+SELECT
+ x
+FROM (SELECT Just($dct) AS x)
+FLATTEN DICT BY x ORDER BY x;
+
+SELECT
+ ListSort(DictItems(x))
+FROM (SELECT Just($dct) AS x)
+FLATTEN OPTIONAL BY x;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_one_field.cfg b/yt/yql/tests/sql/suites/flatten_by/flatten_one_field.cfg
new file mode 100644
index 0000000000..bf1b560b58
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_one_field.cfg
@@ -0,0 +1 @@
+in Input input_intersect_sorted.txt
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_one_field.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_one_field.sql
new file mode 100644
index 0000000000..c96cad25fb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_one_field.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+$data = (select mod, aggregate_list(value) as lv from plato.Input group by cast(key as uint32) % 10 as mod);
+
+select * from $data flatten by lv as iv order by iv;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_one_field_another.cfg b/yt/yql/tests/sql/suites/flatten_by/flatten_one_field_another.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_one_field_another.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_one_field_another.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_one_field_another.sql
new file mode 100644
index 0000000000..6145dcecbd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_one_field_another.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+$data = (select mod, aggregate_list(value) as lv from plato.Input group by cast(key as uint32) % 10 as mod);
+
+select d.lv, d.mod from $data as d flatten by (lv) order by lv;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_two_fields.cfg b/yt/yql/tests/sql/suites/flatten_by/flatten_two_fields.cfg
new file mode 100644
index 0000000000..bf1b560b58
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_two_fields.cfg
@@ -0,0 +1 @@
+in Input input_intersect_sorted.txt
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_two_fields.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_two_fields.sql
new file mode 100644
index 0000000000..85633c4ae5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_two_fields.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+$data_deep = (select mod, aggregate_list(key) as lk, aggregate_list(subkey) as ls, aggregate_list(value) as lv from plato.Input group by cast(key as uint32) % 10 as mod);
+
+select * from $data_deep flatten by (lk as ik, lv) order by ik, lv, mod;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_with_group_by.cfg b/yt/yql/tests/sql/suites/flatten_by/flatten_with_group_by.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_with_group_by.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_with_group_by.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_with_group_by.sql
new file mode 100644
index 0000000000..9d68c54e9f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_with_group_by.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+$data_deep = (select mod, aggregate_list(cast(key as uint32)) as lk, aggregate_list(cast(subkey as uint32)) as ls, Count(*) as cc from plato.Input group by cast(key as uint32) % 10 as mod);
+
+select sum(cc) as sc, sum(mod) as sm from $data_deep as d flatten by (lk as itk, ls as its) group by its + itk as ss order by sc, sm;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_with_group_by_expr.cfg b/yt/yql/tests/sql/suites/flatten_by/flatten_with_group_by_expr.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_with_group_by_expr.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_with_group_by_expr.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_with_group_by_expr.sql
new file mode 100644
index 0000000000..cb6da4021f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_with_group_by_expr.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+$data_deep = (select mod, aggregate_list(cast(key as uint32)) as lk, aggregate_list(cast(subkey as uint32)) as ls, Count(*) as cc from plato.Input group by cast(key as uint32) % 10 as mod);
+
+select ss, sum(cc) as sc, sum(mod) as sm from $data_deep as d flatten by (lk as itk, ls as its) group by its + itk as ss order by ss;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_with_join.cfg b/yt/yql/tests/sql/suites/flatten_by/flatten_with_join.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_with_join.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_with_join.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_with_join.sql
new file mode 100644
index 0000000000..b7139810ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_with_join.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+/* postgres can not */
+$data = (select mod, aggregate_list(value) as lv from plato.Input group by cast(key as uint32) % 10 as mod);
+
+select d.mod, d.lv, j.key
+from $data as d
+flatten by lv
+join plato.Input as j on d.mod == cast(j.key as uint32) / 10 % 10
+order by d.mod, d.lv;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_with_resource.cfg b/yt/yql/tests/sql/suites/flatten_by/flatten_with_resource.cfg
new file mode 100644
index 0000000000..289c4251bb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_with_resource.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf python3_udf
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_with_resource.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_with_resource.sql
new file mode 100644
index 0000000000..8dda0726f4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_with_resource.sql
@@ -0,0 +1,19 @@
+/* postgres can not */
+/* kikimr can not */
+/* syntax version 1 */
+$script = @@
+def save(item):
+ return item
+
+def load(item):
+ return item
+@@;
+
+$save = Python3::save(Callable<(String)->Resource<Python3>>, $script);
+$load = Python3::load(Callable<(Resource<Python3>)->String>, $script);
+
+$input = (
+ SELECT key, AsList($save(value), $save(subkey)) AS resourceList FROM plato.Input
+);
+
+SELECT key, $load(resourceList) AS value FROM $input FLATTEN BY resourceList;
diff --git a/yt/yql/tests/sql/suites/flatten_by/flatten_with_subquery.sql b/yt/yql/tests/sql/suites/flatten_by/flatten_with_subquery.sql
new file mode 100644
index 0000000000..ac7cab2094
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/flatten_with_subquery.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+/* postgres can not */
+
+define subquery $bar() as
+ select [1,2] as ks;
+end define;
+
+select key from $bar() flatten list by ks as key order by key;
+select key from $bar() flatten list by (ListExtend(ks, [3]) as key) order by key;
diff --git a/yt/yql/tests/sql/suites/flatten_by/input_opt_struct_field.txt.attr b/yt/yql/tests/sql/suites/flatten_by/input_opt_struct_field.txt.attr
new file mode 100644
index 0000000000..b5a76775f2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/input_opt_struct_field.txt.attr
@@ -0,0 +1,11 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["OptionalType";["StructType";[
+ ["kk";["OptionalType";["DataType";"Uint32"]]];
+ ]]]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]];
+ ]];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/flatten_by/struct_without_correlation.sql b/yt/yql/tests/sql/suites/flatten_by/struct_without_correlation.sql
new file mode 100644
index 0000000000..b280873d88
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/struct_without_correlation.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+pragma sampleselect;
+use plato;
+
+$data_dict = (select mod, aggregate_list(AsStruct(key as `struct`, subkey as subkey)) as list_struct from Input group by cast(key as uint32) % 10 as mod);
+
+--insert into plato.Output
+select
+ mod, `struct`.`struct`
+from $data_dict as dd
+flatten by list_struct as `struct`
+order by mod, column1;
+--order by mod, iv, ls;
diff --git a/yt/yql/tests/sql/suites/flatten_by/typed_table.txt.attr b/yt/yql/tests/sql/suites/flatten_by/typed_table.txt.attr
new file mode 100644
index 0000000000..67a1eb4bde
--- /dev/null
+++ b/yt/yql/tests/sql/suites/flatten_by/typed_table.txt.attr
@@ -0,0 +1,31 @@
+{
+ "_yql_view_opt_struct"="SELECT YQL::AsList(1,2,3) as b FROM self;";
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/hor_join/default.cfg b/yt/yql/tests/sql/suites/hor_join/default.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/default.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/hor_join/double_input.sql b/yt/yql/tests/sql/suites/hor_join/double_input.sql
new file mode 100644
index 0000000000..33eb738f9d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/double_input.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+/* kikimr can not */
+
+SELECT * FROM (
+ SELECT key, value || "a" as value FROM plato.Input
+ union all
+ SELECT key, "1" as value from plato.Input
+ union all
+ SELECT key, "1" as value from plato.Input
+ union all
+ SELECT key, "3" as value from plato.Input
+) AS x
+ORDER BY key, value
+;
diff --git a/yt/yql/tests/sql/suites/hor_join/empty_out_hor_join.sql b/yt/yql/tests/sql/suites/hor_join/empty_out_hor_join.sql
new file mode 100644
index 0000000000..347407a3be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/empty_out_hor_join.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+
+USE plato;
+
+$i = (select * from Input where key == "0" order by key limit 100);
+
+select key, some(value) from $i group by key;
+select key, some(subkey) from $i group by key;
diff --git a/yt/yql/tests/sql/suites/hor_join/filters.cfg b/yt/yql/tests/sql/suites/hor_join/filters.cfg
new file mode 100644
index 0000000000..9b1926e035
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/filters.cfg
@@ -0,0 +1,2 @@
+in Input1 input.txt
+in Input2 input.txt
diff --git a/yt/yql/tests/sql/suites/hor_join/filters.sql b/yt/yql/tests/sql/suites/hor_join/filters.sql
new file mode 100644
index 0000000000..dfb4317e24
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/filters.sql
@@ -0,0 +1,8 @@
+USE plato;
+
+SELECT * FROM (
+ SELECT key, value FROM plato.Input1 where key > "010"
+ UNION ALL
+ SELECT key, value FROM plato.Input2 where key > "020"
+) AS x ORDER BY key, value
+;
diff --git a/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs1-outlimit.cfg b/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs1-outlimit.cfg
new file mode 100644
index 0000000000..35111685c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs1-outlimit.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+providers yt
+pragma yt.MaxOutputTables="2"
diff --git a/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs1.cfg b/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs1.cfg
new file mode 100644
index 0000000000..1f1d2747db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs1.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs1.sql b/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs1.sql
new file mode 100644
index 0000000000..4846907f41
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs1.sql
@@ -0,0 +1,41 @@
+use plato;
+
+$udf = YQL::@@(lambda '(flow)
+(Map flow
+ (lambda '(item) (block '(
+ (let varTuple (VariantType (TupleType
+ (StructType
+ '('key (DataType 'String))
+ '('subkey (DataType 'String))
+ '('value (DataType 'String))
+ )
+ (StructType
+ '('key (DataType 'String))
+ '('subkey (DataType 'String))
+ '('value (DataType 'String))
+ )
+ )))
+ (let intValue (FromString (Member item 'key) 'Int32))
+ (let res
+ (If (Coalesce (Equal (% intValue (Int32 '2)) (Int32 '0)) (Bool 'false))
+ (Variant item '0 varTuple)
+ (Variant item '1 varTuple)
+ )
+ )
+ (return res)
+ )))
+))@@;
+
+$i, $j = (PROCESS Input USING $udf(TableRows()));
+
+select key, value from $i where key > "100"
+order by key;
+
+insert into @a
+select * from $j;
+
+insert into @b
+select key from $i where key > "200";
+
+insert into @c
+select key from $j where key > "300";
diff --git a/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs2-outlimit.cfg b/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs2-outlimit.cfg
new file mode 100644
index 0000000000..35111685c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs2-outlimit.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+providers yt
+pragma yt.MaxOutputTables="2"
diff --git a/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs2.cfg b/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs2.cfg
new file mode 100644
index 0000000000..1f1d2747db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs2.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs2.sql b/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs2.sql
new file mode 100644
index 0000000000..02de4aae7b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/fuse_multi_outs2.sql
@@ -0,0 +1,38 @@
+use plato;
+
+$udf = YQL::@@(lambda '(flow)
+(Map flow
+ (lambda '(item) (block '(
+ (let varTuple (VariantType (TupleType
+ (StructType
+ '('key (DataType 'String))
+ '('subkey (DataType 'String))
+ '('value (DataType 'String))
+ )
+ (StructType
+ '('key (DataType 'String))
+ '('subkey (DataType 'String))
+ '('value (DataType 'String))
+ )
+ )))
+ (let intValue (FromString (Member item 'key) 'Int32))
+ (let res
+ (If (Coalesce (Equal (% intValue (Int32 '2)) (Int32 '0)) (Bool 'false))
+ (Variant item '0 varTuple)
+ (Variant item '1 varTuple)
+ )
+ )
+ (return res)
+ )))
+))@@;
+
+$i, $j = (PROCESS Input USING $udf(TableRows()));
+
+select key, value from $i where key > "100"
+order by key;
+
+insert into @a
+select * from $j;
+
+insert into @b
+select key from $j where key > "200";
diff --git a/yt/yql/tests/sql/suites/hor_join/fuse_multi_usage-outlimit.cfg b/yt/yql/tests/sql/suites/hor_join/fuse_multi_usage-outlimit.cfg
new file mode 100644
index 0000000000..35111685c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/fuse_multi_usage-outlimit.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+providers yt
+pragma yt.MaxOutputTables="2"
diff --git a/yt/yql/tests/sql/suites/hor_join/fuse_multi_usage.cfg b/yt/yql/tests/sql/suites/hor_join/fuse_multi_usage.cfg
new file mode 100644
index 0000000000..1f1d2747db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/fuse_multi_usage.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/hor_join/fuse_multi_usage.sql b/yt/yql/tests/sql/suites/hor_join/fuse_multi_usage.sql
new file mode 100644
index 0000000000..630c5285d0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/fuse_multi_usage.sql
@@ -0,0 +1,12 @@
+USE plato;
+
+$input = select key, some(subkey) as subkey, some(value) as value from Input group by key;
+
+select key from $input where subkey > "0"
+order by key;
+
+insert into @a
+select t.*, RandomNumber(TableRow()) as rnd from $input as t where value > "a";
+
+insert into @b
+select * from $input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/hor_join/group_ranges.cfg b/yt/yql/tests/sql/suites/hor_join/group_ranges.cfg
new file mode 100644
index 0000000000..c9c5c39ac1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/group_ranges.cfg
@@ -0,0 +1,4 @@
+in Input1 input.txt
+in Input2 input.txt
+in Input3 input.txt
+in Input4 input.txt
diff --git a/yt/yql/tests/sql/suites/hor_join/group_ranges.sql b/yt/yql/tests/sql/suites/hor_join/group_ranges.sql
new file mode 100644
index 0000000000..25d8e78cd4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/group_ranges.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+/* kikimr can not */
+USE plato;
+
+$i = (SELECT * FROM plato.range(``, Input1, Input4));
+
+SELECT * FROM (
+ SELECT 1 as key, subkey, value FROM $i
+ UNION ALL
+ SELECT 2 as key, subkey, value FROM $i
+) AS x
+ORDER BY key, subkey, value
+; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/hor_join/group_sampling.cfg b/yt/yql/tests/sql/suites/hor_join/group_sampling.cfg
new file mode 100644
index 0000000000..c9c5c39ac1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/group_sampling.cfg
@@ -0,0 +1,4 @@
+in Input1 input.txt
+in Input2 input.txt
+in Input3 input.txt
+in Input4 input.txt
diff --git a/yt/yql/tests/sql/suites/hor_join/group_sampling.sql b/yt/yql/tests/sql/suites/hor_join/group_sampling.sql
new file mode 100644
index 0000000000..45d57fc7d5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/group_sampling.sql
@@ -0,0 +1,17 @@
+/* postgres can not */
+/* kikimr can not */
+/* hybridfile can not YQL-17284 */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 16 */
+USE plato;
+
+SELECT * FROM (
+ SELECT CAST(key AS int) as key, '' as subkey, '' as value FROM plato.Input1 SAMPLE 0.1
+ UNION ALL
+ SELECT CAST(key AS int) as key, subkey, '' as value FROM plato.Input2 SAMPLE 0.1
+ UNION ALL
+ SELECT 1 as key, subkey, '' as value from plato.Input3
+ UNION ALL
+ SELECT 1 as key, '' as subkey, value from plato.Input4
+) AS x
+ORDER BY key, subkey, value
+;
diff --git a/yt/yql/tests/sql/suites/hor_join/group_yamr.cfg b/yt/yql/tests/sql/suites/hor_join/group_yamr.cfg
new file mode 100644
index 0000000000..280feec6cc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/group_yamr.cfg
@@ -0,0 +1,4 @@
+in Input1 input.txt
+in Input2 input.txt
+in Input3 yamred_dsv.txt yamred_dsv
+in Input4 yamred_dsv.txt yamred_dsv
diff --git a/yt/yql/tests/sql/suites/hor_join/group_yamr.sql b/yt/yql/tests/sql/suites/hor_join/group_yamr.sql
new file mode 100644
index 0000000000..d781971f1e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/group_yamr.sql
@@ -0,0 +1,13 @@
+USE plato;
+
+SELECT * FROM (
+ SELECT 1 as key, subkey, '' as value from plato.Input1
+ UNION ALL
+ SELECT 2 as key, '' as subkey, value from plato.Input2
+ UNION ALL
+ SELECT 3 as key, subkey, '' as value from plato.Input3
+ UNION ALL
+ SELECT 4 as key, '' as subkey, value from plato.Input4
+) AS x
+ORDER BY key, subkey, value
+;
diff --git a/yt/yql/tests/sql/suites/hor_join/input.txt.attr b/yt/yql/tests/sql/suites/hor_join/input.txt.attr
new file mode 100644
index 0000000000..b6100e5fd0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/input.txt.attr
@@ -0,0 +1,30 @@
+{
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/hor_join/less_outs.cfg b/yt/yql/tests/sql/suites/hor_join/less_outs.cfg
new file mode 100644
index 0000000000..a06e20d35e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/less_outs.cfg
@@ -0,0 +1,7 @@
+in Input1 input.txt
+in Input2 input.txt
+in Input3 input.txt
+in Input4 input.txt
+in Input5 input.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/hor_join/less_outs.sql b/yt/yql/tests/sql/suites/hor_join/less_outs.sql
new file mode 100644
index 0000000000..a8594fe2dd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/less_outs.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+
+$i1 = SELECT CAST(key AS Int32) ?? 0 as key, '' as value FROM plato.Input1;
+$i2 = SELECT 0 as key, value from plato.Input2 UNION ALL SELECT 1 as key, value from plato.Input3;
+$i3 = (SELECT 2 as key, value from plato.Input4 UNION ALL SELECT 3 as key, value from plato.Input5);
+
+$udf = ($x) -> { return Yql::VariantItem($x) };
+
+PROCESS $i1, $i2, $i3 using $udf(TableRow());
diff --git a/yt/yql/tests/sql/suites/hor_join/max_in_tables.cfg b/yt/yql/tests/sql/suites/hor_join/max_in_tables.cfg
new file mode 100644
index 0000000000..1d540ef27f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/max_in_tables.cfg
@@ -0,0 +1,5 @@
+in Input1 input.txt
+in Input2 input.txt
+in Input3 input.txt
+in Input4 input.txt
+in Input5 input.txt
diff --git a/yt/yql/tests/sql/suites/hor_join/max_in_tables.sql b/yt/yql/tests/sql/suites/hor_join/max_in_tables.sql
new file mode 100644
index 0000000000..684ceb32fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/max_in_tables.sql
@@ -0,0 +1,17 @@
+/* postgres can not */
+/* kikimr can not */
+pragma yt.MaxInputTables="3";
+
+SELECT * FROM (
+ SELECT CAST(key AS int) as key, '' as value FROM plato.Input1
+ UNION ALL
+ SELECT 0 as key, value from plato.Input2
+ UNION ALL
+ SELECT 1 as key, value from plato.Input3
+ UNION ALL
+ SELECT 2 as key, value from plato.Input4
+ UNION ALL
+ SELECT 3 as key, value from plato.Input5
+) AS x
+ORDER BY key, value
+;
diff --git a/yt/yql/tests/sql/suites/hor_join/max_outtables.cfg b/yt/yql/tests/sql/suites/hor_join/max_outtables.cfg
new file mode 100644
index 0000000000..a06e20d35e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/max_outtables.cfg
@@ -0,0 +1,7 @@
+in Input1 input.txt
+in Input2 input.txt
+in Input3 input.txt
+in Input4 input.txt
+in Input5 input.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/hor_join/max_outtables.sql b/yt/yql/tests/sql/suites/hor_join/max_outtables.sql
new file mode 100644
index 0000000000..0ce459d466
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/max_outtables.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+/* kikimr can not */
+pragma yt.MaxOutputTables="3";
+
+$i1 = (SELECT CAST(key AS Int32) ?? 0 as key, '' as value FROM plato.Input1);
+$i2 = (SELECT 0 as key, value from plato.Input2);
+$i3 = (SELECT 1 as key, value from plato.Input3);
+$i4 = (SELECT 2 as key, value from plato.Input4);
+$i5 = (SELECT 3 as key, value from plato.Input5);
+
+
+$udf = ($x) -> { return Yql::VariantItem($x) };
+
+PROCESS $i1, $i2, $i3, $i4, $i5 using $udf(TableRow());
diff --git a/yt/yql/tests/sql/suites/hor_join/merge_multiouts_all.cfg b/yt/yql/tests/sql/suites/hor_join/merge_multiouts_all.cfg
new file mode 100644
index 0000000000..b9e77a0bd0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/merge_multiouts_all.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+out Output output.txt
+res result.txt
+udf python2_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/hor_join/merge_multiouts_all.sql b/yt/yql/tests/sql/suites/hor_join/merge_multiouts_all.sql
new file mode 100644
index 0000000000..f413af69ee
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/merge_multiouts_all.sql
@@ -0,0 +1,43 @@
+use plato;
+
+/* syntax version 1 */
+/* postgres can not */
+$udfScript = @@
+def MyFunc(list):
+ return [(int(x.key) % 4, x) for x in list]
+@@;
+
+$record = (SELECT TableRow() FROM Input);
+$recordType =TypeOf(Unwrap($record));
+
+$udf = Python::MyFunc(
+ CallableType(0,
+ StreamType(
+ VariantType(TupleType($recordType, $recordType, $recordType, $recordType))
+ ),
+ StreamType($recordType)),
+ $udfScript
+);
+
+$i0, $i1, $i2, $i3 = (PROCESS Input USING $udf(TableRows()));
+
+select * from (
+ select * from $i0
+ union all
+ select * from $i1
+ union all
+ select * from $i2
+ union all
+ select * from $i3
+) order by key;
+
+insert into Output
+select * from (
+ select * from $i0
+ union all
+ select * from $i1
+ union all
+ select * from $i2
+ union all
+ select * from $i3
+);
diff --git a/yt/yql/tests/sql/suites/hor_join/merge_multiouts_part.cfg b/yt/yql/tests/sql/suites/hor_join/merge_multiouts_part.cfg
new file mode 100644
index 0000000000..b9e77a0bd0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/merge_multiouts_part.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+out Output output.txt
+res result.txt
+udf python2_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/hor_join/merge_multiouts_part.sql b/yt/yql/tests/sql/suites/hor_join/merge_multiouts_part.sql
new file mode 100644
index 0000000000..640fd4a086
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/merge_multiouts_part.sql
@@ -0,0 +1,39 @@
+use plato;
+
+/* syntax version 1 */
+/* postgres can not */
+$udfScript = @@
+def MyFunc(list):
+ return [(int(x.key) % 4, x) for x in list]
+@@;
+
+$record = (SELECT TableRow() FROM plato.Input);
+$recordType =TypeOf(Unwrap($record));
+
+$udf = Python::MyFunc(
+ CallableType(0,
+ StreamType(
+ VariantType(TupleType($recordType, $recordType, $recordType, $recordType))
+ ),
+ StreamType($recordType)),
+ $udfScript
+);
+
+$i0, $i1, $i2, $i3 = (PROCESS plato.Input USING $udf(TableRows()));
+
+select * from (
+ select * from $i0
+ union all
+ select * from $i1
+ union all
+ select * from $i2
+) order by key;
+
+insert into Output
+select * from (
+ select * from $i1
+ union all
+ select * from $i2
+ union all
+ select * from $i3
+);
diff --git a/yt/yql/tests/sql/suites/hor_join/merge_multiouts_reuse.cfg b/yt/yql/tests/sql/suites/hor_join/merge_multiouts_reuse.cfg
new file mode 100644
index 0000000000..b9e77a0bd0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/merge_multiouts_reuse.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+out Output output.txt
+res result.txt
+udf python2_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/hor_join/merge_multiouts_reuse.sql b/yt/yql/tests/sql/suites/hor_join/merge_multiouts_reuse.sql
new file mode 100644
index 0000000000..d0068e031c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/merge_multiouts_reuse.sql
@@ -0,0 +1,43 @@
+use plato;
+
+/* syntax version 1 */
+/* postgres can not */
+$udfScript = @@
+def MyFunc(list):
+ return [(int(x.key) % 4, x) for x in list]
+@@;
+
+$record = (SELECT TableRow() FROM Input);
+$recordType =TypeOf(Unwrap($record));
+
+$udf = Python::MyFunc(
+ CallableType(0,
+ StreamType(
+ VariantType(TupleType($recordType, $recordType, $recordType, $recordType))
+ ),
+ StreamType($recordType)),
+ $udfScript
+);
+
+$i0, $i1, $i2, $i3 = (PROCESS Input USING $udf(TableRows()));
+
+select * from (
+ select * from $i0
+ union all
+ select * from $i1
+ union all
+ select * from $i2
+ union all
+ select * from $i0
+) order by key;
+
+insert into Output
+select * from (
+ select * from $i3
+ union all
+ select * from $i1
+ union all
+ select * from $i2
+ union all
+ select * from $i3
+);
diff --git a/yt/yql/tests/sql/suites/hor_join/nonstrict.txt.attr b/yt/yql/tests/sql/suites/hor_join/nonstrict.txt.attr
new file mode 100644
index 0000000000..49d98771a8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/nonstrict.txt.attr
@@ -0,0 +1,17 @@
+{
+ "_read_schema" = <"strict" = %false>[
+ {"type"="string";"name"="key"};
+ {"type"="string";"name"="subkey"};
+ ];
+ "schema" = <"strict" = %false; "unique_keys" = %false>
+ [
+ {
+ "name" = "key";
+ "type" = "string"
+ };
+ {
+ "name" = "subkey";
+ "type" = "string"
+ }
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/hor_join/out_hor_join.sql b/yt/yql/tests/sql/suites/hor_join/out_hor_join.sql
new file mode 100644
index 0000000000..0e410fbb55
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/out_hor_join.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+USE plato;
+
+$i = (SELECT * FROM Input WHERE key < "900");
+
+SELECT key, some(value) as s FROM $i GROUP BY key ORDER BY key, s;
+
+SELECT key, sum(cast(subkey as Int32)) as s FROM $i GROUP BY key ORDER BY key, s;
+
+SELECT key, some(subkey) as s FROM $i GROUP BY key ORDER BY key, s;
diff --git a/yt/yql/tests/sql/suites/hor_join/out_max_outtables.sql b/yt/yql/tests/sql/suites/hor_join/out_max_outtables.sql
new file mode 100644
index 0000000000..399028196d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/out_max_outtables.sql
@@ -0,0 +1,18 @@
+/* postgres can not */
+/* kikimr can not */
+pragma yt.MaxOutputTables="3";
+pragma yt.DisableOptimizers="HorizontalJoin,MultiHorizontalJoin";
+
+SELECT * FROM (
+ SELECT CAST(key AS int) as key, '' as value FROM plato.Input
+ UNION ALL
+ SELECT 0 as key, value from plato.Input
+ UNION ALL
+ SELECT 1 as key, value from plato.Input
+ UNION ALL
+ SELECT 2 as key, value from plato.Input
+ UNION ALL
+ SELECT 3 as key, value from plato.Input
+) AS x
+ORDER BY key, value
+;
diff --git a/yt/yql/tests/sql/suites/hor_join/out_mem_limit.sql b/yt/yql/tests/sql/suites/hor_join/out_mem_limit.sql
new file mode 100644
index 0000000000..508ddfd6cd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/out_mem_limit.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+/* kikimr can not - yt pragma */
+USE plato;
+
+PRAGMA yt.MaxExtraJobMemoryToFuseOperations="550m";
+PRAGMA yt.CombineCoreLimit="128m";
+
+$i = (SELECT * FROM Input WHERE key < "900");
+
+SELECT key, sum(cast(subkey as Int32)) as s FROM $i GROUP BY key ORDER BY key, s;
+
+SELECT key, some(subkey) as s FROM $i GROUP BY key ORDER by key, s;
+
+SELECT key, some(value) as s FROM $i GROUP BY key ORDER BY key, s;
diff --git a/yt/yql/tests/sql/suites/hor_join/out_range.sql b/yt/yql/tests/sql/suites/hor_join/out_range.sql
new file mode 100644
index 0000000000..c734fd9441
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/out_range.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+USE plato;
+
+SELECT key, some(value) as s FROM Input GROUP BY key ORDER BY key, s;
+
+SELECT key, sum(cast(subkey as Int32)) as s FROM Input WHERE key > "100" GROUP BY key ORDER BY key, s;
+
+SELECT key, some(subkey) as s FROM Input WHERE key > "100" GROUP BY key ORDER BY key, s;
diff --git a/yt/yql/tests/sql/suites/hor_join/out_sampling.cfg b/yt/yql/tests/sql/suites/hor_join/out_sampling.cfg
new file mode 100644
index 0000000000..a654f9117d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/out_sampling.cfg
@@ -0,0 +1 @@
+in Input input1.txt
diff --git a/yt/yql/tests/sql/suites/hor_join/out_sampling.sql b/yt/yql/tests/sql/suites/hor_join/out_sampling.sql
new file mode 100644
index 0000000000..ec303c6cdc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/out_sampling.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+/* kikimr can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) == 10 and len(yt_res_yson[1][b'Write'][0][b'Data']) < 10 and len(yt_res_yson[2][b'Write'][0][b'Data']) < 10 and len(yt_res_yson[3][b'Write'][0][b'Data']) == 10 */
+USE plato;
+
+SELECT key, some(value) FROM Input GROUP BY key;
+
+SELECT key, sum(cast(subkey as Int32)) FROM Input SAMPLE 0.3 GROUP BY key;
+
+SELECT key, some(subkey) FROM Input SAMPLE 0.3 GROUP BY key;
+
+SELECT key, sum(length(value)) FROM Input GROUP BY key;
diff --git a/yt/yql/tests/sql/suites/hor_join/out_table_record.sql b/yt/yql/tests/sql/suites/hor_join/out_table_record.sql
new file mode 100644
index 0000000000..25cc1dcc62
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/out_table_record.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+pragma yt.DisableOptimizers="HorizontalJoin,MultiHorizontalJoin";
+
+SELECT * FROM (
+ select key, TableRecordIndex() as record, TablePath() as path from Input
+ union all
+ select key, TableRecordIndex() as record, "d" as path from Input
+) AS x
+ORDER BY key, record, path
+;
diff --git a/yt/yql/tests/sql/suites/hor_join/row_num_per_sect.cfg b/yt/yql/tests/sql/suites/hor_join/row_num_per_sect.cfg
new file mode 100644
index 0000000000..2d1eb20046
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/row_num_per_sect.cfg
@@ -0,0 +1,2 @@
+in Input1 nonstrict.txt
+in Input2 input.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/hor_join/row_num_per_sect.sql b/yt/yql/tests/sql/suites/hor_join/row_num_per_sect.sql
new file mode 100644
index 0000000000..e3477cc693
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/row_num_per_sect.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* kikimr can not */
+/* syntax version 1 */
+USE plato;
+
+$with_row1 = (SELECT t.*, ROW_NUMBER() OVER () as row_num FROM Input1 as t);
+$with_row2 = (SELECT t.*, ROW_NUMBER() OVER () as row_num FROM Input2 as t);
+
+SELECT a.key as key, b.subkey as subkey, b.value as value FROM $with_row1 as a LEFT JOIN $with_row2 as b USING(row_num);
diff --git a/yt/yql/tests/sql/suites/hor_join/runtime_dep.sql b/yt/yql/tests/sql/suites/hor_join/runtime_dep.sql
new file mode 100644
index 0000000000..183635ba58
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/runtime_dep.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+use plato;
+
+INSERT INTO @ttt WITH TRUNCATE
+SELECT CAST(key AS int) as key, subkey, value FROM Input;
+
+COMMIT;
+
+SELECT * FROM (
+ SELECT key, '' as value FROM @ttt
+ UNION ALL
+ SELECT 0 as key, value from @ttt
+) AS x
+ORDER BY key, value
+;
diff --git a/yt/yql/tests/sql/suites/hor_join/skip_sampling.cfg b/yt/yql/tests/sql/suites/hor_join/skip_sampling.cfg
new file mode 100644
index 0000000000..15b84c0426
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/skip_sampling.cfg
@@ -0,0 +1,3 @@
+in Input1 input.txt
+in Input2 input.txt
+in Input3 input.txt
diff --git a/yt/yql/tests/sql/suites/hor_join/skip_sampling.sql b/yt/yql/tests/sql/suites/hor_join/skip_sampling.sql
new file mode 100644
index 0000000000..cdd14e3ee7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/skip_sampling.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+/* kikimr can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 12 */
+USE plato;
+
+SELECT * FROM (
+ SELECT CAST(key AS int) as key, '' as subkey, '' as value FROM plato.Input1 SAMPLE 0.1
+ UNION ALL
+ SELECT 1 as key, subkey, '' as value from plato.Input2
+ UNION ALL
+ SELECT 1 as key, '' as subkey, value from plato.Input3
+) AS x
+ORDER BY key, subkey, value
+;
diff --git a/yt/yql/tests/sql/suites/hor_join/skip_yamr.cfg b/yt/yql/tests/sql/suites/hor_join/skip_yamr.cfg
new file mode 100644
index 0000000000..d16bb7a691
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/skip_yamr.cfg
@@ -0,0 +1,3 @@
+in Input1 input.txt
+in Input2 input.txt
+in Input3 yamred_dsv.txt yamred_dsv
diff --git a/yt/yql/tests/sql/suites/hor_join/skip_yamr.sql b/yt/yql/tests/sql/suites/hor_join/skip_yamr.sql
new file mode 100644
index 0000000000..8161e83e83
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/skip_yamr.sql
@@ -0,0 +1,10 @@
+USE plato;
+
+SELECT * FROM (
+ SELECT 1 as key, subkey, '' as value from plato.Input1
+ UNION ALL
+ SELECT 1 as key, '' as subkey, value from plato.Input2
+ UNION ALL
+ SELECT CAST(key as Int32) as key, '' as subkey, value from plato.Input3
+) ORDER BY key, subkey, value
+;
diff --git a/yt/yql/tests/sql/suites/hor_join/sorted.txt.attr b/yt/yql/tests/sql/suites/hor_join/sorted.txt.attr
new file mode 100644
index 0000000000..36f279e4a0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/sorted.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/hor_join/sorted_out.cfg b/yt/yql/tests/sql/suites/hor_join/sorted_out.cfg
new file mode 100644
index 0000000000..186d94fcae
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/sorted_out.cfg
@@ -0,0 +1,5 @@
+in Input1 sorted.txt
+in Input2 input.txt
+in Input3 input.txt
+in Input4 input.txt
+in Input5 input.txt
diff --git a/yt/yql/tests/sql/suites/hor_join/sorted_out.sql b/yt/yql/tests/sql/suites/hor_join/sorted_out.sql
new file mode 100644
index 0000000000..d0a017508a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/sorted_out.sql
@@ -0,0 +1,17 @@
+/* postgres can not */
+/* kikimr can not */
+pragma yt.DisableOptimizers="UnorderedOuts";
+
+SELECT * FROM (
+ SELECT key, value || "a" as value FROM plato.Input1
+ union all
+ SELECT key, "1" as value from plato.Input2
+ union all
+ SELECT key, "2" as value from plato.Input3
+ union all
+ SELECT key, "3" as value from plato.Input4
+ union all
+ SELECT key, "4" as value from plato.Input5
+) AS x
+ORDER BY key, value
+; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/hor_join/sorted_out_mix.cfg b/yt/yql/tests/sql/suites/hor_join/sorted_out_mix.cfg
new file mode 100644
index 0000000000..8bc2f58496
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/sorted_out_mix.cfg
@@ -0,0 +1,5 @@
+in Input1 input.txt
+in Input2 sorted.txt
+in Input3 input.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/hor_join/sorted_out_mix.sql b/yt/yql/tests/sql/suites/hor_join/sorted_out_mix.sql
new file mode 100644
index 0000000000..19aec3111b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/sorted_out_mix.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+/* postgres can not */
+/* kikimr can not */
+pragma yt.DisableOptimizers="UnorderedOuts";
+
+$i1 = (SELECT key, value || "a" as value1 FROM plato.Input1);
+$i2 = (SELECT key, "1" as value2 from plato.Input2);
+$i3 = (SELECT key, "2" as value3 from plato.Input3);
+
+$udf = ($x) -> {
+ return AsStruct(Yql::Visit($x
+ , AsAtom("0"), ($i) -> { return Yql::Member($i, AsAtom("key")) }
+ , AsAtom("1"), ($i) -> { return Yql::Member($i, AsAtom("key")) }
+ , AsAtom("2"), ($i) -> { return Yql::Member($i, AsAtom("key")) }
+ ) AS key)
+};
+
+SELECT * FROM (PROCESS $i1, $i2, $i3 using $udf(TableRow())) ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/hor_join/table_record.cfg b/yt/yql/tests/sql/suites/hor_join/table_record.cfg
new file mode 100644
index 0000000000..9b1926e035
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/table_record.cfg
@@ -0,0 +1,2 @@
+in Input1 input.txt
+in Input2 input.txt
diff --git a/yt/yql/tests/sql/suites/hor_join/table_record.sql b/yt/yql/tests/sql/suites/hor_join/table_record.sql
new file mode 100644
index 0000000000..af5f42281a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/table_record.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+SELECT * FROM (
+ select key, TableRecordIndex() as record, TablePath() as path from Input1
+ union all
+ select key, TableRecordIndex() as record, "d" as path from Input2
+) AS x
+ORDER BY key, record, path
+;
diff --git a/yt/yql/tests/sql/suites/hor_join/yamred_dsv.txt.attr b/yt/yql/tests/sql/suites/hor_join/yamred_dsv.txt.attr
new file mode 100644
index 0000000000..f52f445c2c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/yamred_dsv.txt.attr
@@ -0,0 +1,10 @@
+{
+ "_format"=<
+ "fs"="\t";
+ "rs"="\n";
+ "has_subkey"=%true;
+ "escape_carriage_return"=%true;
+ "key_column_names"=["key"];
+ "subkey_column_names"=["subkey"]
+ >"yamred_dsv";
+}
diff --git a/yt/yql/tests/sql/suites/hor_join/yield_off.cfg b/yt/yql/tests/sql/suites/hor_join/yield_off.cfg
new file mode 100644
index 0000000000..3c11f9c54b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/yield_off.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/hor_join/yield_off.sql b/yt/yql/tests/sql/suites/hor_join/yield_off.sql
new file mode 100644
index 0000000000..a1635ae3e2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/yield_off.sql
@@ -0,0 +1,23 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+pragma config.flags("UdfSupportsYield","false");
+
+$s = @@
+import yql
+
+def f(input, a):
+ for x in input:
+ yield x
+@@;
+
+$f = Python::f(Callable<(Stream<Struct<key:String,subkey:String,value:String>>,Int32)->Stream<Struct<key:String,subkey:String,value:String>>>, $s);
+
+
+SELECT * FROM (
+ PROCESS Input using $f(TableRows(), 1)
+ UNION ALL
+ PROCESS Input using $f(TableRows(), 2)
+) AS x
+ORDER BY key, subkey, value
+;
diff --git a/yt/yql/tests/sql/suites/hor_join/yield_on.sql b/yt/yql/tests/sql/suites/hor_join/yield_on.sql
new file mode 100644
index 0000000000..62efa85744
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/yield_on.sql
@@ -0,0 +1,20 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+pragma config.flags("UdfSupportsYield","true");
+
+$s = @@
+def f(input, a):
+ for x in input:
+ yield x
+@@;
+
+$f = Python::f(Callable<(Stream<Struct<key:String,subkey:String,value:String>>,Int32)->Stream<Struct<key:String,subkey:String,value:String>>>, $s);
+
+SELECT * FROM (
+ PROCESS Input using $f(TableRows(), 1)
+ UNION ALL
+ PROCESS Input using $f(TableRows(), 2)
+) AS x
+ORDER BY key, subkey, value
+;
diff --git a/yt/yql/tests/sql/suites/hor_join/yql-12610_old_table_props.cfg b/yt/yql/tests/sql/suites/hor_join/yql-12610_old_table_props.cfg
new file mode 100644
index 0000000000..1f1d2747db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/yql-12610_old_table_props.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/hor_join/yql-12610_old_table_props.sql b/yt/yql/tests/sql/suites/hor_join/yql-12610_old_table_props.sql
new file mode 100644
index 0000000000..3f36d0e6e3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/yql-12610_old_table_props.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+/* syntax version 1 */
+/* kikimr can not - yt pragma */
+USE plato;
+pragma yt.UseSystemColumns="0";
+
+SELECT * FROM (
+ select key, TableRecordIndex() as record, TablePath() as path from Input
+ union all
+ select key, TableRecordIndex() as record, "d" as path from Input
+) AS x
+ORDER BY key, record, path
+;
diff --git a/yt/yql/tests/sql/suites/hor_join/yql-6477_table_path.sql b/yt/yql/tests/sql/suites/hor_join/yql-6477_table_path.sql
new file mode 100644
index 0000000000..893cd776de
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/yql-6477_table_path.sql
@@ -0,0 +1,18 @@
+/* postgres can not */
+/* syntax version 1 */
+/* kikimr can not - yt pragma */
+USE plato;
+
+pragma yt.MaxExtraJobMemoryToFuseOperations="512M";
+
+$udfScript = @@
+def AsIs(s):
+ return s
+@@;
+
+$udf = Python::AsIs(Callable<(String)->String>, $udfScript);
+
+select TablePath() as path from Input
+union all
+select TablePath() as path from Input where $udf(key) > "080"
+;
diff --git a/yt/yql/tests/sql/suites/hor_join/yql19332_aux_cols.cfg b/yt/yql/tests/sql/suites/hor_join/yql19332_aux_cols.cfg
new file mode 100644
index 0000000000..3eb7660ec9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/yql19332_aux_cols.cfg
@@ -0,0 +1,3 @@
+in Input1 sorted.txt
+in Input2 sorted.txt
+in Input3 sorted.txt
diff --git a/yt/yql/tests/sql/suites/hor_join/yql19332_aux_cols.sql b/yt/yql/tests/sql/suites/hor_join/yql19332_aux_cols.sql
new file mode 100644
index 0000000000..c84769777c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/hor_join/yql19332_aux_cols.sql
@@ -0,0 +1,9 @@
+-- ignore runonopt plan diff
+USE plato;
+pragma DisableSimpleColumns;
+pragma yt.JoinMergeTablesLimit="10";
+
+$i = select * from concat(Input2, Input3) where value != "1";
+
+select b.key, b.subkey, a.value from Input1 as a
+join $i as b on (a.key, a.subkey) == (b.key, b.subkey)
diff --git a/yt/yql/tests/sql/suites/in/basic_in.sql b/yt/yql/tests/sql/suites/in/basic_in.sql
new file mode 100644
index 0000000000..fdb8c00408
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/basic_in.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+SELECT
+ 1 IN (1, 2),
+ 3 NOT IN (1, 2),
+ "1" IN (key, subkey, value),
+ key NOT IN (key, subkey, value),
+ key NOT IN AsList(subkey),
+ CAST(subkey AS Int32) IN (1, 2) AS optional_key_i32,
+ CAST(subkey AS Int64) IN (1, 2) AS optional_key_i64,
+ CAST(subkey AS Uint32) IN (1, 2) AS optional_key_ui32,
+ CAST(subkey AS Uint64) IN (1, 2) AS optional_key_ui64,
+ CAST(subkey AS Uint8) IN (1, 2) AS optional_key_to_larger_type
+FROM plato.Input;
diff --git a/yt/yql/tests/sql/suites/in/default.cfg b/yt/yql/tests/sql/suites/in/default.cfg
new file mode 100644
index 0000000000..3d282ff63b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/default.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+in InputWithTuples input_with_tuples.txt
diff --git a/yt/yql/tests/sql/suites/in/huge_in.sql b/yt/yql/tests/sql/suites/in/huge_in.sql
new file mode 100644
index 0000000000..f2d164b254
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/huge_in.sql
@@ -0,0 +1,2495 @@
+SELECT
+ *
+FROM plato.Input
+WHERE value IN (
+'rambler.ru',
+'worldoftanks.ru',
+'pikabu.ru',
+'rbc.ru',
+'ria.ru',
+'lenta.ru',
+'4pda.ru',
+'lostfilm.tv',
+'yaplakal.com',
+'auto.mail.ru',
+'lady.mail.ru',
+'echo.msk.ru',
+'gazeta.ru',
+'lifenews.ru',
+'drive2.ru',
+'vesti.ru',
+'ivi.ru',
+'russian.rt.com',
+'championat.com',
+'habrahabr.ru',
+'tass.ru',
+'kp.ru',
+'games.mail.ru',
+'sports.ru',
+'hi-tech.mail.ru',
+'fishki.net',
+'news.sportbox.ru',
+'playground.ru',
+'1tv.ru',
+'fb.ru',
+'rg.ru',
+'ntv.ru',
+'kakprosto.ru',
+'vz.ru',
+'deti.mail.ru',
+'dom2.ru',
+'e1.ru',
+'aif.ru',
+'adme.ru',
+'regnum.ru',
+'livejournal.com',
+'interfax.ru',
+'tvzvezda.ru',
+'infox.sg',
+'sport-express.ru',
+'health.mail.ru',
+'kommersant.ru',
+'izvestia.ru',
+'topwar.ru',
+'meduza.io',
+'mk.ru',
+'geektimes.ru',
+'worldofwarships.ru',
+'newsru.com',
+'tvrain.ru',
+'stream.1tv.ru',
+'dota2.ru',
+'woman.ru',
+'banki.ru',
+'3dnews.ru',
+'weekend.rambler.ru',
+'womanadvice.ru',
+'video-dom2.ru',
+'ren.tv',
+'rusvesna.su',
+'vedomosti.ru',
+'tvc.ru',
+'forexpf.ru',
+'inosmi.ru',
+'goodgame.ru',
+'rusnovosti.ru',
+'cont.ws',
+'overclockers.ru',
+'politikus.ru',
+'autorambler.ru',
+'bbc.com',
+'fontanka.ru',
+'lifehacker.ru',
+'novayagazeta.ru',
+'ixbt.com',
+'oper.ru',
+'m24.ru',
+'stopgame.ru',
+'rustoria.ru',
+'russianfood.com',
+'russia.tv',
+'football.kulichki.net',
+'svpressa.ru',
+'igromania.ru',
+'finance.rambler.ru',
+'kinopati.ru',
+'elhow.ru',
+'ngs.ru',
+'navalny.com',
+'ru.investing.com',
+'shazoo.ru',
+'carambatv.ru',
+'colonelcassad.livejournal.com',
+'turkcinema.tv',
+'syl.ru',
+'gamebomb.ru',
+'ctc.ru',
+'hltv.org',
+'khl.ru',
+'slon.ru',
+'101.ru',
+'rusplt.ru',
+'lostfilm.info',
+'matchtv.ru',
+'svoboda.org',
+'finam.ru',
+'virtus.pro',
+'tjournal.ru',
+'livelib.ru',
+'tvigle.ru',
+'sovsport.ru',
+'expert.ru',
+'rns.online',
+'varlamov.ru',
+'astromeridian.ru',
+'74.ru',
+'quto.ru',
+'mobile-review.com',
+'stranamasterov.ru',
+'the-village.ru',
+'quote.rbc.ru',
+'rosbalt.ru',
+'eurosport.ru',
+'bash.im',
+'1prime.ru',
+'coop-land.ru',
+'kanobu.ru',
+'radiopotok.ru',
+'bfm.ru',
+'dni.ru',
+'soccer.ru',
+'europaplus.ru',
+'warfiles.ru',
+'radiovesti.ru',
+'nnm.me',
+'eadaily.com',
+'unian.net',
+'drive.ru',
+'afisha.ru',
+'wot-news.com',
+'forbes.ru',
+'ferra.ru',
+'vc.ru',
+'rusnext.ru',
+'tema.livejournal.com',
+'u-mama.ru',
+'eda.ru',
+'f1news.ru',
+'bazaistoria.ru',
+'ura.ru',
+'24auto.ru',
+'utro.ru',
+'edimdoma.ru',
+'politobzor.net',
+'sibnet.ru',
+'snob.ru',
+'news.drom.ru',
+'newsland.com',
+'popmech.ru',
+'trinixy.ru',
+'politrussia.com',
+'iphones.ru',
+'uznayvse.ru',
+'alogvinov.com',
+'ru-m.org',
+'vashmnenie.ru',
+'buhonline.ru',
+'politota.dirty.ru',
+'referatwork.ru',
+'gooool.org',
+'news-front.info',
+'vokrug.tv',
+'pravda.ru',
+'autonews.ru',
+'gamer.ru',
+'zr.ru',
+'govoritmoskva.ru',
+'gamemag.ru',
+'letidor.ru',
+'vestifinance.ru',
+'spletnik.ru',
+'cosmo.ru',
+'9gag.com',
+'exler.ru',
+'kolesa.ru',
+'bombardir.ru',
+'km.ru',
+'eva.ru',
+'maximonline.ru',
+'pedsovet.su',
+'megamozg.ru',
+'film.ru',
+'ondom2.com',
+'topnews.ru',
+'zdravotvet.ru',
+'schlock.ru',
+'kinomania.ru',
+'wday.ru',
+'life-dom2.ru',
+'kosmetista.ru',
+'rusfootball.info',
+'infoniac.ru',
+'sql.ru',
+'sport.rbc.ru',
+'narutoplanet.ru',
+'chelyabinsk.ru',
+'trashbox.ru',
+'ng.ru',
+'msk.kp.ru',
+'thg.ru',
+'soccer365.ru',
+'ridus.ru',
+'audit-it.ru',
+'mix.sibnet.ru',
+'fanat1k.ru',
+'riafan.ru',
+'gameguru.ru',
+'oko-planet.su',
+'gmbox.ru',
+'macdigger.ru',
+'kudago.com',
+'goha.ru',
+'style.rbc.ru',
+'avmalgin.livejournal.com',
+'pure-t.ru',
+'toastedballs.com',
+'66.ru',
+'kremlin.ru',
+'ppt.ru',
+'pix.playground.ru',
+'gotovim.ru',
+'zhenskoe-mnenie.ru',
+'motor.ru',
+'moslenta.ru',
+'dp.ru',
+'pravoslavie.ru',
+'footballhd.ru',
+'72.ru',
+'hmn.ru',
+'ruposters.ru',
+'ag.ru',
+'youloveit.ru',
+'7days.ru',
+'bmpd.livejournal.com',
+'nplus1.ru',
+'finanz.ru',
+'fantasy-worlds.org',
+'07kbr.ru',
+'glavbukh.ru',
+'newsvl.ru',
+'avtovzglyad.ru',
+'sdelanounas.ru',
+'rbctv.rbc.ru',
+'gorod48.ru',
+'elle.ru',
+'realty.rbc.ru',
+'fashiony.ru',
+'super.ru',
+'opennet.ru',
+'rusfishing.ru',
+'weburg.net',
+'znak.com',
+'smotrisport.tv',
+'eurolab.ua',
+'tonkosti.ru',
+'irk.ru',
+'kramola.info',
+'yurasumy.livejournal.com',
+'u-f.ru',
+'liveresult.ru',
+'starhit.ru',
+'allboxing.ru',
+'shkolazhizni.ru',
+'bloknot.ru',
+'babyplan.ru',
+'klerk.ru',
+'notebook-center.ru',
+'pravmir.ru',
+'eg.ru',
+'cn.ru',
+'anekdotov.net',
+'info.drom.ru',
+'comss.info',
+'oszone.net',
+'orsk.ru',
+'blogistars.com',
+'inopressa.ru',
+'xakep.ru',
+'riotpixels.com',
+'rsport.ru',
+'peremogi.livejournal.com',
+'moe-online.ru',
+'newkaliningrad.ru',
+'cxem.net',
+'nash-dom2.ru',
+'vprognoze.ru',
+'glav.su',
+'mama.ru',
+'nhl.com',
+'ekabu.ru',
+'59.ru',
+'ucrazy.ru',
+'euro-football.ru',
+'tvzavr.ru',
+'moevideo.net',
+'ibigdan.livejournal.com',
+'7ya.ru',
+'sadalskij.livejournal.com',
+'vm.ru',
+'rusdialog.ru',
+'factroom.ru',
+'mir24.tv',
+'voenhronika.ru',
+'argumenti.ru',
+'63.ru',
+'politnavigator.net',
+'peoples.ru',
+'medkrug.ru',
+'vladtime.ru',
+'3ddd.ru',
+'business-gazeta.ru',
+'moya-planeta.ru',
+'gorod.afisha.ru',
+'openrussia.org',
+'strana-sovetov.com',
+'allhockey.ru',
+'mobiltelefon.ru',
+'interfax-russia.ru',
+'politonline.ru',
+'filmpro.ru',
+'bugaga.ru',
+'iguides.ru',
+'urod.ru',
+'westwing.ru',
+'timeout.ru',
+'dw.com',
+'pandoraopen.ru',
+'autochel.ru',
+'tourister.ru',
+'cnews.ru',
+'pronedra.ru',
+'zadolba.li',
+'rap.ru',
+'112.ua',
+'molodost.bz',
+'mirsovetov.ru',
+'conf.7ya.ru',
+'disgustingmen.com',
+'hi-news.ru',
+'anna-news.info',
+'e-news.su',
+'warandpeace.ru',
+'tvkultura.ru',
+'mirfactov.com',
+'koolinar.ru',
+'evrl.to',
+'cinemate.cc',
+'roem.ru',
+'libertycity.ru',
+'informing.ru',
+'ofigenno.cc',
+'kolmovo.ru',
+'amic.ru',
+'mhealth.ru',
+'autoreview.ru',
+'itc.ua',
+'161.ru',
+'mmohelper.ru',
+'wow-impulse.ru',
+'appleinsider.ru',
+'pravda-tv.ru',
+'avtomarket.ru',
+'newsrbk.ru',
+'gtavicecity.ru',
+'radiomayak.ru',
+'rsute.ru',
+'spbdnevnik.ru',
+'dailymail.co.uk',
+'svopi.ru',
+'akaoray.ru',
+'fc-zenit.ru',
+'macos.livejournal.com',
+'vozduh.afisha.ru',
+'city-n.ru',
+'furfur.me',
+'ru.euronews.com',
+'metronews.ru',
+'vgtimes.ru',
+'nstarikov.ru',
+'polit.ru',
+'zoom.cnews.ru',
+'hiji.ru',
+'gordonua.com',
+'bigpicture.ru',
+'prestige-gaming.ru',
+'5-tv.ru',
+'rb.ru',
+'spbvoditel.ru',
+'overclockers.ua',
+'moddb.com',
+'7dach.ru',
+'ohranatruda.ru',
+'ngs24.ru',
+'russian7.ru',
+'nashgorod.ru',
+'rockstargame.ru',
+'nat-geo.ru',
+'gastronom.ru',
+'hitech.vesti.ru',
+'burdastyle.ru',
+'rfpl.org',
+'audi-club.ru',
+'allnokia.ru',
+'3mv.ru',
+'zavuch.ru',
+'news.ykt.ru',
+'lawmix.ru',
+'chita.ru',
+'altapress.ru',
+'domchel.ru',
+'dooralei.ru',
+'be-in.ru',
+'newslab.ru',
+'geekcity.ru',
+'rueconomics.ru',
+'cheat-master.ru',
+'takprosto.cc',
+'dofiga.net',
+'nacrestike.ru',
+'24smi.org',
+'voffka.com',
+'mpsh.ru',
+'vhlru.ru',
+'infox.ru',
+'bbc.co.uk',
+'newstube.ru',
+'womenhealthnet.ru',
+'gazeta.spb.ru',
+'lookatme.ru',
+'ivona.bigmir.net',
+'economics.unian.net',
+'pozneronline.ru',
+'rlocman.ru',
+'w-o-s.ru',
+'wowhead.com',
+'nashpoz.ru',
+'tverigrad.ru',
+'ign.com',
+'diets.ru',
+'demotivation.me',
+'ru.gecid.com',
+'golos-ameriki.ru',
+'finmarket.ru',
+'theguardian.com',
+'amur.info',
+'monavista.ru',
+'arzamas.academy',
+'pravo.ru',
+'edition.cnn.com',
+'ukr.net',
+'travel.drom.ru',
+'cluber.com.ua',
+'bibika.ru',
+'sharij.net',
+'pedsovet.org',
+'masterok.livejournal.com',
+'psychologies.ru',
+'gorod55.ru',
+'esquire.ru',
+'myslo.ru',
+'postnauka.ru',
+'abc-news.ru',
+'dom2.su',
+'volshebnaya-eda.ru',
+'ucheba.ru',
+'medialeaks.ru',
+'artstation.com',
+'kaifolog.ru',
+'relax.ru',
+'bikepost.ru',
+'rusbiathlon.ru',
+'bookmakersrating.ru',
+'culture.ru',
+'7kingdoms.ru',
+'wroom.ru',
+'sobesednik.ru',
+'proufu.ru',
+'chezasite.com',
+'bnkomi.ru',
+'piter.tv',
+'computerra.ru',
+'eer.ru',
+'yaom.ru',
+'rrnews.ru',
+'kpfu.ru',
+'ukraina.ru',
+'gagadget.com',
+'buhgalteria.ru',
+'atlib.ru',
+'wonderzine.com',
+'mmoboom.ru',
+'bucwar.ru',
+'primamedia.ru',
+'47news.ru',
+'klub-drug.ru',
+'kulturologia.ru',
+'bk55.ru',
+'2do2go.ru',
+'securitylab.ru',
+'nakanune.ru',
+'zdorovieinfo.ru',
+'medportal.ru',
+'novate.ru',
+'smotra.ru',
+'hibiny.com',
+'penzainform.ru',
+'buh.ru',
+'hi-fi.ru',
+'dwg.ru',
+'naked-science.ru',
+'ibusiness.ru',
+'fresher.ru',
+'carsguru.net',
+'fit4brain.com',
+'muz-tv.ru',
+'kavkaz-uzel.ru',
+'kitchenmag.ru',
+'ruspoll.ru',
+'wowlol.ru',
+'bcs-express.ru',
+'uralweb.ru',
+'nv.ua',
+'liveleak.com',
+'vasi.net',
+'topspb.tv',
+'sobaka.ru',
+'inmyroom.ru',
+'detkityumen.ru',
+'mirkosmosa.ru',
+'allwomens.ru',
+'kp40.ru',
+'optimakomp.ru',
+'29.ru',
+'trendymen.ru',
+'hardwareluxx.ru',
+'pln-pskov.ru',
+'klops.ru',
+'lfootball.ws',
+'kleo.ru',
+'sputnikipogrom.com',
+'pg21.ru',
+'medikforum.ru',
+'donnews.ru',
+'bankir.ru',
+'news.vse42.ru',
+'searchnews.info',
+'fedpress.ru',
+'fishingsib.ru',
+'podelki-rukami-svoimi.ru',
+'jv.ru',
+'nashaplaneta.su',
+'ideas.vdolevke.ru',
+'diletant.media',
+'gta.com.ua',
+'zagopod.com',
+'rian.com.ua',
+'gov.spb.ru',
+'glamius.ru',
+'yablyk.com',
+'uapress.info',
+'komarovskiy.net',
+'stolica.onego.ru',
+'popcornnews.ru',
+'qrz.ru',
+'rutraveller.ru',
+'ohotniki.ru',
+'progorodsamara.ru',
+'24tv.ua',
+'rusdtp.ru',
+'houzz.ru',
+'chto-proishodit.ru',
+'dnpmag.com',
+'ru.hellomagazine.com',
+'runews24.ru',
+'kak2z.ru',
+'pcgamer.com',
+'ruskline.ru',
+'dr-piliulkin.livejournal.com',
+'dezinfo.net',
+'korzik.net',
+'3rm.info',
+'tv-soyuz.ru',
+'knitka.ru',
+'alimero.ru',
+'planeta.moy.su',
+'elementy.ru',
+'newsli.ru',
+'zabmedia.ru',
+'antifashist.com',
+'tvoytrener.com',
+'elec.ru',
+'domechti.ru',
+'ulpressa.ru',
+'babiki.ru',
+'realty.newsru.com',
+'1obl.ru',
+'motorpage.ru',
+'winline.ru',
+'earth-chronicles.ru',
+'amdn.news',
+'ochepyatki.ru',
+'goodhouse.ru',
+'rt.com',
+'vzsar.ru',
+'buzzfeed.com',
+'bragazeta.ru',
+'tks.ru',
+'womanhit.ru',
+'sostav.ru',
+'ruspravda.info',
+'androidinsider.ru',
+'gdekluet.ru',
+'dejurka.ru',
+'keddr.com',
+'prokazan.ru',
+'vladmama.ru',
+'newtimes.ru',
+'voicesevas.ru',
+'v1.ru',
+'komiinform.ru',
+'chipstone.livejournal.com',
+'properm.ru',
+'searchengines.ru',
+'38mama.ru',
+'videoboom.cc',
+'newsru.co.il',
+'4tololo.ru',
+'mosday.ru',
+'deita.ru',
+'cars.ru',
+'news.allcrimea.net',
+'ufa1.ru',
+'gq.ru',
+'uafootball.org.ua',
+'travel.ru',
+'bn.ru',
+'news.am',
+'tvernews.ru',
+'tomshardware.co.uk',
+'ok-inform.ru',
+'tproger.ru',
+'shophelp.ru',
+'news.tut.by',
+'spb.aif.ru',
+'nytimes.com',
+'verstov.info',
+'droider.ru',
+'batona.net',
+'gamespot.com',
+'sarbc.ru',
+'dribbble.com',
+'nkj.ru',
+'vokrugsveta.ru',
+'vestiprim.ru',
+'kp.ua',
+'restate.ru',
+'glamour.ru',
+'doctorpiter.ru',
+'76.ru',
+'inforesist.org',
+'rzn.info',
+'spartak.com',
+'progorod11.ru',
+'e-xecutive.ru',
+'kdelo.ru',
+'jevons1.com',
+'news.day.az',
+'hochu.ua',
+'prophotos.ru',
+'4living.ru',
+'rusradio.ru',
+'kvadroom.ru',
+'nevnov.ru',
+'om1.ru',
+'omskinform.ru',
+'nahnews.org',
+'riarealty.ru',
+'avtoradio.ru',
+'homyak55.ru',
+'papaimama.ru',
+'reuters.com',
+'ngs55.ru',
+'lvrach.ru',
+'nvworld.ru',
+'autopeople.ru',
+'livesport.ru',
+'wmj.ru',
+'ru.uefa.com',
+'doseng.org',
+'techpowerup.com',
+'trud.ru',
+'khabmama.ru',
+'vtambove.ru',
+'patriarchia.ru',
+'progorodnn.ru',
+'art-assorty.ru',
+'gazeta.a42.ru',
+'vev.ru',
+'sdelaysam-svoimirukami.ru',
+'rusjev.net',
+'zagolovki.ru',
+'pressa.tv',
+'sarnovosti.ru',
+'kazanfirst.ru',
+'copypast.ru',
+'mignews.com',
+'gameawards.ru',
+'bloomberg.com',
+'facenewss.ru',
+'mforum.ru',
+'samru.ru',
+'rockpapershotgun.com',
+'gallerix.ru',
+'pravdoryb.info',
+'diy.ru',
+'rmnt.ru',
+'autosaratov.ru',
+'antipriunil.ru',
+'yuga.ru',
+'vitaportal.ru',
+'vogue.ru',
+'newsonline24.com.ua',
+'android-help.ru',
+'joinfo.ua',
+'meganovosti.net',
+'planet-today.ru',
+'chinamobil.ru',
+'tltgorod.ru',
+'freeseller.ru',
+'nversia.ru',
+'jpgazeta.ru',
+'ellegirl.ru',
+'tele.ru',
+'probirka.org',
+'pribalt.info',
+'bg.ru',
+'vashgorod.ru',
+'1gai.ru',
+'fithacker.ru',
+'darievna.ru',
+'36on.ru',
+'readtoday.ru',
+'domihobby.ru',
+'internet-technologies.ru',
+'irinazaytseva.ru',
+'nsknews.info',
+'telegraf.com.ua',
+'chemport.ru',
+'fotokomok.ru',
+'cameralabs.org',
+'mchs.gov.ru',
+'rostovdrive.ru',
+'grimnir74.livejournal.com',
+'riavrn.ru',
+'province.ru',
+'letnews.ru',
+'progorod43.ru',
+'andychef.ru',
+'dk.ru',
+'dni24.com',
+'rus.newsru.ua',
+'mr7.ru',
+'wordyou.ru',
+'stereo.ru',
+'gay.ru',
+'utmagazine.ru',
+'ya62.ru',
+'purmix.ru',
+'5koleso.ru',
+'zakon.ru',
+'seonews.ru',
+'metaltorg.ru',
+'unn.com.ua',
+'kgd.ru',
+'onedio.ru',
+'flot.com',
+'zol.ru',
+'eg-online.ru',
+'fakty.ictv.ua',
+'newsforamericans.com',
+'zn.ua',
+'rifey.ru',
+'dialog.ua',
+'psycabi.net',
+'gorodskoyportal.ru',
+'blackpantera.ru',
+'tv2.tomsk.ru',
+'brodude.ru',
+'bloknot-volgograd.ru',
+'aillarionov.livejournal.com',
+'gotps3.ru',
+'lady.tochka.net',
+'medicinform.net',
+'videozal.net',
+'zhenskiy-sait.ru',
+'ru.tv',
+'arms-expo.ru',
+'prikol.ru',
+'krabov.net',
+'n4k.ru',
+'museum.ru',
+'fontanka.fi',
+'the-challenger.ru',
+'sledcomrf.ru',
+'newsader.com',
+'zelenograd.ru',
+'avia.pro',
+'bloknot-voronezh.ru',
+'theoryandpractice.ru',
+'buro247.ru',
+'telegraph.co.uk',
+'njcar.ru',
+'iphone-gps.ru',
+'sport.bigmir.net',
+'soccerlivehd.com',
+'topgearrussia.ru',
+'argumentiru.com',
+'metrolyrics.com',
+'dvnovosti.ru',
+'infowoman.com.ua',
+'riasv.ru',
+'bankingsite.ru',
+'mgnews.ru',
+'sredstva.ru',
+'cossa.ru',
+'vg247.com',
+'molnet.ru',
+'grammio.com',
+'sovsekretno.ru',
+'etotdom.com',
+'lipetskmedia.ru',
+'video.bigmir.net',
+'nexplorer.ru',
+'beremennost.net',
+'filmz.ru',
+'ski.ru',
+'24gadget.ru',
+'rus.delfi.lv',
+'sotovik.ru',
+'online812.ru',
+'knowyourmeme.com',
+'howtogeek.com',
+'nsn.fm',
+'mobiledevice.ru',
+'ozpp.ru',
+'colta.ru',
+'guru3d.com',
+'31tv.ru',
+'gorodkirov.ru',
+'nikolaeva.livejournal.com',
+'hitech.newsru.com',
+'starslife.ru',
+'gazeta-unp.ru',
+'rosteplo.ru',
+'allcarz.ru',
+'tourprom.ru',
+'devaka.ru',
+'bloknot-rostov.ru',
+'peterburg2.ru',
+'nur.kz',
+'gardenia.ru',
+'ug.ru',
+'independent.co.uk',
+'bashinform.ru',
+'etoday.ru',
+'autonet.ru',
+'vostokmedia.com',
+'krsk.sibnovosti.ru',
+'medlinks.ru',
+'xage.ru',
+'myfreesoft.ru',
+'viperson.ru',
+'trkterra.ru',
+'kinokadr.ru',
+'interviewrussia.ru',
+'aksakal.tv',
+'vicer.ru',
+'irn.ru',
+'yugopolis.ru',
+'islam-today.ru',
+'btimes.ru',
+'rusactors.ru',
+'gaming.msi.com',
+'redigo.ru',
+'vpk-news.ru',
+'politolog.net',
+'hronika.info',
+'oilru.com',
+'sntat.ru',
+'ekburg.ru',
+'auto.newsru.com',
+'teknoblog.ru',
+'washingtonpost.com',
+'kinofilms.ua',
+'pics.ru',
+'tumix.ru',
+'cnet.com',
+'rustelegraph.ru',
+'marrietta.ru',
+'botanichka.ru',
+'piterburger.ru',
+'fitseven.ru',
+'okino.ua',
+'mastera-rukodeliya.ru',
+'domnika.ru',
+'newizv.ru',
+'army-news.ru',
+'korfiati.ru',
+'otr-online.ru',
+'pravdaurfo.ru',
+'mngz.ru',
+'nevsedoma.com.ua',
+'product-test.ru',
+'newrezume.org',
+'blognews.am',
+'philologist.livejournal.com',
+'almodi.org',
+'carobka.ru',
+'exkavator.ru',
+'by24.org',
+'news.auto.ru',
+'tvk6.ru',
+'yoursputnik.ru',
+'mylitta.ru',
+'mel.fm',
+'livekuban.ru',
+'perm.aif.ru',
+'turizm.ru',
+'osp.ru',
+'uralinform.ru',
+'procrf.ru',
+'finam.info',
+'saratovnews.ru',
+'marieclaire.ru',
+'secure.avaaz.org',
+'womenclub.ru',
+'signorina.ru',
+'kapital-rus.ru',
+'nedeli.org',
+'vtb.ru',
+'allure.ru',
+'myspace.com',
+'health-ua.org',
+'huffingtonpost.com',
+'ain.ua',
+'ufacitynews.ru',
+'trikky.ru',
+'tv.ua',
+'passion.ru',
+'storyfox.ru',
+'crimea.kp.ru',
+'ipadstory.ru',
+'mycharm.ru',
+'forbes.com',
+'prelest.com',
+'foodclub.ru',
+'idi-k-nam.ru',
+'spicami.ru',
+'medicus.ru',
+'android4all.ru',
+'novostroy-m.ru',
+'moscow-post.com',
+'fashiontime.ru',
+'mk-london.co.uk',
+'htn.su',
+'paperpaper.ru',
+'rospres.com',
+'unikassa.ru',
+'zoopicture.ru',
+'knitplanet.ru',
+'resobr.ru',
+'novayagazeta-ug.ru',
+'energovopros.ru',
+'lyxavto.ru',
+'vsezdorovo.com',
+'dela-ruk.ru',
+'top-antropos.com',
+'crimea.ria.ru',
+'taxpravo.ru',
+'ikirov.ru',
+'interfax.com.ua',
+'goodvesti.ru',
+'sofascore.com',
+'vremyan.ru',
+'mag.relax.by',
+'myjane.ru',
+'supersadovnik.ru',
+'povozcar.ru',
+'animal.ru',
+'an-crimea.ru',
+'informnapalm.org',
+'menobr.ru',
+'depo.ua',
+'ntpo.com',
+'domovouyasha.ru',
+'comandir.com',
+'mobiset.ru',
+'turbina.ru',
+'tribuna.ru',
+'wek.ru',
+'updiet.info',
+'insider.pro',
+'kvedomosti.com',
+'saint-petersburg.ru',
+'restoran.ru',
+'tatar-inform.ru',
+'blogimam.com',
+'carexpert.ru',
+'techno.bigmir.net',
+'mirror.co.uk',
+'f1cd.ru',
+'vlasti.net',
+'ukranews.com',
+'lifehacker.com',
+'prikol.i.ua',
+'imenno.ru',
+'whoswho.com.ua',
+'nbcnews.com',
+'indystar.com',
+'zergulio.livejournal.com',
+'116.ru',
+'zina-korzina.livejournal.com',
+'pe.com',
+'cyber.sports.ru',
+'news.meta.ua',
+'lingorado.com',
+'ampravda.ru',
+'ru.golos.ua',
+'gwinplane.livejournal.com',
+'cbssports.com',
+'sport.tut.by',
+'fapl.ru',
+'profile.ru',
+'shpilenok.livejournal.com',
+'volgograd.kp.ru',
+'sapojnik.livejournal.com',
+'chicagotribune.com',
+'portal-credo.ru',
+'fintraining.livejournal.com',
+'kungurov.livejournal.com',
+'oldfisher-mk.livejournal.com',
+'kosmos-x.net.ru',
+'npr.org',
+'twincities.com',
+'aex.ru',
+'mb.onliner.by',
+'vesiskitim.ru',
+'rua.gr',
+'gusev-online.ru',
+'blog.yandex.ru',
+'heraldsun.com.au',
+'chel.mk.ru',
+'info-tses.kz',
+'militaryexp.com',
+'cikavosti.com',
+'vestnik-rm.ru',
+'nsk.dk.ru',
+'chistoprudov.livejournal.com',
+'ru-healthlife.livejournal.com',
+'vestitambov.ru',
+'jobs.tut.by',
+'kurer-sreda.ru',
+'bloombergview.com',
+'thenewstribune.com',
+'izh.kp.ru',
+'tv21.ru',
+'hindustantimes.com',
+'businesswire.com',
+'bankfax.ru',
+'ato.ru',
+'bryansktoday.ru',
+'dtpptz.ru',
+'mzadornov.livejournal.com',
+'doktor-killer.livejournal.com',
+'motonews.ru',
+'penza-press.ru',
+'iran.ru',
+'9to5mac.com',
+'dima-pashchenko.livejournal.com',
+'bloknot-stavropol.ru',
+'dynamo.kiev.ua',
+'motogonki.ru',
+'fortune.com',
+'pushba.livejournal.com',
+'yarnovosti.com',
+'uralpress.ru',
+'wsj.com',
+'rabochy-put.ru',
+'eurointegration.com.ua',
+'prosportkz.kz',
+'ufa-room.ru',
+'brainpickings.org',
+'sport.business-gazeta.ru',
+'radulova.livejournal.com',
+'pg12.ru',
+'asfera.info',
+'smbc-comics.com',
+'whatculture.com',
+'foto-history.livejournal.com',
+'zdnet.com',
+'motogp-news.ru',
+'media-polesye.by',
+'vsenovostint.ru',
+'kolyan.net',
+'dirty.ru',
+'kineshemec.ru',
+'izrus.co.il',
+'dailyherald.com',
+'csmonitor.com',
+'mogilev.jobs.tut.by',
+'in-news.ru',
+'novostink.ru',
+'xn----8sbeybxdibygm.ru-an.info',
+'spb-auto.livejournal.com',
+'strangernn.livejournal.com',
+'ngs42.ru',
+'kriminalnn.ru',
+'newsmsk.com',
+'esotericblog.ru',
+'rweek.ru',
+'grey-croco.livejournal.com',
+'volg.mk.ru',
+'comingsoon.net',
+'siliconrus.com',
+'nvo.ng.ru',
+'alternathistory.livejournal.com',
+'krasnoturinsk.info',
+'oblgazeta.ru',
+'engadget.com',
+'sportfm.ru',
+'politichanka.livejournal.com',
+'androidauthority.com',
+'fondsk.ru',
+'bankrate.com',
+'neowin.net',
+'vestikavkaza.ru',
+'flackelf.livejournal.com',
+'readwrite.com',
+'radonezh.ru',
+'kase.kz',
+'cracked.com',
+'udmtv.ru',
+'arigus-tv.ru',
+'otvprim.ru',
+'ufa.rbc.ru',
+'sibdepo.ru',
+'eu-shestakov.livejournal.com',
+'i4u.com',
+'newsday.com',
+'yug.svpressa.ru',
+'krasnoyarsk.dk.ru',
+'lib.komarovskiy.net',
+'lada.kz',
+'baikal-media.ru',
+'news.sky.com',
+'belnovosti.by',
+'otdam-darom.livejournal.com',
+'recode.net',
+'vice.com',
+'grozny.tv',
+'ru-chp.livejournal.com',
+'stalic.livejournal.com',
+'gosh100.livejournal.com',
+'vibirai.ru',
+'buzulukmedia.ru',
+'chessok.net',
+'tula.aif.ru',
+'dvinainform.ru',
+'rgvktv.ru',
+'vinauto777.livejournal.com',
+'azcentral.com',
+'newsler.ru',
+'top.rbc.ru',
+'kvnews.ru',
+'altai.aif.ru',
+'kazan.kp.ru',
+'irk.kp.ru',
+'pravdoiskatel77.livejournal.com',
+'dailydot.com',
+'limonov-eduard.livejournal.com',
+'fastcompany.com',
+'zpravda.ru',
+'belapan.com',
+'washingtontimes.com',
+'journalstar.com',
+'articles.chita.ru',
+'cnbc.com',
+'spulers.livejournal.com',
+'telegraf.by',
+'stoletie.ru',
+'nnov.kp.ru',
+'startribune.com',
+'vsluh.ru',
+'finance.nur.kz',
+'gorno-altaisk.info',
+'gipsyteam.ru',
+'prikol.bigmir.net',
+'gotennis.ru',
+'chelseablues.ru',
+'themarysue.com',
+'sl-lopatnikov.livejournal.com',
+'chehov-vid.ru',
+'economist.com',
+'cultofmac.com',
+'el-murid.livejournal.com',
+'shel-gilbo.livejournal.com',
+'serfilatov.livejournal.com',
+'mr-rf.ru',
+'go31.ru',
+'bulochnikov.livejournal.com',
+'beauty.passion.ru',
+'ru.publika.md',
+'dangerousminds.net',
+'gorodskievesti.ru',
+'cnn.com',
+'nasdaq.com',
+'geektyrant.com',
+'realt.onliner.by',
+'gorod-che.ru',
+'islamdag.ru',
+'42.tut.by',
+'verola.livejournal.com',
+'news.vtomske.ru',
+'muravei-s.livejournal.com',
+'goal.com',
+'eugenyshultz.livejournal.com',
+'nbcbayarea.com',
+'dobryanka.net',
+'gawker.com',
+'contracostatimes.com',
+'spin.com',
+'thestar.com',
+'belta.by',
+'ria56.ru',
+'abc.net.au',
+'e-kazan.ru',
+'zaks.ru',
+'hollywoodreporter.com',
+'a-nikonov.livejournal.com',
+'vluki.ru',
+'factmag.com',
+'auto.kz',
+'sport-igrok.ru',
+'karpovka.net',
+'dymontiger.livejournal.com',
+'doc.rt.com',
+'metroelf.livejournal.com',
+'michurinsk.ru',
+'scmp.com',
+'your-look-today.livejournal.com',
+'computerworld.com',
+'chelny-izvest.ru',
+'wired.com',
+'pressdemocrat.com',
+'revda-info.ru',
+'vesti.irk.ru',
+'chepetsk.ru',
+'dnr-news.com',
+'1news.az',
+'philly.com',
+'kt.kz',
+'sochi-express.ru',
+'alexandrafl.livejournal.com',
+'omskzdes.ru',
+'gazetaby.com',
+'ugra-news.ru',
+'csnphilly.com',
+'ij-adult.livejournal.com',
+'u74.ru',
+'lubernet.ru',
+'russos.livejournal.com',
+'intex-press.by',
+'yesasia.ru',
+'bostonherald.com',
+'androidcentral.com',
+'blagin-anton.livejournal.com',
+'friend.livejournal.com',
+'novgaz-rzn.ru',
+'prokopievsk.ru',
+'spb.kp.ru',
+'prophotos-ru.livejournal.com',
+'mentalfloss.com',
+'av.by',
+'soba4ki.livejournal.com',
+'pro.tonkosti.ru',
+'salamnews.org',
+'fsrussia.ru',
+'9tv.co.il',
+'gtrk-omsk.ru',
+'te-st.ru',
+'gubdaily.ru',
+'gomel.today',
+'kirovnet.ru',
+'news.join.ua',
+'novostroy-spb.ru',
+'musictimes.com',
+'blastr.com',
+'yp.fedpress.ru',
+'usatoday.com',
+'blog.fontanka.ru',
+'usolie.info',
+'profit.kz',
+'marpravda.ru',
+'france24.com',
+'sutynews.ru',
+'wolsk.ru',
+'vdomodedovo.info',
+'chervonec-001.livejournal.com',
+'comicvine.com',
+'kavkaz.mk.ru',
+'oregonlive.com',
+'social.ridus.ru',
+'evo-lutio.livejournal.com',
+'astrakhan-24.ru',
+'uchvatovsb.livejournal.com',
+'avvakoum.livejournal.com',
+'onliner.by',
+'burckina-faso.livejournal.com',
+'spydell.livejournal.com',
+'freedom.livejournal.com',
+'ru.ign.com',
+'ria-m.tv',
+'interesno.co',
+'smh.com.au',
+'pg13.ru',
+'syasnews.ru',
+'vestivrn.ru',
+'phonearena.com',
+'nme.com',
+'timesunion.com',
+'charsov.livejournal.com',
+'isra.com',
+'astanatv.kz',
+'moygorod-online.ru',
+'sem40.ru',
+'militariorg.ucoz.ru',
+'news.com.au',
+'espn.go.com',
+'deseretnews.com',
+'azerisport.com',
+'sciencealert.com',
+'orlandosentinel.com',
+'vgoroden.ru',
+'novorosinform.org',
+'novosti.dn.ua',
+'liwli.ru',
+'likeni.ru',
+'tettie.livejournal.com',
+'gothamist.com',
+'vrn.mk.ru',
+'comicbookresources.com',
+'tlt.ru',
+'inter.ua',
+'govorun26.ru',
+'sport.nur.kz',
+'7info.ru',
+'infpol.ru',
+'ng.kz',
+'gmorder.livejournal.com',
+'sibkray.ru',
+'thedenverchannel.com',
+'kurgan.ru',
+'vseprosport.ru',
+'crimsonalter.livejournal.com',
+'lady.nur.kz',
+'moto-magazine.ru',
+'geeksaresexy.net',
+'vv-34.ru',
+'wow-impulse.net',
+'echonedeli.ru',
+'globalaffairs.ru',
+'ibigdan.com',
+'kansascity.com',
+'the-day-x.ru',
+'vesti.az',
+'melon-panda.livejournal.com',
+'tatler.ru',
+'novorus.info',
+'gorky-look.livejournal.com',
+'waralbum.ru',
+'shri-boomer.livejournal.com',
+'text.khl.ru',
+'thecrimson.com',
+'briansk.ru',
+'shakkar.livejournal.com',
+'saracinua.livejournal.com',
+'nsk.kp.ru',
+'kentucky.com',
+'astronews.ru',
+'mikle1.livejournal.com',
+'ptoday.ru',
+'novgorod.ru',
+'vesti-sochi.tv',
+'samara.kp.ru',
+'swissinfo.ch',
+'ufatime.ru',
+'holmogor.livejournal.com',
+'alt.kp.ru',
+'humus.livejournal.com',
+'ancient-origins.net',
+'russianshowbiz.info',
+'sv.ru-m.org',
+'interfax.by',
+'skisport.ru',
+'zakon.kz',
+'sochi.com',
+'pro-n.by',
+'greenchelman-3.livejournal.com',
+'consequenceofsound.net',
+'nyka-huldra.livejournal.com',
+'perevodika.ru',
+'ntv.livejournal.com',
+'wired.co.uk',
+'total.kz',
+'morena-morana.livejournal.com',
+'ru.delfi.lt',
+'katysha.livejournal.com',
+'media.club4x4.ru',
+'dilbert.com',
+'droid-life.com',
+'mainfun.ru',
+'screenrant.com',
+'domodedovod.ru',
+'ont.by',
+'news.vdv-s.ru',
+'kalmykia-online.ru',
+'kaluga24.tv',
+'ok-magazine.ru',
+'sense-life.com',
+'ctv.ca',
+'grantland.com',
+'kolomna-spravka.ru',
+'sport.kazanfirst.ru',
+'gazetairkutsk.ru',
+'t.rbc.ru',
+'pcworld.com',
+'opposingviews.com',
+'rbcdaily.ru',
+'dom.63.ru',
+'trisosny.ru',
+'progorod33.ru',
+'kaliningrad.kp.ru',
+'bgr.com',
+'reason.com',
+'al.com',
+'mediamatters.org',
+'businessspectator.com.au',
+'kashin.guru',
+'syracuse.com',
+'dubikvit.livejournal.com',
+'fritzmorgen.livejournal.com',
+'foodclub-ru.livejournal.com',
+'goloskarpat.info',
+'paparazzi.ru',
+'malyshi.livejournal.com',
+'bit.ua',
+'netall.ru',
+'news.megatyumen.ru',
+'rus.azattyq.org',
+'isurok.livejournal.com',
+'inamora.livejournal.com',
+'volha.livejournal.com',
+'mediaite.com',
+'cinemablend.com',
+'potsreotizm.livejournal.com',
+'ufa.kp.ru',
+'dymovskiy-name.livejournal.com',
+'hor.passion.ru',
+'168.ru',
+'huffingtonpost.co.uk',
+'reb.by',
+'caravan.kz',
+'vesti48.ru',
+'vott.ru',
+'kirov-portal.ru',
+'news.vitebsk.cc',
+'110km.ru',
+'theglobeandmail.com',
+'novokuznetsk.su',
+'ivanoctober.livejournal.com',
+'kuban.mk.ru',
+'uproxx.com',
+'gezitter.org',
+'thestreet.com',
+'letchikleha.livejournal.com',
+'slashgear.com',
+'rusanalit.livejournal.com',
+'reporter.akipress.org',
+'moneycontrol.com',
+'polygon.com',
+'mashkind.livejournal.com',
+'cheremuha.com',
+'odsgomel.org',
+'chaskor.ru',
+'bespridanitsa.livejournal.com',
+'frant.me',
+'prilepin.livejournal.com',
+'pgatour.com',
+'hqroom.ru',
+'kotaku.com',
+'dolboeb.livejournal.com',
+'ej.by',
+'gizmodo.com',
+'irek-murtazin.livejournal.com',
+'barrons.com',
+'syzran-small.ru',
+'sportbo.ru',
+'xn----ctbsbazhbctieai.ru-an.info',
+'holodilnik.info',
+'digitalspy.com',
+'fratria.ru',
+'time.com',
+'vesti42.ru',
+'365news.biz',
+'upi.com',
+'xn--h1akeme.ru-an.info',
+'dengi.59.ru',
+'ast-news.ru',
+'blogs.pravda.com.ua',
+'sergeydolya.livejournal.com',
+'independent.ie',
+'sibved.livejournal.com',
+'nypost.com',
+'bimru.ru',
+'ru-aviation.livejournal.com',
+'theregister.co.uk',
+'thestir.cafemom.com',
+'forbes.kz',
+'roman-n.livejournal.com',
+'realty.vesti.ru',
+'indianexpress.com',
+'rapsinews.ru',
+'ulan.mk.ru',
+'vg-saveliev.livejournal.com',
+'secondstreet.ru',
+'vnnews.ru',
+'ara-bublik.livejournal.com',
+'yurayakunin.livejournal.com',
+'zelenyikot.livejournal.com',
+'newsko.ru',
+'visualhistory.livejournal.com',
+'bnews.kz',
+'tomsk.ru',
+'alternet.org',
+'ural.kp.ru',
+'zarulem.by',
+'blog.netpeak.ua',
+'macworld.com',
+'sport.ru',
+'desmoinesregister.com',
+'vsegda-tvoj.livejournal.com',
+'news.1777.ru',
+'nfl.com',
+'putin-today.ru',
+'dw.de',
+'hurriyetdailynews.com',
+'tampabay.com',
+'7mednews.ru',
+'macleans.ca',
+'malka-lorenz.livejournal.com',
+'dv.kp.ru',
+'chastnik.ru',
+'gazetarb.ru',
+'alexandr-rogers.livejournal.com',
+'astrakhanfm.ru',
+'newsweek.com',
+'novorossy.ru',
+'365info.kz',
+'baltimoresun.com',
+'saratov.kp.ru',
+'region15.ru',
+'nsktv.ru',
+'ft.com',
+'kak-eto-sdelano.livejournal.com',
+'spb.sovsport.ru',
+'theoatmeal.com',
+'avclub.com',
+'auto.29.ru',
+'apsny.ge',
+'omg.md',
+'obninsk.name',
+'journalufa.com',
+'ndn.info',
+'tayga.info',
+'sciencedump.com',
+'homester.com.ua',
+'krylov.livejournal.com',
+'beerplace.com.ua',
+'natamax.livejournal.com',
+'rusathletics.com',
+'cursiv.ru',
+'mmaboxing.ru',
+'facte.ru',
+'dorkly.com',
+'ofeliyadd.livejournal.com',
+'kazan.mk.ru',
+'fototelegraf.ru',
+'tv29.ru',
+'tut.by',
+'35media.ru',
+'rgo.ru',
+'yarjal.com',
+'bleacherreport.com',
+'hata.by',
+'oper-1974.livejournal.com',
+'livescience.com',
+'io9.com',
+'people.com',
+'theweek.com',
+'nymag.com',
+'businessinsider.com',
+'primecrime.ru',
+'gazeta13.ru',
+'irsenas.livejournal.com',
+'russiapost.su',
+'trend.az',
+'tkgorod.ru',
+'politico.com',
+'apn.ru',
+'andreistp.livejournal.com',
+'adweek.com',
+'stuff.co.nz',
+'space.com',
+'sarapul.net',
+'ko44.ru',
+'yar.kp.ru',
+'exler.livejournal.com',
+'newser.com',
+'penzanews.ru',
+'sportsgrid.com',
+'vlast.kz',
+'informationweek.com',
+'vidsboku.com',
+'mstrok.ru',
+'webmastermaksim.ru',
+'ukrinform.ua',
+'geo.ru',
+'galkovsky.livejournal.com',
+'karel.mk.ru',
+'mir-mag.livejournal.com',
+'prosto-gost.livejournal.com',
+'k-ur.ru',
+'mhl.khl.ru',
+'news.novgorod.ru',
+'cleveland.com',
+'theage.com.au',
+'kenigtiger.livejournal.com',
+'unian.ua',
+'starshinazapasa.livejournal.com',
+'yuripasholok.livejournal.com',
+'deadline.com',
+'aljazeera.com',
+'timesofisrael.com',
+'people-press.org',
+'medpagetoday.com',
+'freep.com',
+'aviaport.ru',
+'make-your-style.livejournal.com',
+'examiner.com',
+'phys.org',
+'andrei-bt.livejournal.com',
+'glamurchik.tochka.net',
+'newsinfo.inquirer.net',
+'altpress.com',
+'ibtimes.co.uk',
+'rul.by',
+'nationalreview.com',
+'lasvegassun.com',
+'gagauzinfo.md',
+'dailynews.com',
+'bohemicus.livejournal.com',
+'amfora.livejournal.com',
+'adindex.ru',
+'chispa1707.livejournal.com',
+'autoban.by',
+'portal-kultura.ru',
+'matrony.ru',
+'omsk.kp.ru',
+'podrobno.uz',
+'rusila.su',
+'dom.72.ru',
+'fn-volga.ru',
+'martin.livejournal.com',
+'thehindu.com',
+'miloserdie.ru',
+'sportingnews.com',
+'networkworld.com',
+'seattlepi.com',
+'ctv.by',
+'vseneobichnoe.livejournal.com',
+'techtimes.com',
+'macrumors.com',
+'novayagazeta.livejournal.com',
+'spiked-online.com',
+'aquatek-filips.livejournal.com',
+'sitv.ru',
+'arbaletfire.livejournal.com',
+'zavtra.ru',
+'chernovik.net',
+'evrazia.org',
+'news29.ru',
+'alex-aka-jj.livejournal.com',
+'luki.ru',
+'usnews.com',
+'xn--90aiasbk5as2f.xn--p1ai',
+'cardesign.ru',
+'newsbabr.com',
+'info.sibnet.ru',
+'wik-end.com',
+'flytothesky.ru',
+'rostov.rbc.ru',
+'ryazan.kp.ru',
+'rostov.kp.ru',
+'billionnews.ru',
+'admagazine.ru',
+'rebro-a-dama.livejournal.com',
+'velolive.com',
+'vb.kg',
+'sarinform.ru',
+'stainlesstlrat.livejournal.com',
+'metalinjection.net',
+'amurmedia.ru',
+'top.thepo.st',
+'che-online.com',
+'volga-tv.ru',
+'mercurynews.com',
+'rodgor-vlg.ru',
+'komikz.ru',
+'ca-news.org',
+'greenpeace.org',
+'alex-leshy.livejournal.com',
+'valyaeva.ru',
+'usmagazine.com',
+'sergeytsvetkov.livejournal.com',
+'tradelikeapro.ru',
+'autostat.ru',
+'go32.ru',
+'mediapost.com',
+'ru-an.info',
+'mixednews.ru',
+'auto.161.ru',
+'most.tv',
+'yarnews.net',
+'tvtomsk.ru',
+'xkcd.com',
+'riatomsk.ru',
+'ais.by',
+'4vsar.ru',
+'khabar.ibnlive.com',
+'infodoktor.by',
+'eaomedia.ru',
+'laughingsquid.com',
+'islamnews.ru',
+'masslive.com',
+'glazovportal.net',
+'forum.gipsyteam.ru',
+'sport-weekend.com',
+'express.co.uk',
+'riadagestan.ru',
+'politsovet.ru',
+'pryf.livejournal.com',
+'chrono-tm.org',
+'newsroom24.ru',
+'rbworld.org',
+'sports.kz',
+'puerrtto.livejournal.com',
+'konkretno.ru',
+'kursiv.kz',
+'money.rbc.ru',
+'tutuskania.livejournal.com',
+'arbatovagidepar.livejournal.com',
+'rollingstone.com',
+'nslovo.info',
+'newsbel.by',
+'thestate.com',
+'theatlantic.com',
+'ivanovonews.ru',
+'ao.by',
+'sportsdaily.ru',
+'pushkino.tv',
+'kg.akipress.org',
+'kopeika.org',
+'royalcheese.ru',
+'tmz.com',
+'ab.onliner.by',
+'zwezda.net',
+'diapazon.kz',
+'kagemushanatako.livejournal.com',
+'pravdapfo.ru',
+'afn.by',
+'24.kg',
+'niann.ru',
+'cbsnews.com',
+'weeklystandard.com',
+'ufacity.info',
+'gorodusinsk.ru',
+'newsarama.com',
+'pinwin.ru',
+'indiatimes.com',
+'doodoo.ru',
+'sun-sentinel.com',
+'variety.com',
+'diak-kuraev.livejournal.com',
+'maks-portal.ru',
+'73online.ru',
+'slate.com',
+'beautyinsider.ru',
+'kiss-my-abs.livejournal.com',
+'auto.altapress.ru',
+'day.az',
+'dawn.com',
+'prima-tv.ru',
+'ruscur.ru',
+'omskpress.ru',
+'awas1952.livejournal.com',
+'dom.59.ru',
+'samara.ru',
+'bikeradar.com',
+'engineering-ru.livejournal.com',
+'xn----ctbsbaa3aibxhck.ru-an.info',
+'video.khl.ru',
+'thesun.co.uk',
+'ajc.com',
+'technologyreview.com',
+'vesti-ukr.com',
+'ekb.rbc.ru',
+'8plus1.ru',
+'korabel.ru',
+'k1news.ru',
+'mixnews.lv',
+'ekb.dk.ru',
+'pavel-sviridov.livejournal.com',
+'courant.com',
+'scientificamerican.com',
+'dnaindia.com',
+'popsci.com',
+'aftershock-1.livejournal.com',
+'ubergizmo.com',
+'ndtv.com',
+'zabinfo.ru',
+'prochepetsk.ru',
+'superomsk.ru',
+'ivakin-alexey.livejournal.com',
+'discovery.com',
+'utexas.edu',
+'gts.tv',
+'footballtop.ru',
+'bloody-disgusting.com',
+'arstechnica.com',
+'vykza.ru',
+'vaduhan-08.livejournal.com',
+'bither.livejournal.com',
+'rus-obr.ru',
+'sakhalin.info',
+'bocharik.livejournal.com',
+'drugoigorod.ru',
+'topic.lt',
+'putin-slil.livejournal.com',
+'pavel-shipilin.livejournal.com',
+'geek.com',
+'darsik-dasha.livejournal.com',
+'tver.kp.ru',
+'aktau-business.com',
+'volna.afisha.ru',
+'informpskov.ru',
+'susanin.udm.ru',
+'venturebeat.com',
+'mcall.com',
+'denofgeek.com',
+'artemdragunov.livejournal.com',
+'niasam.ru',
+'communitarian.ru',
+'kalugahouse.ru',
+'solnyszka.livejournal.com',
+'stltoday.com',
+'periskop.livejournal.com',
+'technobuffalo.com',
+'rugrad.eu',
+'extremetech.com',
+'miamiherald.com',
+'digitaltrends.com',
+'kuban.rbc.ru',
+'fox4kc.com',
+'newsok.com',
+'gtrk.tv',
+'yerkramas.org',
+'rt.rbc.ru',
+'nbcsports.com',
+'bizjournals.com',
+'2x2.su',
+'dailycaller.com',
+'v102.ru',
+'nydailynews.com',
+'ysia.ru',
+'biathlonrus.com',
+'bloodandsweat.ru',
+'newsvo.ru',
+'nn.mk.ru',
+'people.passion.ru',
+'biserok.org',
+'orenday.ru',
+'marketwatch.com',
+'afanasy.biz',
+'ya-kadyrov.livejournal.com',
+'chelnyltd.ru',
+'truthdig.com',
+'uk.eonline.com',
+'bobsoccer.ru',
+'kv.by',
+'realty.ngs.ru',
+'mirf.ru',
+'u-tv.ru',
+'mk.tula.ru',
+'adn.com',
+'star-telegram.com',
+'techradar.com',
+'ru-cats.livejournal.com',
+'marvel.com',
+'pppirate.livejournal.com',
+'proboknet.livejournal.com',
+'superkarate.ru',
+'drugoi.livejournal.com',
+'mycity.by',
+'pskov.kp.ru',
+'benzinga.com',
+'velikiynovgorod.ru',
+'qestigra.ru',
+'5min.by',
+'kirov.kp.ru',
+'onlinetambov.ru',
+'ibtimes.com',
+'hueviebin1.livejournal.com',
+'pachom.livejournal.com',
+'auto.onliner.by',
+'wrestdag.ru',
+'ex-press.by',
+'beauty-nax.livejournal.com',
+'andreyvadjra.livejournal.com',
+'nesn.com',
+'hrono61.livejournal.com',
+'dailyfinance.com',
+'discred.ru',
+'devyatka.ru',
+'skysports.com',
+'kaluga-poisk.ru',
+'politsib.ru',
+'nationalgeographic.com',
+'ru.reuters.com',
+'alau.kz',
+'perm.rbc.ru',
+'fighttime.ru',
+'ru.apa.az',
+'home-and-garden.livejournal.com',
+'news.nashbryansk.ru',
+'legatus-pretor.livejournal.com',
+'presstv.ir',
+'kuban.kp.ru',
+'kot-de-azur.livejournal.com',
+'kuzpress.ru',
+'comicsalliance.com',
+'tbo.com',
+'viking-nord.livejournal.com',
+'abrod.livejournal.com',
+'svodka.akipress.org',
+'cosharel.livejournal.com',
+'onedivision.ru',
+'tazabek.kg',
+'thinkprogress.org',
+'zasekin.ru',
+'aif.by',
+'strajj.livejournal.com',
+'prweb.com',
+'infobank.by',
+'gg34.ru',
+'sib.fm',
+'koketka.livejournal.com',
+'td5howard.livejournal.com',
+'megatyumen.ru',
+'timbuktoo.livejournal.com',
+'charlotteobserver.com',
+'latimes.com',
+'gazeta-n1.ru',
+'doneck-news.com',
+'scandaly.ru',
+'vesti.ua',
+'newsobserver.com',
+'news.ngs.ru',
+'vkarpinsk.info',
+'putnik1.livejournal.com',
+'pesen-net.livejournal.com',
+'newdaynews.ru',
+'equestrian.ru',
+'fotografersha.livejournal.com',
+'serovglobus.ru',
+'foxbusiness.com',
+'jacksonville.com',
+'ural56.ru',
+'maxfux.livejournal.com',
+'dostup1.ru',
+'tatpressa.ru',
+'nasa.gov',
+'jewish.ru',
+'t-itanium.livejournal.com',
+'dimabalakirev.livejournal.com',
+'mb.com.ph',
+'mosaica.ru',
+'tainy.net',
+'bel.ru',
+'inform.kz',
+'votkinsk.net',
+'odintsovo.info',
+'klaxon.ru',
+'teh-nomad.livejournal.com',
+'lev-sharansky2.livejournal.com',
+'iflscience.com',
+'foxsports.com',
+'got.vg',
+'5sfer.com',
+'android.mobile-review.com',
+'xn--80ajoghfjyj0a.xn--p1ai',
+'irishtimes.com',
+'emelamud.livejournal.com',
+'mnenia.zahav.ru',
+'mgorod.kz',
+'news.ircity.ru',
+'novorossia.su',
+'sexmotor.livejournal.com',
+'wod-1958.livejournal.com',
+'andrey-kuprikov.livejournal.com',
+'kerzak-1.livejournal.com',
+'maxkatz.livejournal.com',
+'portamur.ru',
+'avto.kazanfirst.ru',
+'sledcom.ru',
+'p-i-f.livejournal.com',
+'chern-molnija.livejournal.com',
+'sokol-ff.livejournal.com',
+'cbc.ca',
+'paranormal-news.ru',
+'pitchfork.com',
+'azh.kz',
+'archi.ru',
+'tvcom-tv.ru',
+'salon.com',
+'pora-valit.livejournal.com',
+'cherinfo.ru',
+'football.ua',
+'ai-zhilin.livejournal.com',
+'doktorbel.livejournal.com',
+'tsn.ua',
+'gorobzor.ru',
+'auto.72.ru',
+'dobre.stb.ua',
+'hypetrak.com',
+'53news.ru',
+'mozhga.net',
+'uglich-jj.livejournal.com',
+'npubop.livejournal.com',
+'vox.com',
+'sbnation.com',
+'iskra-kungur.ru',
+'arabic.rt.com',
+'lovigin.livejournal.com',
+'pennlive.com',
+'miss-tramell.livejournal.com',
+'open.by',
+'sacbee.com',
+'udf.by',
+'40161.ru',
+'panzerbar.livejournal.com',
+'rotoworld.com',
+'b-online.ru',
+'oppps.ru',
+'ruscesar.livejournal.com',
+'theins.ru',
+'vesti-yamal.ru',
+'euroradio.fm',
+'grodno24.com',
+'flgr.ru',
+'actualcomment.ru',
+'asiarussia.ru',
+'pravdasevera.ru',
+'apn-spb.ru',
+'samara-ru.livejournal.com',
+'tech.onliner.by',
+'gazetavolgodonsk.ru',
+'walera11.livejournal.com',
+'motherjones.com',
+'techspot.com',
+'molonlabe.livejournal.com',
+'billboard.com',
+'ocregister.com',
+'ctv7.ru',
+'tobolsk.ru',
+'kado4nikov.livejournal.com',
+'tv-rb.ru',
+'fool.com',
+'gorodche.ru',
+'f1-world.ru',
+'tourdom.ru',
+'techbrowsing.com',
+'szhaman.livejournal.com',
+'sb.by',
+'rostec.ru',
+'zacks.com',
+'i-news.kz',
+'chexov.net',
+'mockwa.com',
+'varjag-2007.livejournal.com',
+'privetsochi.ru',
+'waitbutwhy.com',
+'prnewswire.com',
+'chaiknet.ru',
+'prostitutka-ket.livejournal.com',
+'ulyanovskcity.ru',
+'auto.vesti.ru',
+'ihoraksjuta.livejournal.com',
+'rostov.dk.ru',
+'abw.by',
+'avtosreda.ru',
+'segodnia.ru',
+'tanya-mass.livejournal.com',
+'rebenok.by',
+'12news.uz',
+'albert-lex.livejournal.com',
+'boingboing.net',
+'u-96.livejournal.com',
+'denverpost.com',
+'nikitskij.livejournal.com',
+'tavto.ru',
+'odin-moy-den.livejournal.com',
+'nerdist.com',
+'hotnewhiphop.com',
+'newregion.kz',
+'kanchukov-sa.livejournal.com',
+'zebra-tv.ru',
+'chel.kp.ru',
+'primeminister.kz',
+'sfgate.com',
+'murmansk.kp.ru',
+'novos.mk.ru',
+'islam.ru',
+'mlb.com',
+'charter97.org',
+'echo.az',
+'rk.karelia.ru',
+'tvnz.co.nz',
+'volgograd-trv.ru',
+'progorod76.ru',
+'1istochnik.ru',
+'varandej.livejournal.com',
+'newskaz.ru',
+'statesman.com',
+'bleedingcool.com',
+'chel.dk.ru',
+'nemoold.livejournal.com',
+'uborshizzza.livejournal.com',
+'select.by',
+'kem.kp.ru',
+'kapital.kz',
+'uraldaily.ru',
+'abs-cbnnews.com',
+'volkovysk.by',
+'today.com',
+'mi3ch.livejournal.com',
+'rus.ozodi.org',
+'volzsky.ru',
+'macradar.ru',
+'kolobok1973.livejournal.com',
+'littlehirosima.livejournal.com',
+'tofight.ru',
+'canadianbusiness.com',
+'gmichailov.livejournal.com',
+'seva-riga.livejournal.com',
+'stuff.tv',
+'uk.eurosport.yahoo.com',
+'deccanherald.com',
+'rollingstone.ru',
+'eurofootball.ru',
+'palmbeachpost.com',
+'21.by',
+'vmolo.by',
+'hawk.ru',
+'nj.com',
+'vlg.aif.ru',
+'nv-online.info',
+'korea-blog.livejournal.com',
+'baltinfo.ru',
+'rossosh.bloknot-voronezh.ru',
+'meditation-portal.com',
+'bloknot-volzhsky.ru',
+'dpmmax.livejournal.com',
+'ru-auto.livejournal.com',
+'frontpagemag.com',
+'mkala.mk.ru',
+'citysakh.ru',
+'rovego.livejournal.com',
+'allsportinfo.ru',
+'miumau.livejournal.com',
+'rawstory.com',
+'lady.ru',
+'comicbookmovie.com',
+'homes.e1.ru',
+'myudm.ru',
+'nola.com',
+'tengrinews.kz',
+'foxnews.com',
+'stars365.livejournal.com',
+'zt16.ru',
+'vesti-kpss.livejournal.com',
+'weacom.ru',
+'actualidad.rt.com',
+'polosa.co.il',
+'1777.ru',
+'twower.livejournal.com',
+'gigaom.com',
+'pravdanews.info',
+'katun24.ru',
+'barnaul.fm',
+'altaynews.kz',
+'denokan.livejournal.com',
+'uralpolit.ru',
+'tumen.kp.ru',
+'cjonline.com',
+'post-gazette.com',
+'superherohype.com',
+'medicalnewstoday.com',
+'amsrus.ru',
+'om-saratov.ru',
+'nstarikov.livejournal.com',
+'rusrep.ru',
+'oblast45.ru',
+'mtv.com',
+'canadafreepress.com',
+'voanews.com',
+'oleglurie-new.livejournal.com',
+'russkiy-malchik.livejournal.com',
+'finance.tut.by',
+'m-kalashnikov.livejournal.com',
+'vyatka.ru',
+'business-class.su',
+'nationalpost.com',
+'63ru.livejournal.com',
+'mchs.gov.by',
+'naviny.by',
+'ew.com',
+'bloknot-volgodonsk.ru',
+'stogova.livejournal.com',
+'tv.mk.ru',
+'realty.altapress.ru',
+'i-korotchenko.livejournal.com',
+'scalemodels.ru',
+'etoonda.livejournal.com',
+'evening-kazan.ru',
+'bryansknovosti.ru',
+'kushva-online.ru',
+'belaruspartisan.org',
+'inquisitr.com',
+'infokam.su',
+'healthinfo.ua',
+'comicbook.com',
+'mashable.com',
+'washingtonexaminer.com',
+'a-s-k-e-t.livejournal.com',
+'sayanogorsk.info',
+'dgl.ru',
+'pervo.ru',
+'omaha.com',
+'mid-day.com',
+'myfin.by',
+'kotelnich.info',
+'alex-anpilogov.livejournal.com',
+'wrestrus.ru',
+'7x7-journal.ru',
+'natabelu.livejournal.com',
+'biser.info',
+'rus.postimees.ee',
+'dela.ru',
+'digitall-angell.livejournal.com',
+'chron.com',
+'chelny-biz.ru',
+'a-nalgin.livejournal.com',
+'kukmor.livejournal.com',
+'crimerussia.ru',
+'mordovmedia.ru',
+'parade.com',
+'3dtoday.ru',
+'vkusnyblog.ru',
+'newstula.ru',
+'soccernews.ru',
+'eilin-o-connor.livejournal.com',
+'mentbuster.livejournal.com',
+'kaotic.com',
+'rossoshru.ru',
+'she.ngs.ru',
+'news.sarbc.ru',
+'baikal-daily.ru',
+'thequietus.com',
+'flb.ru',
+'stockinfocus.ru',
+'xobi.com.ua',
+'eonline.com',
+'ru-railway.livejournal.com',
+'andrey-cruz.livejournal.com',
+'19rus.info',
+'pauluskp.livejournal.com',
+'calipsodellmar.livejournal.com',
+'newtimes.kz',
+'abcnews.go.com',
+'plush-koala.livejournal.com',
+'newscientist.com',
+'ss69100.livejournal.com',
+'contactmusic.com',
+'smolnarod.ru',
+'bnkirov.ru',
+'norg-norg.livejournal.com',
+'slashfilm.com',
+'dallasnews.com',
+'oren.ru',
+'point.md',
+'orelgrad.ru',
+'pressball.by',
+'forum-msk.org',
+'gradus.pro',
+'gazeta.uz',
+'matveychev-oleg.livejournal.com',
+'apsnypress.info',
+'46tv.ru',
+'ku66.ru',
+'video.komarovskiy.net',
+'mysanantonio.com',
+'kavpolit.com',
+'dima-piterski.livejournal.com',
+'made-inussr.livejournal.com',
+'thehill.com',
+'sciencemag.org',
+'pcmag.com',
+'europaplustv.com',
+'rjadovoj-rus.livejournal.com',
+'govp.info',
+'heritage.org',
+'perm.kp.ru',
+'shurigin.livejournal.com',
+'tuday.ru',
+'knews.kg',
+'shushpanzer-ru.livejournal.com',
+'webtous.ru',
+'boston.com',
+'odnako.org',
+'ironworld.ru',
+'dailybest.me',
+'da-dzi.livejournal.com',
+'versia.ru',
+'autosport.com.ru',
+'pravda-news.ru',
+'pocketnow.com',
+'asaratov.livejournal.com',
+'dddkursk.ru',
+'letohin.livejournal.com',
+'theaustralian.com.au',
+'steptohealth.ru',
+'alexcheban.livejournal.com',
+'lleo.me',
+'prodengi.kz',
+'readovka.ru',
+'efir24.tv',
+'ru-bykov.livejournal.com',
+'today.kz',
+'kasparov.ru.',
+'chelsea-fc.ru',
+'academ.info',
+'feministki.livejournal.com',
+'iarex.ru',
+'marimedia.ru',
+'androidcommunity.com',
+'uzoranet.livejournal.com',
+'ru-vederko.livejournal.com',
+'tanjand.livejournal.com',
+'komionline.ru',
+'gazette.com',
+'auto.tut.by',
+'ted.com',
+'mic.com',
+'spb.mk.ru',
+'berdsk-online.ru',
+'ossetia.ru',
+'ki-bella.livejournal.com',
+'keytas.ru',
+'severinform.ru',
+'tvolk.ru',
+'balashover.ru',
+'tor.com',
+'news.21.by',
+'karelinform.ru',
+'marv.livejournal.com',
+'seekingalpha.com',
+'ntsk.ru',
+'ksy-putan.livejournal.com',
+'universetoday.com',
+'thenextweb.com',
+'foma.ru',
+'kchetverg.ru',
+'ftbl.ru',
+'altyn-orda.kz',
+'ua.tribuna.com',
+'56orb.ru',
+'vesti.karelia.ru',
+'haaretz.com',
+'twentysix.ru',
+'primorye24.ru',
+'jsonline.com',
+'tobolsk.info',
+'tennessean.com',
+'moment-istini.com',
+'vrn.kp.ru',
+'navalny.livejournal.com',
+'roomble.com',
+'observer.com',
+'kyky.org',
+'news.chita.ru',
+'gov.cap.ru',
+'ammo1.livejournal.com',
+'wnyc.org',
+'whrussia.ru',
+'belan-olga.livejournal.com',
+'arguendi.livejournal.com',
+'freesmi.by',
+'greenbot.com',
+'(nemihail.livejournal.com',
+'obltv.ru',
+'sterlegrad.ru',
+'mlive.com',
+'gpk.gov.by',
+'fanatik.kz',
+'marina-yudenich.livejournal.com',
+'afisha.ngs.ru',
+'kupchinonews.ru',
+'shakin.ru',
+'silver.ru',
+'mirnov.ru',
+'techcrunch.com',
+'streetinsider.com',
+'otyrar.kz',
+'siapress.ru',
+'krsk.kp.ru',
+'becky-sharpe.livejournal.com',
+'mkala.ru',
+'prosto-vova.livejournal.com',
+'tagilcity.ru',
+'bloknot-krasnodar.ru',
+'greg-butcher.livejournal.com',
+'popados.livejournal.com',
+'mossudmed.livejournal.com',
+'s13.ru',
+'globalconflict.ru',
+'newyorker.com',
+'vladnews.ru',
+'kadykchanskiy.livejournal.com',
+'vladimir-krm.livejournal.com',
+'globalpost.com',
+'smolensk-i.ru',
+'newsmax.com',
+'providers.by',
+'theverge.com',
+'samsebeskazal.livejournal.com',
+'vb.by',
+'people.onliner.by',
+'peopleandcountries.com',
+'roizman.livejournal.com',
+'omvesti.ru',
+'sterlitamak.ru',
+'patch.com',
+'khabtime.info',
+'winnipegfreepress.com',
+'davydov-index.livejournal.com'
+);
diff --git a/yt/yql/tests/sql/suites/in/in_ansi_join.cfg b/yt/yql/tests/sql/suites/in/in_ansi_join.cfg
new file mode 100644
index 0000000000..ebb9b67252
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_ansi_join.cfg
@@ -0,0 +1,2 @@
+in Input input_optkey1.txt
+in Dict optdict.txt
diff --git a/yt/yql/tests/sql/suites/in/in_ansi_join.sql b/yt/yql/tests/sql/suites/in/in_ansi_join.sql
new file mode 100644
index 0000000000..48bfb9d637
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_ansi_join.sql
@@ -0,0 +1,52 @@
+/* syntax version 1 */
+/* postgres can not */
+
+PRAGMA AnsiInForEmptyOrNullableItemsCollections;
+
+USE plato;
+
+-- Input: optkeys are 1-10,null
+-- Dict: keys are 1,5,7,9,11,null
+
+-- Either side can be: non-optional (P), optional without nulls (O), optional with nulls (N) - we test each of possible combination
+
+$lp = (SELECT Unwrap(optkey) AS optkey FROM Input WHERE optkey IS NOT NULL);
+$lo = (SELECT optkey FROM Input WHERE optkey IS NOT NULL);
+$ln = (SELECT optkey FROM Input);
+
+$rp = (SELECT Unwrap(key) AS key FROM Dict WHERE key IS NOT NULL);
+$ro = (SELECT key FROM Dict WHERE key IS NOT NULL);
+$rn = (SELECT key FROM Dict);
+
+
+-- Right is P
+SELECT optkey FROM $lp WHERE optkey NOT IN $rp ORDER BY optkey; -- [2,3,4,6,8,10]
+SELECT optkey FROM $lo WHERE optkey NOT IN $rp ORDER BY optkey; -- [2,3,4,6,8,10]
+SELECT optkey FROM $ln WHERE optkey NOT IN $rp ORDER BY optkey; -- [2,3,4,6,8,10]
+
+-- Right is O
+SELECT optkey FROM $lp WHERE optkey NOT IN $ro ORDER BY optkey; -- [2,3,4,6,8,10]
+SELECT optkey FROM $lo WHERE optkey NOT IN $ro ORDER BY optkey; -- [2,3,4,6,8,10]
+SELECT optkey FROM $ln WHERE optkey NOT IN $ro ORDER BY optkey; -- [2,3,4,6,8,10]
+
+-- Right is N
+SELECT optkey FROM $lp WHERE optkey NOT IN $rn ORDER BY optkey; -- []
+SELECT optkey FROM $lo WHERE optkey NOT IN $rn ORDER BY optkey; -- []
+SELECT optkey FROM $ln WHERE optkey NOT IN $rn ORDER BY optkey; -- []
+
+
+-- 2, 4, 6, null
+$extraDict = (
+ SELECT 2 AS key UNION ALL
+ SELECT 4 AS key UNION ALL
+ SELECT 6 AS key UNION ALL
+ SELECT NULL AS key
+);
+
+SELECT optkey FROM $lo WHERE optkey != 10 AND optkey NOT IN $ro AND optkey IN $extraDict AND optkey != 4 ORDER BY optkey; -- [2,6]
+SELECT optkey FROM $ln WHERE optkey != 10 AND optkey NOT IN $rn AND optkey IN $extraDict AND optkey != 4 ORDER BY optkey; -- []
+
+
+-- Empty dict
+SELECT optkey FROM $ln WHERE optkey NOT IN (SELECT * FROM $rn LIMIT 0) ORDER BY optkey; -- [1-10,null]
+
diff --git a/yt/yql/tests/sql/suites/in/in_compact_distinct-empty.cfg b/yt/yql/tests/sql/suites/in/in_compact_distinct-empty.cfg
new file mode 100644
index 0000000000..6fe36b7db3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_compact_distinct-empty.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+in Input1 empty.txt
diff --git a/yt/yql/tests/sql/suites/in/in_compact_distinct.cfg b/yt/yql/tests/sql/suites/in/in_compact_distinct.cfg
new file mode 100644
index 0000000000..50ebbf3511
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_compact_distinct.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+in Input1 input.txt
diff --git a/yt/yql/tests/sql/suites/in/in_compact_distinct.sql b/yt/yql/tests/sql/suites/in/in_compact_distinct.sql
new file mode 100644
index 0000000000..f941a8facd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_compact_distinct.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+use plato;
+
+select * from Input
+where key in compact (select distinct key from Input1)
+order by key;
diff --git a/yt/yql/tests/sql/suites/in/in_enum_single0.sql b/yt/yql/tests/sql/suites/in/in_enum_single0.sql
new file mode 100644
index 0000000000..f29aa9092e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_enum_single0.sql
@@ -0,0 +1 @@
+select * from plato.Input where key in ("023")
diff --git a/yt/yql/tests/sql/suites/in/in_enum_single1.sql b/yt/yql/tests/sql/suites/in/in_enum_single1.sql
new file mode 100644
index 0000000000..33d6f33878
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_enum_single1.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select * from plato.Input where cast(key as uint32) not in (150,)
diff --git a/yt/yql/tests/sql/suites/in/in_exists_immediate_nested_subq.cfg b/yt/yql/tests/sql/suites/in/in_exists_immediate_nested_subq.cfg
new file mode 100644
index 0000000000..a6d8867ac9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_exists_immediate_nested_subq.cfg
@@ -0,0 +1,6 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/in/in_exists_immediate_nested_subq.sql b/yt/yql/tests/sql/suites/in/in_exists_immediate_nested_subq.sql
new file mode 100644
index 0000000000..44928dec83
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_exists_immediate_nested_subq.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+/* ignore runonopt plan diff */
+
+use plato;
+
+$q = (select key from Input order by key limit 100);
+$q1 = (select * from $q order by key limit 100);
+
+select * from Input where key in (select * from $q order by key limit 100) order by key;
+select * from Input where key in $q1 order by key;
+
+SELECT EXISTS (select key from $q) from Input;
+
+SELECT $q;
diff --git a/yt/yql/tests/sql/suites/in/in_immediate_subquery.sql b/yt/yql/tests/sql/suites/in/in_immediate_subquery.sql
new file mode 100644
index 0000000000..e3a7202fc5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_immediate_subquery.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+use plato;
+
+select * from Input4 where subkey not in (select key || "0" from Input4) order by key,subkey;
+
+select * from Input4 where subkey in compact(select key || "0" from Input4) order by key,subkey;
diff --git a/yt/yql/tests/sql/suites/in/in_noansi_join.cfg b/yt/yql/tests/sql/suites/in/in_noansi_join.cfg
new file mode 100644
index 0000000000..ebb9b67252
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_noansi_join.cfg
@@ -0,0 +1,2 @@
+in Input input_optkey1.txt
+in Dict optdict.txt
diff --git a/yt/yql/tests/sql/suites/in/in_noansi_join.sql b/yt/yql/tests/sql/suites/in/in_noansi_join.sql
new file mode 100644
index 0000000000..ee043447f3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_noansi_join.sql
@@ -0,0 +1,52 @@
+/* syntax version 1 */
+/* postgres can not */
+
+PRAGMA DisableAnsiInForEmptyOrNullableItemsCollections;
+
+USE plato;
+
+-- Input: optkeys are 1-10,null
+-- Dict: keys are 1,5,7,9,11,null
+
+-- Either side can be: non-optional (P), optional without nulls (O), optional with nulls (N) - we test each of possible combination
+
+$lp = (SELECT Unwrap(optkey) AS optkey FROM Input WHERE optkey IS NOT NULL);
+$lo = (SELECT optkey FROM Input WHERE optkey IS NOT NULL);
+$ln = (SELECT optkey FROM Input);
+
+$rp = (SELECT Unwrap(key) AS key FROM Dict WHERE key IS NOT NULL);
+$ro = (SELECT key FROM Dict WHERE key IS NOT NULL);
+$rn = (SELECT key FROM Dict);
+
+
+-- Right is P
+SELECT optkey FROM $lp WHERE optkey NOT IN $rp ORDER BY optkey; -- [2,3,4,6,8,10]
+SELECT optkey FROM $lo WHERE optkey NOT IN $rp ORDER BY optkey; -- [2,3,4,6,8,10]
+SELECT optkey FROM $ln WHERE optkey NOT IN $rp ORDER BY optkey; -- [null,2,3,4,6,8,10]
+
+-- Right is O
+SELECT optkey FROM $lp WHERE optkey NOT IN $ro ORDER BY optkey; -- [2,3,4,6,8,10]
+SELECT optkey FROM $lo WHERE optkey NOT IN $ro ORDER BY optkey; -- [2,3,4,6,8,10]
+SELECT optkey FROM $ln WHERE optkey NOT IN $ro ORDER BY optkey; -- [null,2,3,4,6,8,10]
+
+-- Right is N
+SELECT optkey FROM $lp WHERE optkey NOT IN $rn ORDER BY optkey; -- [2,3,4,6,8,10]
+SELECT optkey FROM $lo WHERE optkey NOT IN $rn ORDER BY optkey; -- [2,3,4,6,8,10]
+SELECT optkey FROM $ln WHERE optkey NOT IN $rn ORDER BY optkey; -- [null,2,3,4,6,8,10]
+
+
+-- 2, 4, 6, null
+$extraDict = (
+ SELECT 2 AS key UNION ALL
+ SELECT 4 AS key UNION ALL
+ SELECT 6 AS key UNION ALL
+ SELECT NULL AS key
+);
+
+SELECT optkey FROM $lo WHERE optkey != 10 AND optkey NOT IN $ro AND optkey IN $extraDict AND optkey != 4 ORDER BY optkey; -- [2,6]
+SELECT optkey FROM $ln WHERE optkey != 10 AND optkey NOT IN $rn AND optkey IN $extraDict AND optkey != 4 ORDER BY optkey; -- [2,6]
+
+
+-- Empty dict
+SELECT optkey FROM $ln WHERE optkey NOT IN (SELECT * FROM $rn LIMIT 0) ORDER BY optkey; -- [1-10,null]
+
diff --git a/yt/yql/tests/sql/suites/in/in_scalar_vector_subquery.sql b/yt/yql/tests/sql/suites/in/in_scalar_vector_subquery.sql
new file mode 100644
index 0000000000..b92955efde
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_scalar_vector_subquery.sql
@@ -0,0 +1,29 @@
+/* postgres can not */
+
+use plato;
+
+$bar = (select "1" union all select "2");
+$barr = (select "1" as subkey union all select "2" as subkey);
+
+select "1" in $bar, "2" in $bar;
+select "3" in $bar;
+
+select "1" in AsList($barr), "2" in AsList($barr);
+select "3" in AsList($barr);
+
+select * from Input where subkey in $bar order by subkey;
+select * from Input where subkey in AsList($barr) order by subkey;
+
+-- same content as $bar
+$baz = (select subkey from Input where subkey == "1" or subkey == "2");
+$bazz = (select subkey from Input where subkey < "3" order by subkey asc limit 1);
+
+select "1" in $baz, "2" in $baz;
+select "3" in $baz;
+
+select "1" in AsList($bazz), "2" in AsList($bazz);
+select "3" in AsList($bazz);
+
+select * from Input where subkey in $baz order by subkey;
+select * from Input where subkey in AsList($bazz) order by subkey;
+
diff --git a/yt/yql/tests/sql/suites/in/in_sorted.cfg b/yt/yql/tests/sql/suites/in/in_sorted.cfg
new file mode 100644
index 0000000000..1ab381f28d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_sorted.cfg
@@ -0,0 +1 @@
+in InputSorted sorted.txt
diff --git a/yt/yql/tests/sql/suites/in/in_sorted.sql b/yt/yql/tests/sql/suites/in/in_sorted.sql
new file mode 100644
index 0000000000..20907b1bee
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_sorted.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+$in = select key from InputSorted where key < "100";
+
+select * from InputSorted where key in $in;
diff --git a/yt/yql/tests/sql/suites/in/in_sorted_by_tuple.cfg b/yt/yql/tests/sql/suites/in/in_sorted_by_tuple.cfg
new file mode 100644
index 0000000000..8d8f865ecc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_sorted_by_tuple.cfg
@@ -0,0 +1,2 @@
+in InputSorted sorted.txt
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/in/in_sorted_by_tuple.sql b/yt/yql/tests/sql/suites/in/in_sorted_by_tuple.sql
new file mode 100644
index 0000000000..ff3e72a710
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_sorted_by_tuple.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+select value, AGG_LIST_DISTINCT(tpl) as tuples
+from (
+ select AsTuple(key, subkey, value) as tpl, value from InputSorted
+)
+where value in (select DISTINCT value from Input)
+group by value;
diff --git a/yt/yql/tests/sql/suites/in/in_tablesource_on_raw_list.cfg b/yt/yql/tests/sql/suites/in/in_tablesource_on_raw_list.cfg
new file mode 100644
index 0000000000..a6d8867ac9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_tablesource_on_raw_list.cfg
@@ -0,0 +1,6 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/in/in_tablesource_on_raw_list.sql b/yt/yql/tests/sql/suites/in/in_tablesource_on_raw_list.sql
new file mode 100644
index 0000000000..07522e60f6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_tablesource_on_raw_list.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+use plato;
+PRAGMA AnsiInForEmptyOrNullableItemsCollections;
+
+$src = (select cast(key as Int32) from Input);
+
+select ListFilter(ListFromRange(1, 100), ($i) -> { RETURN $i IN $src; });
diff --git a/yt/yql/tests/sql/suites/in/in_tablesource_to_equijoin.cfg b/yt/yql/tests/sql/suites/in/in_tablesource_to_equijoin.cfg
new file mode 100644
index 0000000000..35c6d38395
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_tablesource_to_equijoin.cfg
@@ -0,0 +1 @@
+in Input input_optkey.txt
diff --git a/yt/yql/tests/sql/suites/in/in_tablesource_to_equijoin.sql b/yt/yql/tests/sql/suites/in/in_tablesource_to_equijoin.sql
new file mode 100644
index 0000000000..60ebfb97d9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_tablesource_to_equijoin.sql
@@ -0,0 +1,27 @@
+/* postgres can not */
+
+USE plato;
+
+$r4_20 = (SELECT optkey FROM Input WHERE optkey BETWEEN 4 AND 20);
+$r6_20 = (SELECT key FROM Input WHERE optkey BETWEEN 6 AND 20);
+$r8_20 = (SELECT key FROM Input WHERE optkey BETWEEN 8 AND 20);
+$r10_20 = (SELECT optkey FROM Input WHERE optkey BETWEEN 10 AND 20);
+
+$r1_16 = (SELECT optkey FROM Input WHERE optkey BETWEEN 1 AND 16);
+$r1_12 = (SELECT key FROM Input WHERE optkey BETWEEN 1 AND 12);
+
+SELECT key FROM Input WHERE
+ (key + 1) IN $r4_20 AND -- key = [3, 19] -- 2 joinable
+ optkey IN $r6_20 AND -- key = [6, 19]
+
+ key IN /*+ COMPACT() */ $r8_20 AND -- key = [8, 19] -- 1 nonjoinable (due to COMPACT)
+
+ (optkey + 3) IN $r10_20 AND -- key = [8, 17] -- 3 joinable
+ (key + 4) NOT IN $r1_12 AND -- key = [9, 17]
+ key IN $r10_20 AND -- key = [10, 17]
+
+ (optkey IN $r1_16 OR key IN $r1_16) AND -- key = [10, 16] -- 1 nonjoinable (not SqlIn)
+
+ (key - 1) IN $r1_12 AND -- key = [10, 13] -- 2 joinable
+ (key - 3) NOT IN $r8_20 -- key = [10]
+
diff --git a/yt/yql/tests/sql/suites/in/in_tuple_table.sql b/yt/yql/tests/sql/suites/in/in_tuple_table.sql
new file mode 100644
index 0000000000..a36004f819
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_tuple_table.sql
@@ -0,0 +1,4 @@
+USE Plato;
+SELECT 'c' IN t
+FROM InputWithTuples;
+
diff --git a/yt/yql/tests/sql/suites/in/in_types_cast.sql b/yt/yql/tests/sql/suites/in/in_types_cast.sql
new file mode 100644
index 0000000000..8b3e5c71de
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_types_cast.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select * from plato.Input where cast(key as uint32) not in (150,150ul)
diff --git a/yt/yql/tests/sql/suites/in/in_types_cast_all.sql b/yt/yql/tests/sql/suites/in/in_types_cast_all.sql
new file mode 100644
index 0000000000..709882ae86
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_types_cast_all.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+select * from plato.Input where cast(key as Uint8) in
+(
+ 1u,
+ 3l,
+ 23ul,
+ 255, -- out of Uint8
+ 0,
+)
diff --git a/yt/yql/tests/sql/suites/in/in_with_list_dict.sql b/yt/yql/tests/sql/suites/in/in_with_list_dict.sql
new file mode 100644
index 0000000000..44993dd1d8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_with_list_dict.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+
+$l = AsList(1, 2, 3, 800);
+$d = AsDict(AsTuple(1, 0), AsTuple(2, 0), AsTuple(3, 0), AsTuple(800, 0));
+
+SELECT key, CAST(key AS int32) IN $l, CAST(key AS int32) IN $d FROM plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/in/in_with_opt_tuple.sql b/yt/yql/tests/sql/suites/in/in_with_opt_tuple.sql
new file mode 100644
index 0000000000..98735c8ead
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_with_opt_tuple.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+SELECT *
+FROM plato.Input
+WHERE AsTuple(cast(key as int32), cast(subkey as int32)) in (
+ AsTuple(42, 5),
+ AsTuple(75, 1),
+ AsTuple(20, 3),
+);
diff --git a/yt/yql/tests/sql/suites/in/in_with_table_of_tuples.sql b/yt/yql/tests/sql/suites/in/in_with_table_of_tuples.sql
new file mode 100644
index 0000000000..1e07ae5548
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_with_table_of_tuples.sql
@@ -0,0 +1,16 @@
+/* postgres can not */
+use plato;
+
+$t1 = AsList(
+ AsStruct(75 as key, 1 as subkey),
+ AsStruct(800 as key, 2 as subkey));
+
+insert into @t1
+select * from AS_TABLE($t1);
+
+commit;
+
+$tuples = (select AsTuple(key, subkey) from @t1);
+
+select * from Input
+where AsTuple(cast(key as uint64), cast(subkey as uint64)) in $tuples
diff --git a/yt/yql/tests/sql/suites/in/in_with_tuple.sql b/yt/yql/tests/sql/suites/in/in_with_tuple.sql
new file mode 100644
index 0000000000..bb280827f9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/in_with_tuple.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+SELECT *
+FROM plato.Input
+WHERE AsTuple(cast(key as int32) ?? 0, cast(subkey as int32) ?? 0) in (
+ AsTuple(800, 1),
+ AsTuple(800, 2),
+ AsTuple(800, 3),
+ AsTuple(800, 4),
+);
diff --git a/yt/yql/tests/sql/suites/in/input_optkey.txt.attr b/yt/yql/tests/sql/suites/in/input_optkey.txt.attr
new file mode 100644
index 0000000000..1ca6ee6155
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/input_optkey.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Int32"]];
+ ["optkey";["OptionalType";["DataType";"Int32"]]];
+ ["value";["DataType";"String"]]]
+ ];
+}}
diff --git a/yt/yql/tests/sql/suites/in/input_optkey1.txt.attr b/yt/yql/tests/sql/suites/in/input_optkey1.txt.attr
new file mode 100644
index 0000000000..1ca6ee6155
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/input_optkey1.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Int32"]];
+ ["optkey";["OptionalType";["DataType";"Int32"]]];
+ ["value";["DataType";"String"]]]
+ ];
+}}
diff --git a/yt/yql/tests/sql/suites/in/input_with_tuples.txt.attr b/yt/yql/tests/sql/suites/in/input_with_tuples.txt.attr
new file mode 100644
index 0000000000..429fb94586
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/input_with_tuples.txt.attr
@@ -0,0 +1,9 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["t"; ["TupleType"; [
+ ["DataType"; "String"];
+ ["DataType"; "String"];
+ ["DataType"; "String"]
+ ]]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/in/optdict.txt.attr b/yt/yql/tests/sql/suites/in/optdict.txt.attr
new file mode 100644
index 0000000000..c57013cea5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/optdict.txt.attr
@@ -0,0 +1,5 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["OptionalType";["DataType";"Int32"]]]]
+ ];
+}}
diff --git a/yt/yql/tests/sql/suites/in/sorted.txt.attr b/yt/yql/tests/sql/suites/in/sorted.txt.attr
new file mode 100644
index 0000000000..ed13e20223
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/sorted.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/in/yql-10038.sql b/yt/yql/tests/sql/suites/in/yql-10038.sql
new file mode 100644
index 0000000000..f5f75a1990
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/yql-10038.sql
@@ -0,0 +1,18 @@
+/* postgres can not */
+use plato;
+
+insert into @input
+select "foo" as reqid, "touch" as ui, AsList(1,2,236273) as test_ids;
+commit;
+
+$dict = (select "foo" as reqid);
+
+select
+ *
+from
+ @input
+where
+ ui='touch' and
+ reqid in (select reqid from $dict)
+ and 236273 in test_ids
+
diff --git a/yt/yql/tests/sql/suites/in/yql-14677.sql b/yt/yql/tests/sql/suites/in/yql-14677.sql
new file mode 100644
index 0000000000..abbe56ce7b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/in/yql-14677.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+USE plato;
+pragma yt.MapJoinLimit="1m";
+
+$l1 = select key from `Input`;
+
+select * from Input
+where true
+ and value != ""
+ and key in $l1
diff --git a/yt/yql/tests/sql/suites/insert/after_group_by.sql b/yt/yql/tests/sql/suites/insert/after_group_by.sql
new file mode 100644
index 0000000000..c2abecae36
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/after_group_by.sql
@@ -0,0 +1,2 @@
+-- kikimr only: pragma kikimr.UnwrapReadTableValues = "false"; create table plato.Output (key varchar null, subkey varchar null, value varchar null, primary key (key)); commit;
+insert into plato.Output (key, subkey, value) select key, subkey, max(value) from plato.Input group by key, subkey order by key;
diff --git a/yt/yql/tests/sql/suites/insert/anonymous_tables.sql b/yt/yql/tests/sql/suites/insert/anonymous_tables.sql
new file mode 100644
index 0000000000..93e6b3b041
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/anonymous_tables.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+use plato;
+pragma yt.MapJoinLimit="1M";
+
+insert into @a
+select * from Input;
+
+commit;
+
+select count(*) from @a;
+select * from @a limit 2;
+select count(*) from @a as a cross join @a as b;
+
+commit;
diff --git a/yt/yql/tests/sql/suites/insert/append-with_view.cfg b/yt/yql/tests/sql/suites/insert/append-with_view.cfg
new file mode 100644
index 0000000000..4feca3f4ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/append-with_view.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+out Output input_with_view.txt
+udf python2_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/insert/append.cfg b/yt/yql/tests/sql/suites/insert/append.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/append.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert/append.sql b/yt/yql/tests/sql/suites/insert/append.sql
new file mode 100644
index 0000000000..e4ce8e6422
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/append.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+/* multirun can not */
+insert into plato.Output
+select * from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/insert/append_after_replace.sql b/yt/yql/tests/sql/suites/insert/append_after_replace.sql
new file mode 100644
index 0000000000..96894b317c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/append_after_replace.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* multirun can not */
+-- kikimr only: pragma kikimr.UnwrapReadTableValues = "false"; create table plato.Output (key varchar null, subkey varchar null, value varchar null, primary key (key)); commit;
+insert into plato.Output with truncate (key, subkey, value) select key, subkey, value from plato.Input;
+commit;
+insert into plato.Output (key, subkey, value) select key, subkey, value from plato.Output;
diff --git a/yt/yql/tests/sql/suites/insert/append_missing_null.sql b/yt/yql/tests/sql/suites/insert/append_missing_null.sql
new file mode 100644
index 0000000000..e92b426132
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/append_missing_null.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+use plato;
+
+insert into @foo
+select null as x, 1 as y;
+
+commit;
+
+insert into @foo
+select 2 as y;
+
+commit;
+
+select * from @foo;
diff --git a/yt/yql/tests/sql/suites/insert/append_proto_fail.cfg b/yt/yql/tests/sql/suites/insert/append_proto_fail.cfg
new file mode 100644
index 0000000000..6d87958c65
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/append_proto_fail.cfg
@@ -0,0 +1,4 @@
+xfail
+in Input input.txt
+out Output input_proto.txt
+udf protobuf_udf
diff --git a/yt/yql/tests/sql/suites/insert/append_proto_fail.sql b/yt/yql/tests/sql/suites/insert/append_proto_fail.sql
new file mode 100644
index 0000000000..437e165a80
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/append_proto_fail.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* multirun can not */
+/* custom error:Table "Output" has udf remappers, append is not allowed*/
+insert into plato.Output
+select * from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/insert/append_sorted-to_sorted.cfg b/yt/yql/tests/sql/suites/insert/append_sorted-to_sorted.cfg
new file mode 100644
index 0000000000..1f640b66af
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/append_sorted-to_sorted.cfg
@@ -0,0 +1,9 @@
+in Input input.txt
+out Output1 sorted.txt
+out Output2 sorted.txt
+out Output3 sorted.txt
+out Output4 sorted.txt
+out Output5 sorted.txt
+out Output6 sorted.txt
+out Output7 sorted.txt
+out Output8 sorted.txt
diff --git a/yt/yql/tests/sql/suites/insert/append_sorted-to_sorted_calc.cfg b/yt/yql/tests/sql/suites/insert/append_sorted-to_sorted_calc.cfg
new file mode 100644
index 0000000000..a47ebbb46d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/append_sorted-to_sorted_calc.cfg
@@ -0,0 +1,9 @@
+in Input input.txt
+out Output1 sorted_calc.txt
+out Output2 sorted_calc.txt
+out Output3 sorted_calc.txt
+out Output4 sorted_calc.txt
+out Output5 sorted_calc.txt
+out Output6 sorted_calc.txt
+out Output7 sorted_calc.txt
+out Output8 sorted_calc.txt
diff --git a/yt/yql/tests/sql/suites/insert/append_sorted-to_sorted_desc.cfg b/yt/yql/tests/sql/suites/insert/append_sorted-to_sorted_desc.cfg
new file mode 100644
index 0000000000..e337a07d80
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/append_sorted-to_sorted_desc.cfg
@@ -0,0 +1,9 @@
+in Input input.txt
+out Output1 sorted_desc.txt
+out Output2 sorted_desc.txt
+out Output3 sorted_desc.txt
+out Output4 sorted_desc.txt
+out Output5 sorted_desc.txt
+out Output6 sorted_desc.txt
+out Output7 sorted_desc.txt
+out Output8 sorted_desc.txt
diff --git a/yt/yql/tests/sql/suites/insert/append_sorted.cfg b/yt/yql/tests/sql/suites/insert/append_sorted.cfg
new file mode 100644
index 0000000000..8014b80c06
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/append_sorted.cfg
@@ -0,0 +1,9 @@
+in Input input.txt
+out Output1 input.txt
+out Output2 input.txt
+out Output3 input.txt
+out Output4 input.txt
+out Output5 input.txt
+out Output6 input.txt
+out Output7 input.txt
+out Output8 input.txt
diff --git a/yt/yql/tests/sql/suites/insert/append_sorted.sql b/yt/yql/tests/sql/suites/insert/append_sorted.sql
new file mode 100644
index 0000000000..cefc494453
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/append_sorted.sql
@@ -0,0 +1,25 @@
+/* multirun can not */
+
+insert into plato.Output1
+select * from plato.Input order by key;
+
+insert into plato.Output2
+select * from plato.Input order by key, subkey;
+
+insert into plato.Output3
+select * from plato.Input order by key, subkey, value;
+
+insert into plato.Output4
+select * from plato.Input;
+
+insert into plato.Output5
+select * from plato.Input order by subkey;
+
+insert into plato.Output6
+select * from plato.Input order by key desc;
+
+insert into plato.Output7
+select * from plato.Input order by key desc, subkey;
+
+insert into plato.Output8
+select * from plato.Input order by key || subkey;
diff --git a/yt/yql/tests/sql/suites/insert/append_view_fail.cfg b/yt/yql/tests/sql/suites/insert/append_view_fail.cfg
new file mode 100644
index 0000000000..db398a8d2f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/append_view_fail.cfg
@@ -0,0 +1,5 @@
+xfail
+in Input input.txt
+in Input1 input.txt
+in Input2 input2.txt
+out Output input_view.txt
diff --git a/yt/yql/tests/sql/suites/insert/append_view_fail.sql b/yt/yql/tests/sql/suites/insert/append_view_fail.sql
new file mode 100644
index 0000000000..3a9f61a60c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/append_view_fail.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* multirun can not */
+/* custom error:Modification of "Output" view is not supported*/
+insert into plato.Output
+select * from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/insert/append_with_read_udf_fail.cfg b/yt/yql/tests/sql/suites/insert/append_with_read_udf_fail.cfg
new file mode 100644
index 0000000000..1d043c6420
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/append_with_read_udf_fail.cfg
@@ -0,0 +1,4 @@
+xfail
+in Input input.txt
+out Output input_with_read_udf.txt
+udf dsv_udf
diff --git a/yt/yql/tests/sql/suites/insert/append_with_read_udf_fail.sql b/yt/yql/tests/sql/suites/insert/append_with_read_udf_fail.sql
new file mode 100644
index 0000000000..437e165a80
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/append_with_read_udf_fail.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* multirun can not */
+/* custom error:Table "Output" has udf remappers, append is not allowed*/
+insert into plato.Output
+select * from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/insert/default.cfg b/yt/yql/tests/sql/suites/insert/default.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/default.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert/double_append_to_anonymous.cfg b/yt/yql/tests/sql/suites/insert/double_append_to_anonymous.cfg
new file mode 100644
index 0000000000..00dec6c3f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/double_append_to_anonymous.cfg
@@ -0,0 +1 @@
+res result.txt
diff --git a/yt/yql/tests/sql/suites/insert/double_append_to_anonymous.sql b/yt/yql/tests/sql/suites/insert/double_append_to_anonymous.sql
new file mode 100644
index 0000000000..af6aba3132
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/double_append_to_anonymous.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+use plato;
+
+INSERT INTO @tmp
+SELECT 1 as id, "qwer" as val;
+COMMIT;
+
+INSERT INTO @tmp
+SELECT 2 as id, "asdf" as val;
+
+COMMIT;
+
+SELECT *
+FROM @tmp; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/insert/drop_sortness-calc.cfg b/yt/yql/tests/sql/suites/insert/drop_sortness-calc.cfg
new file mode 100644
index 0000000000..da3506e2e7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/drop_sortness-calc.cfg
@@ -0,0 +1,2 @@
+in Input sorted_calc.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert/drop_sortness-desc.cfg b/yt/yql/tests/sql/suites/insert/drop_sortness-desc.cfg
new file mode 100644
index 0000000000..803556470a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/drop_sortness-desc.cfg
@@ -0,0 +1,2 @@
+in Input sorted_desc.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert/drop_sortness.cfg b/yt/yql/tests/sql/suites/insert/drop_sortness.cfg
new file mode 100644
index 0000000000..66737248b8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/drop_sortness.cfg
@@ -0,0 +1,2 @@
+in Input sorted.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert/drop_sortness.sql b/yt/yql/tests/sql/suites/insert/drop_sortness.sql
new file mode 100644
index 0000000000..ccd7972ca6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/drop_sortness.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+insert into plato.Output with truncate
+SELECT
+ value
+FROM plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/insert/erasure.txt.attr b/yt/yql/tests/sql/suites/insert/erasure.txt.attr
new file mode 100644
index 0000000000..0214647b1c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/erasure.txt.attr
@@ -0,0 +1,10 @@
+{
+ "_yql_row_spec" = {
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]];
+ ]]
+ };
+ "erasure_codec" = "lrc_12_2_2"
+}
diff --git a/yt/yql/tests/sql/suites/insert/fail_read_view_after_modify.cfg b/yt/yql/tests/sql/suites/insert/fail_read_view_after_modify.cfg
new file mode 100644
index 0000000000..a26fadcaa7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/fail_read_view_after_modify.cfg
@@ -0,0 +1,3 @@
+xfail
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert/fail_read_view_after_modify.sql b/yt/yql/tests/sql/suites/insert/fail_read_view_after_modify.sql
new file mode 100644
index 0000000000..a58b0d5d89
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/fail_read_view_after_modify.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* syntax version 1 */
+/* custom error:Table "Output" cannot have any view after replacing its content*/
+insert into plato.Output with truncate
+select * from plato.Input;
+
+commit;
+
+select * from plato.Output view raw;
diff --git a/yt/yql/tests/sql/suites/insert/from_erasure_to_none.cfg b/yt/yql/tests/sql/suites/insert/from_erasure_to_none.cfg
new file mode 100644
index 0000000000..b761812b2d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/from_erasure_to_none.cfg
@@ -0,0 +1,2 @@
+in Input erasure.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert/from_erasure_to_none.sql b/yt/yql/tests/sql/suites/insert/from_erasure_to_none.sql
new file mode 100644
index 0000000000..240cac66fb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/from_erasure_to_none.sql
@@ -0,0 +1,8 @@
+USE plato;
+
+PRAGMA yt.PublishedErasureCodec = 'none';
+
+INSERT INTO Output
+SELECT *
+FROM Input
+LIMIT 100;
diff --git a/yt/yql/tests/sql/suites/insert/from_two_sorted_by_calc.sql b/yt/yql/tests/sql/suites/insert/from_two_sorted_by_calc.sql
new file mode 100644
index 0000000000..d2c42ab47e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/from_two_sorted_by_calc.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+use plato;
+
+insert into @f1 select * from Input order by key || "1";
+insert into @f2 select * from Input order by key || "2";
+
+commit;
+
+insert into Output
+select * from
+(
+ select * from @f1
+ union all
+ select * from @f2
+);
diff --git a/yt/yql/tests/sql/suites/insert/inferschema.txt.attr b/yt/yql/tests/sql/suites/insert/inferschema.txt.attr
new file mode 100644
index 0000000000..ada1f836f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/inferschema.txt.attr
@@ -0,0 +1,3 @@
+{
+ "infer_schema"=%true
+}
diff --git a/yt/yql/tests/sql/suites/insert/input.txt.attr b/yt/yql/tests/sql/suites/insert/input.txt.attr
new file mode 100644
index 0000000000..36b3c00c90
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/input.txt.attr
@@ -0,0 +1,5 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[["key";["DataType";"String";];];["subkey";["DataType";"String";];];["value";["DataType";"String";];];];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/insert/input_proto.txt.attr b/yt/yql/tests/sql/suites/insert/input_proto.txt.attr
new file mode 100644
index 0000000000..c924675835
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/input_proto.txt.attr
@@ -0,0 +1,32 @@
+{
+ "_yql_proto_field_value"="#TA+H4sIAAAAAAAAA42Puw6CQBBFszw0DEp0Y4E2GmyolriJHyAPS6rVflFMTBCUR8Hn+KcuD0ui3WRy59wzcIJ1co9yntfOM8/KLKpuTv1KnKp0rqTdWBQk5uM5SEFhKhvZNqhKmE8CPAHF5yU30QbZmqUDCvAIpONuhmA/jL30WCywXsMI+SPuGJAOn0XdGVZDFhfl6qf1VuBdPAX1zJOq46vYAOSbkhh1Kosf4I2GC/mfhb3YcOD78EoYHfACkNva6FQjLZow11rCmJ3SqoivjaPXB4Sj9wEBmoL3ogEAAA==";
+ "_yql_proto_field_subkey"="#TA+H4sIAAAAAAAAA42Puw6CQBBFszw0DEp0Y4E2GmyolriJHyAPS6rVflFMTBCUR8Hn+KcuD0ui3WRy59wzcIJ1co9yntfOM8/KLKpuTv1KnKp0rqTdWBQk5uM5SEFhKhvZNqhKmE8CPAHF5yU30QbZmqUDCvAIpONuhmA/jL30WCywXsMI+SPuGJAOn0XdGVZDFhfl6qf1VuBdPAX1zJOq46vYAOSbkhh1Kosf4I2GC/mfhb3YcOD78EoYHfACkNva6FQjLZow11rCmJ3SqoivjaPXB4Sj9wEBmoL3ogEAAA==";
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/insert/input_view.txt.attr b/yt/yql/tests/sql/suites/insert/input_view.txt.attr
new file mode 100644
index 0000000000..41ea51e276
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/input_view.txt.attr
@@ -0,0 +1,4 @@
+{
+ "_yql_type"="view";
+ "type"="document";
+}
diff --git a/yt/yql/tests/sql/suites/insert/input_with_read_udf.txt.attr b/yt/yql/tests/sql/suites/insert/input_with_read_udf.txt.attr
new file mode 100644
index 0000000000..14544c6d7b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/input_with_read_udf.txt.attr
@@ -0,0 +1,32 @@
+{
+ "_yql_read_udf"="Dsv.ReadRecord";
+ "_yql_read_udf_run_config"="@@";
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/insert/input_with_view.txt.attr b/yt/yql/tests/sql/suites/insert/input_with_view.txt.attr
new file mode 100644
index 0000000000..501fdca6db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/input_with_view.txt.attr
@@ -0,0 +1,31 @@
+{
+ "_yql_view_my"="$udfScript=\"def f(row):\n\treturn {'myvalue':b'm' + row.value}\n\";$udf=Python::f(Callable<(Struct<key:String,subkey:String,value:String>)->Struct<myvalue:String>>, $udfScript);PROCESS self USING $udf(TableRow());";
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/insert/insert_from_other.cfg b/yt/yql/tests/sql/suites/insert/insert_from_other.cfg
new file mode 100644
index 0000000000..7cc1222553
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/insert_from_other.cfg
@@ -0,0 +1,2 @@
+in Input other.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert/insert_from_other.sql b/yt/yql/tests/sql/suites/insert/insert_from_other.sql
new file mode 100644
index 0000000000..9c295718ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/insert_from_other.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+insert into plato.Output with truncate
+select * from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/insert/insert_null.sql b/yt/yql/tests/sql/suites/insert/insert_null.sql
new file mode 100644
index 0000000000..3aafd6c5a8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/insert_null.sql
@@ -0,0 +1,4 @@
+use plato;
+
+insert into Output
+select NULL as x;
diff --git a/yt/yql/tests/sql/suites/insert/insert_relabeled.sql b/yt/yql/tests/sql/suites/insert/insert_relabeled.sql
new file mode 100644
index 0000000000..cbe93546dd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/insert_relabeled.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+-- kikimr only: pragma kikimr.UnwrapReadTableValues = "false"; create table plato.Output (key varchar null, subkey varchar null, value varchar null, primary key (key)); commit;
+insert into plato.Output (key, subkey, new_value, one_more_value) select key, subkey, value as new_value, "x" from plato.Input;
diff --git a/yt/yql/tests/sql/suites/insert/keepmeta-with_view.cfg b/yt/yql/tests/sql/suites/insert/keepmeta-with_view.cfg
new file mode 100644
index 0000000000..4feca3f4ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/keepmeta-with_view.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+out Output input_with_view.txt
+udf python2_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/insert/keepmeta.cfg b/yt/yql/tests/sql/suites/insert/keepmeta.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/keepmeta.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert/keepmeta.sql b/yt/yql/tests/sql/suites/insert/keepmeta.sql
new file mode 100644
index 0000000000..360c609748
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/keepmeta.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+/* multirun can not */
+insert into plato.Output with (truncate, keepmeta)
+select * from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/insert/keepmeta_nonstrict_fail.cfg b/yt/yql/tests/sql/suites/insert/keepmeta_nonstrict_fail.cfg
new file mode 100644
index 0000000000..1f376d1f93
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/keepmeta_nonstrict_fail.cfg
@@ -0,0 +1,3 @@
+xfail
+in Input input.txt
+out Output other.txt
diff --git a/yt/yql/tests/sql/suites/insert/keepmeta_nonstrict_fail.sql b/yt/yql/tests/sql/suites/insert/keepmeta_nonstrict_fail.sql
new file mode 100644
index 0000000000..4ca22363d6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/keepmeta_nonstrict_fail.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* multirun can not */
+/* custom error:Table "Output" has non-strict schema, truncate with keep meta is not allowed*/
+insert into plato.Output with (truncate, keepmeta)
+select * from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/insert/keepmeta_proto_fail.cfg b/yt/yql/tests/sql/suites/insert/keepmeta_proto_fail.cfg
new file mode 100644
index 0000000000..6d87958c65
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/keepmeta_proto_fail.cfg
@@ -0,0 +1,4 @@
+xfail
+in Input input.txt
+out Output input_proto.txt
+udf protobuf_udf
diff --git a/yt/yql/tests/sql/suites/insert/keepmeta_proto_fail.sql b/yt/yql/tests/sql/suites/insert/keepmeta_proto_fail.sql
new file mode 100644
index 0000000000..57967fed0f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/keepmeta_proto_fail.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* multirun can not */
+/* custom error:Table "Output" has udf remappers, truncate with keep meta is not allowed*/
+insert into plato.Output with (truncate, keepmeta)
+select * from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/insert/keepmeta_view_fail.cfg b/yt/yql/tests/sql/suites/insert/keepmeta_view_fail.cfg
new file mode 100644
index 0000000000..db398a8d2f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/keepmeta_view_fail.cfg
@@ -0,0 +1,5 @@
+xfail
+in Input input.txt
+in Input1 input.txt
+in Input2 input2.txt
+out Output input_view.txt
diff --git a/yt/yql/tests/sql/suites/insert/keepmeta_view_fail.sql b/yt/yql/tests/sql/suites/insert/keepmeta_view_fail.sql
new file mode 100644
index 0000000000..e4cea9e1cd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/keepmeta_view_fail.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* multirun can not */
+/* custom error:Modification of "Output" view is not supported*/
+insert into plato.Output with (truncate, keepmeta)
+select * from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/insert/keepmeta_with_read_udf_fail.cfg b/yt/yql/tests/sql/suites/insert/keepmeta_with_read_udf_fail.cfg
new file mode 100644
index 0000000000..1d043c6420
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/keepmeta_with_read_udf_fail.cfg
@@ -0,0 +1,4 @@
+xfail
+in Input input.txt
+out Output input_with_read_udf.txt
+udf dsv_udf
diff --git a/yt/yql/tests/sql/suites/insert/keepmeta_with_read_udf_fail.sql b/yt/yql/tests/sql/suites/insert/keepmeta_with_read_udf_fail.sql
new file mode 100644
index 0000000000..57967fed0f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/keepmeta_with_read_udf_fail.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* multirun can not */
+/* custom error:Table "Output" has udf remappers, truncate with keep meta is not allowed*/
+insert into plato.Output with (truncate, keepmeta)
+select * from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/insert/literals_to_string.sql b/yt/yql/tests/sql/suites/insert/literals_to_string.sql
new file mode 100644
index 0000000000..d3cb1ae817
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/literals_to_string.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+-- kikimr only: pragma kikimr.UnwrapReadTableValues = "false"; create table plato.Output (key varchar null, subkey varchar null, value varchar null, primary key (key)); commit;
+insert into plato.Output (key, subkey, value) values (YQL::ToString(1), YQL::ToString(2), "3");
diff --git a/yt/yql/tests/sql/suites/insert/merge_publish.cfg b/yt/yql/tests/sql/suites/insert/merge_publish.cfg
new file mode 100644
index 0000000000..1abba632a5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/merge_publish.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output1 output1.txt
+out Output2 input.txt
diff --git a/yt/yql/tests/sql/suites/insert/merge_publish.sql b/yt/yql/tests/sql/suites/insert/merge_publish.sql
new file mode 100644
index 0000000000..741b5dc366
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/merge_publish.sql
@@ -0,0 +1,20 @@
+/* postgres can not */
+/* kikimr can not */
+/* ignore plan diff */
+use plato;
+
+pragma yt.ScriptCpu="1.0";
+
+insert into Output1 select "1" as key, subkey, value from Input;
+
+insert into Output2 select "2" as key, subkey, value from Input;
+
+insert into Output2 select "3" as key, subkey, value from Input;
+
+insert into Output1 select "4" as key, subkey, value from Input;
+
+pragma yt.ScriptCpu="2.0";
+
+insert into Output1 select "5" as key, subkey, value from Input;
+
+insert into Output1 select "6" as key, subkey, value from Input;
diff --git a/yt/yql/tests/sql/suites/insert/multiappend_sorted.sql b/yt/yql/tests/sql/suites/insert/multiappend_sorted.sql
new file mode 100644
index 0000000000..bd33297afb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/multiappend_sorted.sql
@@ -0,0 +1,63 @@
+/* postgres can not */
+/* multirun can not */
+
+insert into plato.Output with truncate
+select * from plato.Input order by key;
+
+insert into plato.Output
+select * from plato.Input;
+
+commit;
+----------------------------------------
+
+insert into plato.Output with truncate
+select * from plato.Input;
+
+insert into plato.Output
+select * from plato.Input order by key;
+
+commit;
+----------------------------------------
+
+insert into plato.Output with truncate
+select * from plato.Input order by key, subkey;
+
+insert into plato.Output
+select * from plato.Input order by key, subkey;
+
+commit;
+----------------------------------------
+
+insert into plato.Output with truncate
+select * from plato.Input order by key;
+
+insert into plato.Output
+select * from plato.Input order by key desc;
+
+commit;
+----------------------------------------
+
+insert into plato.Output with truncate
+select * from plato.Input order by key;
+
+insert into plato.Output
+select * from plato.Input order by key || subkey;
+
+commit;
+----------------------------------------
+
+insert into plato.Output with truncate
+select * from plato.Input order by key desc;
+
+insert into plato.Output
+select * from plato.Input order by key desc;
+
+commit;
+----------------------------------------
+
+insert into plato.Output with truncate
+select * from plato.Input order by key || subkey;
+
+insert into plato.Output
+select * from plato.Input order by key || subkey;
+
diff --git a/yt/yql/tests/sql/suites/insert/other.txt.attr b/yt/yql/tests/sql/suites/insert/other.txt.attr
new file mode 100644
index 0000000000..e6092cd69d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/other.txt.attr
@@ -0,0 +1,13 @@
+{
+ "_read_schema" = <"strict" = %false>[
+ {"type"="string";"name"="key"}
+ ];
+ "schema" = <"strict" = %false; "unique_keys" = %false>
+ [
+ {
+ "name" = "key";
+ "sort_order" = "ascending";
+ "type" = "string"
+ }
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/insert/override-from_sorted.cfg b/yt/yql/tests/sql/suites/insert/override-from_sorted.cfg
new file mode 100644
index 0000000000..66737248b8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/override-from_sorted.cfg
@@ -0,0 +1,2 @@
+in Input sorted.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert/override-from_sorted_calc.cfg b/yt/yql/tests/sql/suites/insert/override-from_sorted_calc.cfg
new file mode 100644
index 0000000000..da3506e2e7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/override-from_sorted_calc.cfg
@@ -0,0 +1,2 @@
+in Input sorted_calc.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert/override-from_sorted_desc.cfg b/yt/yql/tests/sql/suites/insert/override-from_sorted_desc.cfg
new file mode 100644
index 0000000000..803556470a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/override-from_sorted_desc.cfg
@@ -0,0 +1,2 @@
+in Input sorted_desc.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert/override-proto.cfg b/yt/yql/tests/sql/suites/insert/override-proto.cfg
new file mode 100644
index 0000000000..499362d95f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/override-proto.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output input_proto.txt
+udf protobuf_udf
diff --git a/yt/yql/tests/sql/suites/insert/override-with_read_udf.cfg b/yt/yql/tests/sql/suites/insert/override-with_read_udf.cfg
new file mode 100644
index 0000000000..8edc95b521
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/override-with_read_udf.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output input_with_read_udf.txt
+udf dsv_udf
diff --git a/yt/yql/tests/sql/suites/insert/override-with_view.cfg b/yt/yql/tests/sql/suites/insert/override-with_view.cfg
new file mode 100644
index 0000000000..4feca3f4ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/override-with_view.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+out Output input_with_view.txt
+udf python2_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/insert/override.cfg b/yt/yql/tests/sql/suites/insert/override.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/override.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert/override.sql b/yt/yql/tests/sql/suites/insert/override.sql
new file mode 100644
index 0000000000..9c295718ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/override.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+insert into plato.Output with truncate
+select * from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/insert/override_view_fail.cfg b/yt/yql/tests/sql/suites/insert/override_view_fail.cfg
new file mode 100644
index 0000000000..db398a8d2f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/override_view_fail.cfg
@@ -0,0 +1,5 @@
+xfail
+in Input input.txt
+in Input1 input.txt
+in Input2 input2.txt
+out Output input_view.txt
diff --git a/yt/yql/tests/sql/suites/insert/override_view_fail.sql b/yt/yql/tests/sql/suites/insert/override_view_fail.sql
new file mode 100644
index 0000000000..9a2e8ed269
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/override_view_fail.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+/* custom error:Modification of "Output" view is not supported*/
+insert into plato.Output with truncate
+select * from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/insert/part_sortness-desc.cfg b/yt/yql/tests/sql/suites/insert/part_sortness-desc.cfg
new file mode 100644
index 0000000000..803556470a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/part_sortness-desc.cfg
@@ -0,0 +1,2 @@
+in Input sorted_desc.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert/part_sortness.cfg b/yt/yql/tests/sql/suites/insert/part_sortness.cfg
new file mode 100644
index 0000000000..66737248b8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/part_sortness.cfg
@@ -0,0 +1,2 @@
+in Input sorted.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert/part_sortness.sql b/yt/yql/tests/sql/suites/insert/part_sortness.sql
new file mode 100644
index 0000000000..291ae5ae7e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/part_sortness.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+insert into plato.Output with truncate
+SELECT
+ key,value
+FROM plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/insert/read_schema.txt.attr b/yt/yql/tests/sql/suites/insert/read_schema.txt.attr
new file mode 100644
index 0000000000..3176be619e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/read_schema.txt.attr
@@ -0,0 +1,3 @@
+{
+ "_read_schema"=[{"type"="int64";"name"="a"};{"type"="uint64";"name"="b"};{"type"="double";"name"="c"};{"type"="string";"name"="d"};{"type"="boolean";name="e"};{"type"="any";"name"="f"}]
+}
diff --git a/yt/yql/tests/sql/suites/insert/replace_inferred.cfg b/yt/yql/tests/sql/suites/insert/replace_inferred.cfg
new file mode 100644
index 0000000000..b5b1813964
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/replace_inferred.cfg
@@ -0,0 +1 @@
+out Output inferschema.txt
diff --git a/yt/yql/tests/sql/suites/insert/replace_inferred.sql b/yt/yql/tests/sql/suites/insert/replace_inferred.sql
new file mode 100644
index 0000000000..ec481c4771
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/replace_inferred.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* kikimr can not */
+use plato;
+
+pragma yt.InferSchema;
+pragma yt.InferSchemaTableCountThreshold="100000";
+
+insert into Output with truncate
+select * from Output;
diff --git a/yt/yql/tests/sql/suites/insert/replace_inferred_op.cfg b/yt/yql/tests/sql/suites/insert/replace_inferred_op.cfg
new file mode 100644
index 0000000000..b5b1813964
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/replace_inferred_op.cfg
@@ -0,0 +1 @@
+out Output inferschema.txt
diff --git a/yt/yql/tests/sql/suites/insert/replace_inferred_op.sql b/yt/yql/tests/sql/suites/insert/replace_inferred_op.sql
new file mode 100644
index 0000000000..40e1d5e3cd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/replace_inferred_op.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* kikimr can not */
+use plato;
+
+pragma yt.InferSchema;
+pragma yt.InferSchemaTableCountThreshold="0";
+
+insert into Output with truncate
+select * from Output;
diff --git a/yt/yql/tests/sql/suites/insert/replace_ordered_by_key.sql b/yt/yql/tests/sql/suites/insert/replace_ordered_by_key.sql
new file mode 100644
index 0000000000..02057e2951
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/replace_ordered_by_key.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+-- kikimr only: pragma kikimr.UnwrapReadTableValues = "false"; create table plato.Output (key varchar null, subkey varchar null, value varchar null, primary key (key)); commit;
+insert into plato.Output with truncate (key, subkey, value) select key, subkey, value from plato.Input order by key;
diff --git a/yt/yql/tests/sql/suites/insert/replace_ordered_by_key_desc.sql b/yt/yql/tests/sql/suites/insert/replace_ordered_by_key_desc.sql
new file mode 100644
index 0000000000..46f2024768
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/replace_ordered_by_key_desc.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+-- kikimr only: pragma kikimr.UnwrapReadTableValues = "false"; create table plato.Output (key varchar null, subkey varchar null, value varchar null, primary key (key)); commit;
+insert into plato.Output with truncate (key, subkey, value) select key, subkey, value from plato.Input order by key desc;
diff --git a/yt/yql/tests/sql/suites/insert/select_after_insert_relabeled.sql b/yt/yql/tests/sql/suites/insert/select_after_insert_relabeled.sql
new file mode 100644
index 0000000000..774cea8db9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/select_after_insert_relabeled.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* multirun can not */
+-- kikimr only: pragma kikimr.UnwrapReadTableValues = "false"; create table plato.Output (key varchar null, subkey varchar null, value varchar null, primary key (key)); commit;
+insert into plato.Output (key, subkey, new_value, one_more_value) select key, subkey, value as new_value, "x" from plato.Input;
+commit;
+select key, subkey, new_value, one_more_value from plato.Output;
diff --git a/yt/yql/tests/sql/suites/insert/select_after_replace.sql b/yt/yql/tests/sql/suites/insert/select_after_replace.sql
new file mode 100644
index 0000000000..6c176e12be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/select_after_replace.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* multirun can not */
+-- kikimr only: pragma kikimr.UnwrapReadTableValues = "false"; create table plato.Output (key varchar null, subkey varchar null, value varchar null, primary key (key)); commit;
+insert into plato.Output with truncate (key, subkey, value) select key, subkey, value from plato.Input;
+commit;
+select key, subkey, value from plato.Output;
diff --git a/yt/yql/tests/sql/suites/insert/select_after_replace_unwrap.sql b/yt/yql/tests/sql/suites/insert/select_after_replace_unwrap.sql
new file mode 100644
index 0000000000..d16e715ff9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/select_after_replace_unwrap.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* multirun can not */
+-- kikimr only: pragma kikimr.UnwrapReadTableValues = "false"; create table plato.Output (key varchar null, subkey varchar null, value varchar null, primary key (key)); commit;
+insert into plato.Output with truncate (key, subkey, value) select key, subkey, value from plato.Input;
+commit;
+select coalesce(key, ""), coalesce(subkey, ""), coalesce(value, "") from plato.Output;
diff --git a/yt/yql/tests/sql/suites/insert/select_operate_with_columns.cfg b/yt/yql/tests/sql/suites/insert/select_operate_with_columns.cfg
new file mode 100644
index 0000000000..9421c82dab
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/select_operate_with_columns.cfg
@@ -0,0 +1,3 @@
+in Input read_schema.txt
+out Output output.txt
+
diff --git a/yt/yql/tests/sql/suites/insert/select_operate_with_columns.sql b/yt/yql/tests/sql/suites/insert/select_operate_with_columns.sql
new file mode 100644
index 0000000000..12fe8035a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/select_operate_with_columns.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+insert into plato.Output with truncate
+select a + b + c as a, coalesce(d, "") as b, f as f, cast(coalesce(e, true) as varchar) as e from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/insert/select_relabel.sql b/yt/yql/tests/sql/suites/insert/select_relabel.sql
new file mode 100644
index 0000000000..71b5507666
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/select_relabel.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+-- kikimr only: pragma kikimr.UnwrapReadTableValues = "false"; create table plato.Output (key varchar null, subkey varchar null, value varchar null, primary key (key)); commit;
+insert into plato.Output with truncate (key, subkey, value) select key, subkey, "1" as value from plato.Input;
diff --git a/yt/yql/tests/sql/suites/insert/select_subquery.cfg b/yt/yql/tests/sql/suites/insert/select_subquery.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/select_subquery.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert/select_subquery.sql b/yt/yql/tests/sql/suites/insert/select_subquery.sql
new file mode 100644
index 0000000000..08015031cc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/select_subquery.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+use plato;
+
+$a = (select key from Input order by key limit 1);
+
+insert into Output (key) select $a;
diff --git a/yt/yql/tests/sql/suites/insert/select_with_sort_limit.sql b/yt/yql/tests/sql/suites/insert/select_with_sort_limit.sql
new file mode 100644
index 0000000000..97a8f11be7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/select_with_sort_limit.sql
@@ -0,0 +1,3 @@
+-- kikimr only: pragma kikimr.UnwrapReadTableValues = "false"; create table plato.Output (key varchar null, subkey varchar null, value varchar null, primary key (key)); commit;
+insert into plato.Output
+select * from plato.Input order by key limit 2;
diff --git a/yt/yql/tests/sql/suites/insert/sorted.txt.attr b/yt/yql/tests/sql/suites/insert/sorted.txt.attr
new file mode 100644
index 0000000000..ed13e20223
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/sorted.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/insert/sorted_calc.txt.attr b/yt/yql/tests/sql/suites/insert/sorted_calc.txt.attr
new file mode 100644
index 0000000000..60103163df
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/sorted_calc.txt.attr
@@ -0,0 +1,44 @@
+{
+ "_yql_row_spec" = {
+ "SortDirections" = [
+ 1
+ ];
+ "UniqueKeys" = %false;
+ "SortedByTypes" = [
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ "StrictSchema" = %true;
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ];
+ "SortedBy" = [
+ "_yql_column_0"
+ ]
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/insert/sorted_desc.txt.attr b/yt/yql/tests/sql/suites/insert/sorted_desc.txt.attr
new file mode 100644
index 0000000000..5a6ca5761e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/sorted_desc.txt.attr
@@ -0,0 +1,47 @@
+{
+ "_yql_row_spec" = {
+ "SortMembers" = [
+ "key"
+ ];
+ "SortDirections" = [
+ 0
+ ];
+ "UniqueKeys" = %false;
+ "SortedByTypes" = [
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ "StrictSchema" = %true;
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ];
+ "SortedBy" = [
+ "_yql_column_0"
+ ]
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/insert/sorted_empty.txt.attr b/yt/yql/tests/sql/suites/insert/sorted_empty.txt.attr
new file mode 100644
index 0000000000..ed13e20223
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/sorted_empty.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/insert/sorted_unique.txt.attr b/yt/yql/tests/sql/suites/insert/sorted_unique.txt.attr
new file mode 100644
index 0000000000..eeee4c32ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/sorted_unique.txt.attr
@@ -0,0 +1,21 @@
+{
+ "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/insert/trivial_literals.sql b/yt/yql/tests/sql/suites/insert/trivial_literals.sql
new file mode 100644
index 0000000000..5d0a0e557a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/trivial_literals.sql
@@ -0,0 +1,2 @@
+-- kikimr only: pragma kikimr.UnwrapReadTableValues = "false"; create table plato.Output (key varchar null, subkey varchar null, value varchar null, primary key (key)); commit;
+insert into plato.Output (key, subkey, value) values ("1", "2", "3");
diff --git a/yt/yql/tests/sql/suites/insert/trivial_literals_multirow.sql b/yt/yql/tests/sql/suites/insert/trivial_literals_multirow.sql
new file mode 100644
index 0000000000..8ea32ffc35
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/trivial_literals_multirow.sql
@@ -0,0 +1,4 @@
+-- kikimr only: pragma kikimr.UnwrapReadTableValues = "false"; create table plato.Output (key varchar null, subkey varchar null, value varchar null, primary key (key)); commit;
+/* postgres can not */
+insert into plato.Output (key, subkey, value)
+values ("1", "2", "3"), ("4", "5", "6"), ("7", "8", "9");
diff --git a/yt/yql/tests/sql/suites/insert/trivial_select.sql b/yt/yql/tests/sql/suites/insert/trivial_select.sql
new file mode 100644
index 0000000000..26b1075133
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/trivial_select.sql
@@ -0,0 +1,2 @@
+-- kikimr only: pragma kikimr.UnwrapReadTableValues = "false"; create table plato.Output (key varchar null, subkey varchar null, value varchar null, primary key (key)); commit;
+insert into plato.Output (key, subkey, value) select key, subkey, value from plato.Input;
diff --git a/yt/yql/tests/sql/suites/insert/two_input_tables.cfg b/yt/yql/tests/sql/suites/insert/two_input_tables.cfg
new file mode 100644
index 0000000000..369f783dcd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/two_input_tables.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+in Input2 input2.txt
+out Output output.txt
+
diff --git a/yt/yql/tests/sql/suites/insert/two_input_tables.sql b/yt/yql/tests/sql/suites/insert/two_input_tables.sql
new file mode 100644
index 0000000000..9a02779e6d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/two_input_tables.sql
@@ -0,0 +1,3 @@
+-- kikimr only: pragma kikimr.UnwrapReadTableValues = "false"; create table plato.Output (key varchar null, subkey varchar null, value varchar null, primary key (key)); commit;
+insert into plato.Output (key, subkey, value) select key, subkey, value from plato.Input;
+insert into plato.Output (key, subkey, value) select key, subkey, value from plato.Input2;
diff --git a/yt/yql/tests/sql/suites/insert/udf_empty.cfg b/yt/yql/tests/sql/suites/insert/udf_empty.cfg
new file mode 100644
index 0000000000..57571ef968
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/udf_empty.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output output.txt
+udf simple_udf
diff --git a/yt/yql/tests/sql/suites/insert/udf_empty.sql b/yt/yql/tests/sql/suites/insert/udf_empty.sql
new file mode 100644
index 0000000000..65823f12cd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/udf_empty.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+-- kikimr only: pragma kikimr.UnwrapReadTableValues = "false"; create table plato.Output (key varchar null, subkey varchar null, value varchar null, primary key (key)); commit;
+insert into plato.Output(key, subkey, value) values (SimpleUdf::ReturnNull(""), SimpleUdf::ReturnVoid(""), coalesce(SimpleUdf::ReturnEmpty(""), "!"));
diff --git a/yt/yql/tests/sql/suites/insert/unique_distinct_hints.cfg b/yt/yql/tests/sql/suites/insert/unique_distinct_hints.cfg
new file mode 100644
index 0000000000..eddd32c5cb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/unique_distinct_hints.cfg
@@ -0,0 +1,10 @@
+in Input input.txt
+out Output1 output1.txt
+out Output2 output2.txt
+out Output3 output3.txt
+out Output4 output4.txt
+out Output5 output5.txt
+out Output6 output6.txt
+out Output7 output7.txt
+out Output8 output8.txt
+
diff --git a/yt/yql/tests/sql/suites/insert/unique_distinct_hints.sql b/yt/yql/tests/sql/suites/insert/unique_distinct_hints.sql
new file mode 100644
index 0000000000..9029434ebc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/unique_distinct_hints.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+USE plato;
+
+INSERT INTO Output1 WITH TRUNCATE SELECT /*+ unique() */ * FROM Input;
+INSERT INTO Output2 WITH TRUNCATE SELECT /*+ distinct() */ * FROM Input;
+
+INSERT INTO Output3 WITH TRUNCATE SELECT /*+ distinct(key subkey) unique(value) */ * FROM Input;
+INSERT INTO Output4 WITH TRUNCATE SELECT /*+ unique(key) distinct(subkey value) */ * FROM Input;
+INSERT INTO Output5 WITH TRUNCATE SELECT /*+ unique(key value) unique(subkey) */ * FROM Input;
+INSERT INTO Output6 WITH TRUNCATE SELECT /*+ distinct(key) distinct(subkey) */ * FROM Input;
+
+-- Bad case: missed column - ignore hint with warning.
+INSERT INTO Output7 WITH TRUNCATE SELECT /*+ unique(subkey value) */ key, value FROM Input;
+
+INSERT INTO Output8 WITH TRUNCATE SELECT /*+ distinct(key subkey) */ key, subkey FROM Input ORDER BY key, subkey;
diff --git a/yt/yql/tests/sql/suites/insert/use_anon_table_before_commit_fail.cfg b/yt/yql/tests/sql/suites/insert/use_anon_table_before_commit_fail.cfg
new file mode 100644
index 0000000000..4f32e1efb8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/use_anon_table_before_commit_fail.cfg
@@ -0,0 +1,2 @@
+xfail
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/insert/use_anon_table_before_commit_fail.sql b/yt/yql/tests/sql/suites/insert/use_anon_table_before_commit_fail.sql
new file mode 100644
index 0000000000..befe8e1209
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/use_anon_table_before_commit_fail.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* custom error:Anonymous table "@a" must be materialized. Use COMMIT before reading from it*/
+use plato;
+
+insert into @a
+select * from Input;
+
+select * from @a;
+
diff --git a/yt/yql/tests/sql/suites/insert/use_anon_table_without_fill_fail.cfg b/yt/yql/tests/sql/suites/insert/use_anon_table_without_fill_fail.cfg
new file mode 100644
index 0000000000..4f32e1efb8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/use_anon_table_without_fill_fail.cfg
@@ -0,0 +1,2 @@
+xfail
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/insert/use_anon_table_without_fill_fail.sql b/yt/yql/tests/sql/suites/insert/use_anon_table_without_fill_fail.sql
new file mode 100644
index 0000000000..fcb33546b6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/use_anon_table_without_fill_fail.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* custom error:Anonymous table "@a" must be materialized. Use COMMIT before reading from it*/
+use plato;
+
+select * from @a;
+
diff --git a/yt/yql/tests/sql/suites/insert/values_subquery.cfg b/yt/yql/tests/sql/suites/insert/values_subquery.cfg
new file mode 100644
index 0000000000..38b2bc62d7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/values_subquery.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output output.txt
+providers yt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/insert/values_subquery.sql b/yt/yql/tests/sql/suites/insert/values_subquery.sql
new file mode 100644
index 0000000000..a409e91d8e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/values_subquery.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+use plato;
+
+$a = (select key from Input order by key limit 1);
+
+insert into Output (key) values ($a);
diff --git a/yt/yql/tests/sql/suites/insert/yql-13083-existig.cfg b/yt/yql/tests/sql/suites/insert/yql-13083-existig.cfg
new file mode 100644
index 0000000000..97aa89b9bd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/yql-13083-existig.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output1 sorted.txt
+out Output2 sorted.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/insert/yql-13083.cfg b/yt/yql/tests/sql/suites/insert/yql-13083.cfg
new file mode 100644
index 0000000000..09952ac4de
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/yql-13083.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output1 output.txt
+out Output2 output.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/insert/yql-13083.sql b/yt/yql/tests/sql/suites/insert/yql-13083.sql
new file mode 100644
index 0000000000..92c8c6ec79
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/yql-13083.sql
@@ -0,0 +1,32 @@
+/* postgres can not */
+use plato;
+
+INSERT INTO Output1
+SELECT
+ key as key,
+ "" as subkey,
+ "value:" || value as value
+FROM Input
+WHERE key < "100"
+ORDER BY key;
+
+INSERT INTO Output2
+SELECT
+ key as key,
+ "" as subkey,
+ "value:" || value as value
+FROM Input
+WHERE key < "200"
+ORDER BY key;
+
+INSERT INTO Output1
+SELECT
+ *
+FROM Input
+ORDER BY key;
+
+INSERT INTO Output2
+SELECT
+ *
+FROM Input
+ORDER BY key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/insert/yql-14538.cfg b/yt/yql/tests/sql/suites/insert/yql-14538.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/yql-14538.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert/yql-14538.sql b/yt/yql/tests/sql/suites/insert/yql-14538.sql
new file mode 100644
index 0000000000..73c2c6267a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert/yql-14538.sql
@@ -0,0 +1,18 @@
+use plato;
+
+INSERT INTO Output
+SELECT
+ key as key,
+ "" as subkey,
+ "value:" || value as value
+FROM Input
+WHERE key < "100"
+ORDER BY key
+LIMIT 5;
+
+INSERT INTO Output
+SELECT
+ *
+FROM Input
+ORDER BY key
+LIMIT 4;
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/break_sort_fail.cfg b/yt/yql/tests/sql/suites/insert_monotonic/break_sort_fail.cfg
new file mode 100644
index 0000000000..f534ef41b5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/break_sort_fail.cfg
@@ -0,0 +1,3 @@
+xfail
+in Input1 input1.txt
+out Output sorted.txt
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/break_sort_fail.sql b/yt/yql/tests/sql/suites/insert_monotonic/break_sort_fail.sql
new file mode 100644
index 0000000000..9aeefc479d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/break_sort_fail.sql
@@ -0,0 +1,6 @@
+/* custom error:Inserts with "monotonic_keys" setting must not change output table sorting*/
+use plato;
+
+INSERT INTO Output WITH MONOTONIC_KEYS
+SELECT * FROM Input1
+;
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/break_unique_fail.cfg b/yt/yql/tests/sql/suites/insert_monotonic/break_unique_fail.cfg
new file mode 100644
index 0000000000..281562f784
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/break_unique_fail.cfg
@@ -0,0 +1,4 @@
+xfail
+in Input input4.txt
+out Output sorted_unique.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/break_unique_fail.sql b/yt/yql/tests/sql/suites/insert_monotonic/break_unique_fail.sql
new file mode 100644
index 0000000000..ea673eab1c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/break_unique_fail.sql
@@ -0,0 +1,7 @@
+/* ytfile can not */
+/* custom error:Duplicate key*/
+USE plato;
+
+INSERT INTO Output WITH MONOTONIC_KEYS
+SELECT DISTINCT * FROM Input
+ORDER BY key, subkey;
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/default.cfg b/yt/yql/tests/sql/suites/insert_monotonic/default.cfg
new file mode 100644
index 0000000000..a615fc5955
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/default.cfg
@@ -0,0 +1,6 @@
+in Input1 input1.txt
+in Input2 input2.txt
+in Input4 input4.txt
+in Input5 input5.txt
+out Output sorted.txt
+
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/from_empty.cfg b/yt/yql/tests/sql/suites/insert_monotonic/from_empty.cfg
new file mode 100644
index 0000000000..cbcd5e6ebb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/from_empty.cfg
@@ -0,0 +1,2 @@
+in EmptyInput sorted_empty.txt
+out Output sorted.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/from_empty.sql b/yt/yql/tests/sql/suites/insert_monotonic/from_empty.sql
new file mode 100644
index 0000000000..12a4cd2d3b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/from_empty.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+INSERT INTO Output WITH MONOTONIC_KEYS
+SELECT * FROM EmptyInput
+ORDER BY key, subkey; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/input1.txt.attr b/yt/yql/tests/sql/suites/insert_monotonic/input1.txt.attr
new file mode 100644
index 0000000000..ed13e20223
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/input1.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/insert_monotonic/input2.txt.attr b/yt/yql/tests/sql/suites/insert_monotonic/input2.txt.attr
new file mode 100644
index 0000000000..ed13e20223
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/input2.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/insert_monotonic/input3.txt.attr b/yt/yql/tests/sql/suites/insert_monotonic/input3.txt.attr
new file mode 100644
index 0000000000..f4e2c10c67
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/input3.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/input4.txt.attr b/yt/yql/tests/sql/suites/insert_monotonic/input4.txt.attr
new file mode 100644
index 0000000000..dda2f66d5e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/input4.txt.attr
@@ -0,0 +1,21 @@
+{
+ "schema"=<
+ "strict" = %true;
+ "unique_keys" = %false
+ >[
+ {
+ "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/insert_monotonic/keep_meta.sql b/yt/yql/tests/sql/suites/insert_monotonic/keep_meta.sql
new file mode 100644
index 0000000000..cf797537e8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/keep_meta.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+INSERT INTO Output WITH (MONOTONIC_KEYS, KEEP_META, TRUNCATE)
+SELECT * FROM Input1
+ORDER BY key, subkey;
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/keep_unique.cfg b/yt/yql/tests/sql/suites/insert_monotonic/keep_unique.cfg
new file mode 100644
index 0000000000..407769fc34
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/keep_unique.cfg
@@ -0,0 +1,2 @@
+in Input input1.txt
+out Output sorted_unique.txt
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/keep_unique.sql b/yt/yql/tests/sql/suites/insert_monotonic/keep_unique.sql
new file mode 100644
index 0000000000..9721c1b113
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/keep_unique.sql
@@ -0,0 +1,9 @@
+/* ytfile can not */
+/* dqfile can not */
+USE plato;
+
+INSERT INTO Output WITH MONOTONIC_KEYS
+SELECT key, subkey, some(value) as value
+FROM Input
+GROUP BY key, subkey
+ORDER BY key, subkey;
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/non_existing_fail.cfg b/yt/yql/tests/sql/suites/insert_monotonic/non_existing_fail.cfg
new file mode 100644
index 0000000000..5625fb3b45
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/non_existing_fail.cfg
@@ -0,0 +1,2 @@
+xfail
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/non_existing_fail.sql b/yt/yql/tests/sql/suites/insert_monotonic/non_existing_fail.sql
new file mode 100644
index 0000000000..b60c6bb81f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/non_existing_fail.sql
@@ -0,0 +1,6 @@
+/* custom error:Insert with "monotonic_keys" setting cannot be used with a non-existent table*/
+USE plato;
+
+INSERT INTO Output WITH MONOTONIC_KEYS
+SELECT 1 as key
+ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/not_all_fail.cfg b/yt/yql/tests/sql/suites/insert_monotonic/not_all_fail.cfg
new file mode 100644
index 0000000000..be41f68e2e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/not_all_fail.cfg
@@ -0,0 +1,4 @@
+xfail
+in Input1 input1.txt
+in Input2 input2.txt
+out Output sorted.txt
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/not_all_fail.sql b/yt/yql/tests/sql/suites/insert_monotonic/not_all_fail.sql
new file mode 100644
index 0000000000..b00b52d880
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/not_all_fail.sql
@@ -0,0 +1,10 @@
+/* custom error:All appends within the same commit should have the same "monotonic_keys" flag*/
+USE plato;
+
+INSERT INTO Output WITH MONOTONIC_KEYS
+SELECT * FROM Input1
+ORDER BY key, subkey;
+
+INSERT INTO Output
+SELECT * FROM Input2
+ORDER BY key, subkey;
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/overlaping_fail.cfg b/yt/yql/tests/sql/suites/insert_monotonic/overlaping_fail.cfg
new file mode 100644
index 0000000000..c8b120c0b3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/overlaping_fail.cfg
@@ -0,0 +1,4 @@
+xfail
+in Input input3.txt
+out Output sorted.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/overlaping_fail.sql b/yt/yql/tests/sql/suites/insert_monotonic/overlaping_fail.sql
new file mode 100644
index 0000000000..4064ac0b9b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/overlaping_fail.sql
@@ -0,0 +1,7 @@
+/* ytfile can not */
+/* custom error:job outputs overlap with original table*/
+USE plato;
+
+INSERT INTO Output WITH MONOTONIC_KEYS
+SELECT * FROM Input
+ORDER BY key, subkey;
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/several1.sql b/yt/yql/tests/sql/suites/insert_monotonic/several1.sql
new file mode 100644
index 0000000000..f0f3f00b24
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/several1.sql
@@ -0,0 +1,8 @@
+USE plato;
+
+INSERT INTO Output
+WITH MONOTONIC_KEYS
+SELECT * FROM Input1
+UNION ALL
+SELECT * FROM Input2
+ORDER BY key, subkey;
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/several2.sql b/yt/yql/tests/sql/suites/insert_monotonic/several2.sql
new file mode 100644
index 0000000000..409f0b120e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/several2.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+INSERT INTO Output WITH MONOTONIC_KEYS
+SELECT * FROM Input1
+ORDER BY key, subkey;
+
+INSERT INTO Output WITH MONOTONIC_KEYS
+SELECT * FROM Input2
+ORDER BY key, subkey;
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/sorted.txt.attr b/yt/yql/tests/sql/suites/insert_monotonic/sorted.txt.attr
new file mode 100644
index 0000000000..ed13e20223
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/sorted.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/insert_monotonic/sorted_empty.txt.attr b/yt/yql/tests/sql/suites/insert_monotonic/sorted_empty.txt.attr
new file mode 100644
index 0000000000..ed13e20223
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/sorted_empty.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/insert_monotonic/sorted_unique.txt.attr b/yt/yql/tests/sql/suites/insert_monotonic/sorted_unique.txt.attr
new file mode 100644
index 0000000000..eeee4c32ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/sorted_unique.txt.attr
@@ -0,0 +1,21 @@
+{
+ "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/insert_monotonic/to_empty.cfg b/yt/yql/tests/sql/suites/insert_monotonic/to_empty.cfg
new file mode 100644
index 0000000000..01364c3d38
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/to_empty.cfg
@@ -0,0 +1,2 @@
+in Input input1.txt
+out EmptyOutput sorted_empty.txt
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/to_empty.sql b/yt/yql/tests/sql/suites/insert_monotonic/to_empty.sql
new file mode 100644
index 0000000000..b9cfd780bb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/to_empty.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+INSERT INTO EmptyOutput WITH MONOTONIC_KEYS
+SELECT * FROM Input
+ORDER BY key, subkey;
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/truncate_and_append.sql b/yt/yql/tests/sql/suites/insert_monotonic/truncate_and_append.sql
new file mode 100644
index 0000000000..6279af1bd9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/truncate_and_append.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+INSERT INTO Output WITH TRUNCATE
+SELECT * FROM Input1
+ORDER BY key, subkey;
+
+INSERT INTO Output WITH MONOTONIC_KEYS
+SELECT * FROM Input2
+ORDER BY key, subkey;
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/truncate_fail.cfg b/yt/yql/tests/sql/suites/insert_monotonic/truncate_fail.cfg
new file mode 100644
index 0000000000..88b7afd164
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/truncate_fail.cfg
@@ -0,0 +1,3 @@
+xfail
+in Input input1.txt
+out Output sorted.txt
diff --git a/yt/yql/tests/sql/suites/insert_monotonic/truncate_fail.sql b/yt/yql/tests/sql/suites/insert_monotonic/truncate_fail.sql
new file mode 100644
index 0000000000..50f8700e82
--- /dev/null
+++ b/yt/yql/tests/sql/suites/insert_monotonic/truncate_fail.sql
@@ -0,0 +1,6 @@
+/* custom error:"monotonic_keys" setting can not be used with TRUNCATE mode*/
+USE plato;
+
+INSERT INTO Output WITH (MONOTONIC_KEYS, TRUNCATE)
+SELECT * FROM Input
+ORDER BY key, subkey;
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;
diff --git a/yt/yql/tests/sql/suites/json/default.cfg b/yt/yql/tests/sql/suites/json/default.cfg
new file mode 100644
index 0000000000..d47da430a8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/json/default.cfg
@@ -0,0 +1 @@
+udf json2_udf \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/json/example.txt.attr b/yt/yql/tests/sql/suites/json/example.txt.attr
new file mode 100644
index 0000000000..b828b62de7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/json/example.txt.attr
@@ -0,0 +1,23 @@
+{
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "K";
+ [
+ "DataType";
+ "Int64"
+ ]
+ ];
+ [
+ "J";
+ [
+ "DataType";
+ "Json"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/json/json_exists/example.cfg b/yt/yql/tests/sql/suites/json/json_exists/example.cfg
new file mode 100644
index 0000000000..ae59265f21
--- /dev/null
+++ b/yt/yql/tests/sql/suites/json/json_exists/example.cfg
@@ -0,0 +1,3 @@
+in T example.txt
+in Filter1 json_exists/filter_example1.txt
+in Filter2 json_exists/filter_example2.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/json/json_exists/example.sql b/yt/yql/tests/sql/suites/json/json_exists/example.sql
new file mode 100644
index 0000000000..7c903f4fe8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/json/json_exists/example.sql
@@ -0,0 +1,48 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+-- These examples are taken from [ISO/IEC TR 19075-6:2017] standard (https://www.iso.org/standard/67367.html)
+SELECT T.K
+FROM T
+WHERE JSON_EXISTS (T.J, 'lax $.where');
+
+SELECT T.K
+FROM T
+WHERE JSON_EXISTS (T.J, 'strict $.where');
+
+SELECT T.K
+FROM T
+WHERE JSON_EXISTS(T.J, 'strict $.where' FALSE ON ERROR);
+
+SELECT T.K
+FROM T
+WHERE JSON_EXISTS (T.J, 'strict $.friends[*].rank');
+
+-- NOTE: Table "T" was renamed to "Filter{index}" to combine several filter examples in 1 test
+SELECT K
+FROM Filter1
+WHERE JSON_EXISTS (Filter1.J, 'lax $ ? (@.pay/@.hours > 9)');
+
+SELECT K
+FROM Filter1
+WHERE JSON_EXISTS (Filter1.J, 'strict $ ? (@.pay/@.hours > 9)');
+
+SELECT K
+FROM Filter2
+WHERE JSON_EXISTS (Filter2.J, 'lax $ ? (@.pay/@.hours > 9)');
+
+SELECT K
+FROM Filter2
+WHERE JSON_EXISTS (Filter2.J, 'strict $ ? (@.pay/@.hours > 9)');
+
+SELECT K
+FROM Filter2
+WHERE JSON_EXISTS (Filter2.J, 'lax $ ? (@.hours > 9)');
+
+SELECT K
+FROM Filter2
+WHERE JSON_EXISTS (Filter2.J, 'strict $ ? (@.hours > 9)');
+
+-- NOTE: Standard also provides several examples with is unknown predicate. Following their inimitable style
+-- standard authors do not provide data for these examples so we do not include them here
diff --git a/yt/yql/tests/sql/suites/json/json_exists/filter_example1.txt.attr b/yt/yql/tests/sql/suites/json/json_exists/filter_example1.txt.attr
new file mode 100644
index 0000000000..b828b62de7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/json/json_exists/filter_example1.txt.attr
@@ -0,0 +1,23 @@
+{
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "K";
+ [
+ "DataType";
+ "Int64"
+ ]
+ ];
+ [
+ "J";
+ [
+ "DataType";
+ "Json"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/json/json_exists/filter_example2.txt.attr b/yt/yql/tests/sql/suites/json/json_exists/filter_example2.txt.attr
new file mode 100644
index 0000000000..b828b62de7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/json/json_exists/filter_example2.txt.attr
@@ -0,0 +1,23 @@
+{
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "K";
+ [
+ "DataType";
+ "Int64"
+ ]
+ ];
+ [
+ "J";
+ [
+ "DataType";
+ "Json"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/json/json_query/example.cfg b/yt/yql/tests/sql/suites/json/json_query/example.cfg
new file mode 100644
index 0000000000..d23c2d6847
--- /dev/null
+++ b/yt/yql/tests/sql/suites/json/json_query/example.cfg
@@ -0,0 +1 @@
+in T example.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/json/json_query/example.sql b/yt/yql/tests/sql/suites/json/json_query/example.sql
new file mode 100644
index 0000000000..bdac8376bf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/json/json_query/example.sql
@@ -0,0 +1,47 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+-- These examples are taken from [ISO/IEC TR 19075-6:2017] standard (https://www.iso.org/standard/67367.html)
+SELECT T.K,
+ JSON_VALUE (T.J, 'lax $.who') AS Who,
+ JSON_VALUE (T.J, 'lax $.where' NULL ON EMPTY) AS Nali,
+ JSON_QUERY (T.J, 'lax $.friends') AS Friends
+FROM T
+WHERE JSON_EXISTS (T.J, 'lax $.friends');
+
+SELECT T.K,
+ JSON_VALUE (T.J, 'lax $.who') AS Who,
+ JSON_VALUE (T.J, 'lax $.where' NULL ON EMPTY) AS Nali,
+ JSON_QUERY (T.J, 'lax $.friends' NULL ON EMPTY) AS Friends
+FROM T;
+
+SELECT T.K,
+ JSON_VALUE (T.J, 'lax $.who') AS Who,
+ JSON_VALUE (T.J, 'lax $.where' NULL ON EMPTY) AS Nali,
+ JSON_QUERY (T.J, 'lax $.friends.name' WITH ARRAY WRAPPER) AS FriendsNames
+FROM T;
+
+-- In standard this example is demonstrated using PDF table, without any queries.
+-- We represent it as set of queries, using NULL as error value.
+-- Each SELECT is a row in source PDF table
+$J2 = CAST(@@{ "a": "[1,2]", "b": [1,2], "c": "hi"}@@ as Json);
+SELECT
+ JSON_VALUE($J2, "strict $.a"),
+ JSON_VALUE($J2, "strict $.b" NULL ON ERROR),
+ JSON_VALUE($J2, "strict $.c");
+
+SELECT
+ JSON_QUERY($J2, "strict $.a" WITHOUT ARRAY WRAPPER NULL ON ERROR),
+ JSON_QUERY($J2, "strict $.b" WITHOUT ARRAY WRAPPER),
+ JSON_QUERY($J2, "strict $.c" WITHOUT ARRAY WRAPPER NULL ON ERROR);
+
+SELECT
+ JSON_QUERY($J2, "strict $.a" WITH UNCONDITIONAL ARRAY WRAPPER),
+ JSON_QUERY($J2, "strict $.b" WITH UNCONDITIONAL ARRAY WRAPPER),
+ JSON_QUERY($J2, "strict $.c" WITH UNCONDITIONAL ARRAY WRAPPER);
+
+SELECT
+ JSON_QUERY($J2, "strict $.a" WITH CONDITIONAL ARRAY WRAPPER),
+ JSON_QUERY($J2, "strict $.b" WITH CONDITIONAL ARRAY WRAPPER),
+ JSON_QUERY($J2, "strict $.c" WITH CONDITIONAL ARRAY WRAPPER);
diff --git a/yt/yql/tests/sql/suites/json/json_value/example.cfg b/yt/yql/tests/sql/suites/json/json_value/example.cfg
new file mode 100644
index 0000000000..d23c2d6847
--- /dev/null
+++ b/yt/yql/tests/sql/suites/json/json_value/example.cfg
@@ -0,0 +1 @@
+in T example.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/json/json_value/example.sql b/yt/yql/tests/sql/suites/json/json_value/example.sql
new file mode 100644
index 0000000000..b62ed6648b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/json/json_value/example.sql
@@ -0,0 +1,55 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+-- These examples are taken from [ISO/IEC TR 19075-6:2017] standard (https://www.iso.org/standard/67367.html)
+SELECT T.K,
+ JSON_VALUE (T.J, 'lax $.who') AS Who
+FROM T;
+
+SELECT T.K,
+ JSON_VALUE (T.J, 'lax $.who') AS Who,
+ JSON_VALUE (T.J, 'lax $.where'
+ NULL ON EMPTY) AS Nali
+FROM T;
+
+SELECT T.K,
+ JSON_VALUE (T.J, 'strict $.who') AS Who,
+ JSON_VALUE (T.J, 'strict $.where'
+ DEFAULT 'no where there' ON ERROR )
+ AS Nali
+FROM T;
+
+SELECT T.K,
+ JSON_VALUE (T.J, 'lax $.who') AS Who,
+ JSON_VALUE (T.J, 'lax $.where' NULL ON EMPTY) AS Nali,
+ JSON_VALUE (T.J, 'lax $.friends.name' NULL ON EMPTY
+ DEFAULT '*** error ***' ON ERROR)
+ AS Friend
+FROM T;
+
+SELECT T.K,
+ JSON_VALUE (T.J, 'strict $.who') AS Who,
+ JSON_VALUE (T.J, 'strict $.where' NULL ON EMPTY NULL ON ERROR) AS Nali,
+
+ -- NOTE: output for this particular column differs with standard.
+ -- For row with T.K = 106 and T.J = { "who": "Louise", "where": "Iana" } output is "*** error ***", not NULL.
+ -- This is because answer in standard (NULL) is not correct. Query "strict $.friends[*].name" is executed in strict mode
+ -- where all structural errors are "hard" errors. Row with T.K = 106 does not have "friends" key in T.J. This is structural error
+ -- and the result of JSON_VALUE must tolerate ON ERROR section which specifies to return "*** error ***" string.
+ --
+ -- We can check this in PostgreSQL too (at the moment of writing PostgreSQL does not support JSON_VALUE function so we use jsonb_path_query):
+ -- postgres=# select * from jsonb_path_query('{ "who": "Louise", "where": "Iana" }', 'strict $.friends[*].name');
+ -- ERROR: JSON object does not contain key "friends"
+ -- PostgreSQL shows us that hard error has happened, as expected.
+ JSON_VALUE (T.J, 'strict $.friends[*].name' NULL ON EMPTY
+ DEFAULT '*** error ***' ON ERROR)
+ AS Friend
+FROM T;
+
+SELECT T.K,
+ JSON_VALUE (T.J, 'lax $.who') AS Who,
+ -- NOTE: In the original example INTEGER type was used. YQL does not have INTEGER type, Int64 was used instead
+ JSON_VALUE (T.J, 'lax $.friends[0].rank' RETURNING Int64 NULL ON EMPTY)
+ AS Rank
+FROM T;
diff --git a/yt/yql/tests/sql/suites/json/jsondocument/input.txt.attr b/yt/yql/tests/sql/suites/json/jsondocument/input.txt.attr
new file mode 100644
index 0000000000..e61c1d4837
--- /dev/null
+++ b/yt/yql/tests/sql/suites/json/jsondocument/input.txt.attr
@@ -0,0 +1,23 @@
+{
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "Id";
+ [
+ "DataType";
+ "Int64"
+ ]
+ ];
+ [
+ "Profile";
+ [
+ "DataType";
+ "JsonDocument"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/json/jsondocument/insert.cfg b/yt/yql/tests/sql/suites/json/jsondocument/insert.cfg
new file mode 100644
index 0000000000..25c3682008
--- /dev/null
+++ b/yt/yql/tests/sql/suites/json/jsondocument/insert.cfg
@@ -0,0 +1,2 @@
+in Input jsondocument/input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/json/jsondocument/insert.sql b/yt/yql/tests/sql/suites/json/jsondocument/insert.sql
new file mode 100644
index 0000000000..a22fbb8390
--- /dev/null
+++ b/yt/yql/tests/sql/suites/json/jsondocument/insert.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+/* multirun can not */
+
+INSERT INTO plato.Output
+SELECT * FROM plato.Input;
diff --git a/yt/yql/tests/sql/suites/json/jsondocument/select.cfg b/yt/yql/tests/sql/suites/json/jsondocument/select.cfg
new file mode 100644
index 0000000000..442a3ce787
--- /dev/null
+++ b/yt/yql/tests/sql/suites/json/jsondocument/select.cfg
@@ -0,0 +1 @@
+in Input jsondocument/input.txt
diff --git a/yt/yql/tests/sql/suites/json/jsondocument/select.sql b/yt/yql/tests/sql/suites/json/jsondocument/select.sql
new file mode 100644
index 0000000000..57361db5d1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/json/jsondocument/select.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+
+SELECT
+ Id,
+ Profile
+FROM
+ plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/between_with_key_filter.cfg b/yt/yql/tests/sql/suites/key_filter/between_with_key_filter.cfg
new file mode 100644
index 0000000000..b71bdee53e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/between_with_key_filter.cfg
@@ -0,0 +1,2 @@
+in Input between_with_key_filter.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/between_with_key_filter.sql b/yt/yql/tests/sql/suites/key_filter/between_with_key_filter.sql
new file mode 100644
index 0000000000..1cdb7cab2b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/between_with_key_filter.sql
@@ -0,0 +1,3 @@
+select * from (
+ select key as key, coalesce(cast(subkey as int), 0) as subkey, value as value from plato.Input
+) as x where key == "test" and subkey between 1 and 3 order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/key_filter/calc_dependent.sql b/yt/yql/tests/sql/suites/key_filter/calc_dependent.sql
new file mode 100644
index 0000000000..724884bc5c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/calc_dependent.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+USE plato;
+
+$k1 = "3" || "23";
+$k2 = "0" || SUBSTRING($k1, 1);
+
+SELECT
+ key
+FROM Input
+WHERE key >= $k2 and key <= $k1;
diff --git a/yt/yql/tests/sql/suites/key_filter/calc_dependent_with_tmp.sql b/yt/yql/tests/sql/suites/key_filter/calc_dependent_with_tmp.sql
new file mode 100644
index 0000000000..35c2a6b1b0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/calc_dependent_with_tmp.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+USE plato;
+
+insert into @temp
+select * from Input order by key desc limit 1;
+
+commit;
+
+$last_key = select key from @temp limit 1;
+
+select * from Input where key = $last_key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/complex.sql b/yt/yql/tests/sql/suites/key_filter/complex.sql
new file mode 100644
index 0000000000..fa2f53e0f2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/complex.sql
@@ -0,0 +1,3 @@
+select * from plato.Input
+where key in ("023", "075", "150") and (subkey="1" or subkey="3") and value>="aaa" and value<="zzz"
+order by key,subkey;
diff --git a/yt/yql/tests/sql/suites/key_filter/contains.sql b/yt/yql/tests/sql/suites/key_filter/contains.sql
new file mode 100644
index 0000000000..8c7d155eb7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/contains.sql
@@ -0,0 +1 @@
+select * from plato.Input where key in ("075", "023", "037") order by key;
diff --git a/yt/yql/tests/sql/suites/key_filter/contains_optional.cfg b/yt/yql/tests/sql/suites/key_filter/contains_optional.cfg
new file mode 100644
index 0000000000..12a1e15863
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/contains_optional.cfg
@@ -0,0 +1,2 @@
+in Input optional.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/contains_optional.sql b/yt/yql/tests/sql/suites/key_filter/contains_optional.sql
new file mode 100644
index 0000000000..5e1aa38d93
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/contains_optional.sql
@@ -0,0 +1 @@
+select * from plato.Input where key in ("075", "023") order by key;
diff --git a/yt/yql/tests/sql/suites/key_filter/contains_tuples.sql b/yt/yql/tests/sql/suites/key_filter/contains_tuples.sql
new file mode 100644
index 0000000000..65b9798176
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/contains_tuples.sql
@@ -0,0 +1,17 @@
+/* postgres can not */
+
+select * from plato.Input where AsTuple(key) in (
+ AsTuple("075"),
+ AsTuple("037")) order by key;
+
+select * from plato.Input where AsTuple(key, subkey) in (
+ AsTuple("075", "1"),
+ AsTuple("023", "3")) order by key;
+
+select * from plato.Input where AsTuple(key, subkey, 1 + 2, value) in (
+ AsTuple("075", "1", 3u, "abc"),
+ AsTuple("023", "3", 1+1+1, "aaa")) order by key;
+
+select * from plato.Input where AsTuple(subkey, AsTuple(key, 1), value, key) in (
+ AsTuple("1", AsTuple("075", 1), "abc", "075"),
+ AsTuple("3", AsTuple("023", 1), "aaa", "023")) order by key;
diff --git a/yt/yql/tests/sql/suites/key_filter/contains_tuples_no_keyfilter.sql b/yt/yql/tests/sql/suites/key_filter/contains_tuples_no_keyfilter.sql
new file mode 100644
index 0000000000..fea4b3aa7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/contains_tuples_no_keyfilter.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+-- right side depends on row
+select * from plato.Input where AsTuple(key) in (
+ AsTuple("075"),
+ AsTuple(key)) order by key, subkey;
+
+-- left side is not a prefix of sort columns
+select * from plato.Input where AsTuple(subkey, value) in (
+ AsTuple("1", "aaa"),
+ AsTuple("3", "aaa")) order by key, subkey;
+-- not a member on left side
+select * from plato.Input where AsTuple(subkey, AsTuple(key, 1), value, key || "x") in (
+ AsTuple("1", AsTuple("075", 1), "abc", "075x"),
+ AsTuple("3", AsTuple("023", 1), "aaa", "023x")) order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/key_filter/convert.cfg b/yt/yql/tests/sql/suites/key_filter/convert.cfg
new file mode 100644
index 0000000000..c3f29d9c7b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/convert.cfg
@@ -0,0 +1,2 @@
+in Input large_ui64.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/convert.sql b/yt/yql/tests/sql/suites/key_filter/convert.sql
new file mode 100644
index 0000000000..ffbd15120f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/convert.sql
@@ -0,0 +1,5 @@
+select * from plato.Input
+where
+ key = 3755112183455673684
+ or key = 10790819990820982188
+; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/datetime.sql b/yt/yql/tests/sql/suites/key_filter/datetime.sql
new file mode 100644
index 0000000000..cc8e1330ee
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/datetime.sql
@@ -0,0 +1,70 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+insert into @d
+select * from as_table(AsList(<|key:Date('2021-01-03')|>))
+assume order by key
+;
+
+insert into @dt
+select * from as_table(AsList(<|key:Datetime('2021-01-03T21:15:30Z')|>))
+assume order by key
+;
+
+insert into @ts
+select * from as_table(AsList(<|key:Timestamp('2021-01-03T21:15:30.673521Z')|>))
+assume order by key
+;
+
+
+COMMIT;
+
+SELECT * FROM @d WHERE key > Date('2021-01-02');
+SELECT * FROM @d WHERE key >= Date('2021-01-03');
+SELECT * FROM @d WHERE key < Date('2021-01-04');
+SELECT * FROM @d WHERE key <= Date('2021-01-03');
+
+SELECT * FROM @d WHERE key > Datetime('2021-01-02T23:00:00Z');
+SELECT * FROM @d WHERE key >= Datetime('2021-01-02T23:00:00Z');
+SELECT * FROM @d WHERE key < Datetime('2021-01-03T20:00:00Z');
+SELECT * FROM @d WHERE key <= Datetime('2021-01-03T20:00:00Z');
+
+SELECT * FROM @d WHERE key > Timestamp('2021-01-02T23:32:01.673521Z');
+SELECT * FROM @d WHERE key >= Timestamp('2021-01-02T23:32:01.673521Z');
+SELECT * FROM @d WHERE key < Timestamp('2021-01-03T00:00:00.673521Z');
+SELECT * FROM @d WHERE key <= Timestamp('2021-01-03T00:00:00.673521Z');
+
+-------------------------------------------
+
+SELECT * FROM @dt WHERE key > Date('2021-01-03');
+SELECT * FROM @dt WHERE key >= Date('2021-01-03');
+SELECT * FROM @dt WHERE key < Date('2021-01-04');
+SELECT * FROM @dt WHERE key <= Date('2021-01-04');
+
+SELECT * FROM @dt WHERE key > Datetime('2021-01-03T21:15:29Z');
+SELECT * FROM @dt WHERE key >= Datetime('2021-01-03T21:15:30Z');
+SELECT * FROM @dt WHERE key < Datetime('2021-01-03T21:15:31Z');
+SELECT * FROM @dt WHERE key <= Datetime('2021-01-03T21:15:30Z');
+
+SELECT * FROM @dt WHERE key > Timestamp('2021-01-03T21:15:29.673521Z');
+SELECT * FROM @dt WHERE key >= Timestamp('2021-01-03T21:15:29.673521Z');
+SELECT * FROM @dt WHERE key < Timestamp('2021-01-03T21:15:30.673521Z');
+SELECT * FROM @dt WHERE key <= Timestamp('2021-01-03T21:15:30.673521Z');
+
+-------------------------------------------
+
+SELECT * FROM @ts WHERE key > Date('2021-01-03');
+SELECT * FROM @ts WHERE key >= Date('2021-01-03');
+SELECT * FROM @ts WHERE key < Date('2021-01-04');
+SELECT * FROM @ts WHERE key <= Date('2021-01-04');
+
+SELECT * FROM @ts WHERE key > Datetime('2021-01-03T20:00:00Z');
+SELECT * FROM @ts WHERE key >= Datetime('2021-01-03T20:00:00Z');
+SELECT * FROM @ts WHERE key < Datetime('2021-01-03T22:00:00Z');
+SELECT * FROM @ts WHERE key <= Datetime('2021-01-03T22:00:00Z');
+
+SELECT * FROM @ts WHERE key > Timestamp('2021-01-03T21:15:30.573521Z');
+SELECT * FROM @ts WHERE key >= Timestamp('2021-01-03T21:15:30.673521Z');
+SELECT * FROM @ts WHERE key < Timestamp('2021-01-03T21:15:30.773521Z');
+SELECT * FROM @ts WHERE key <= Timestamp('2021-01-03T21:15:30.673521Z');
diff --git a/yt/yql/tests/sql/suites/key_filter/decimal.cfg b/yt/yql/tests/sql/suites/key_filter/decimal.cfg
new file mode 100644
index 0000000000..1f8653b25b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/decimal.cfg
@@ -0,0 +1,2 @@
+in Input key_decimal.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/decimal.sql b/yt/yql/tests/sql/suites/key_filter/decimal.sql
new file mode 100644
index 0000000000..e64bfb7637
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/decimal.sql
@@ -0,0 +1,37 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+$asIs = Python::asIs(Callable<(String)->String>,
+@@
+def asIs(arg):
+ return arg
+@@
+);
+
+insert into @decimal
+select cast(value as Decimal(15,10)) as value from Input order by value;
+
+commit;
+
+select * from (
+ select * from @decimal where value < Decimal("4.1",15,10) and value > Decimal("10.5",15,10) -- empty
+ union all
+ select * from @decimal where value > Decimal("inf",15,10) -- empty
+ union all
+ select * from @decimal where value < Decimal("-inf",15,10) -- empty
+ union all
+ select * from @decimal where value = Decimal("nan",15,10) -- empty
+ union all
+ select * from @decimal where value = Decimal("inf",15,10)
+ union all
+ select * from @decimal where value = Decimal("-inf",15,10)
+ union all
+ select * from @decimal where value > Decimal("3.3",15,10) or value >= Decimal("3.30001",15,10)
+)
+order by value;
+
+-- Don't union all to calc nodes separatelly
+select * from @decimal where value = cast("6.6" as Decimal(15,10)); -- Safe key filter calc
+select * from @decimal where value = cast($asIs("3.3") as Decimal(15,10)); -- Unsafe key filter calc
+select * from @decimal where value = cast($asIs("bad") as Decimal(15,10)); -- Unsafe key filter calc
diff --git a/yt/yql/tests/sql/suites/key_filter/default.cfg b/yt/yql/tests/sql/suites/key_filter/default.cfg
new file mode 100644
index 0000000000..2334ceb124
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/default.cfg
@@ -0,0 +1,2 @@
+in Input sorted1.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/dependent_value.sql b/yt/yql/tests/sql/suites/key_filter/dependent_value.sql
new file mode 100644
index 0000000000..a9dd4d6c52
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/dependent_value.sql
@@ -0,0 +1,3 @@
+select *
+from plato.Input
+where key == subkey;
diff --git a/yt/yql/tests/sql/suites/key_filter/dict_contains.sql b/yt/yql/tests/sql/suites/key_filter/dict_contains.sql
new file mode 100644
index 0000000000..397df1f9d2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/dict_contains.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select * from plato.Input where key in YQL::DictFromKeys(ParseType("String"), AsTuple("075", "023", "037")) order by key;
diff --git a/yt/yql/tests/sql/suites/key_filter/dict_contains_optional.cfg b/yt/yql/tests/sql/suites/key_filter/dict_contains_optional.cfg
new file mode 100644
index 0000000000..12a1e15863
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/dict_contains_optional.cfg
@@ -0,0 +1,2 @@
+in Input optional.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/dict_contains_optional.sql b/yt/yql/tests/sql/suites/key_filter/dict_contains_optional.sql
new file mode 100644
index 0000000000..22006ae6d0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/dict_contains_optional.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select * from plato.Input where key in YQL::DictFromKeys(ParseType("String"), AsTuple("075", "023")) order by key;
diff --git a/yt/yql/tests/sql/suites/key_filter/dynamic.txt.attr b/yt/yql/tests/sql/suites/key_filter/dynamic.txt.attr
new file mode 100644
index 0000000000..9e3c33c4cb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/dynamic.txt.attr
@@ -0,0 +1,33 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key"; ["DataType"; "String"]];
+ ["subkey"; ["DataType"; "String"]];
+ ["value"; ["DataType"; "String"]];
+ ]];
+ "SortMembers"=["key"; "subkey"];
+ "SortedBy"=["key"; "subkey"];
+ "SortDirections"=[1; 1];
+ "SortedByTypes"=[["DataType";"String"]; ["DataType";"String"]]
+ };
+ "_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/key_filter/empty_range.cfg b/yt/yql/tests/sql/suites/key_filter/empty_range.cfg
new file mode 100644
index 0000000000..e893a2305b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/empty_range.cfg
@@ -0,0 +1,13 @@
+in InputInt8 key_i8.txt
+in InputInt16 key_i16.txt
+in InputInt32 key_i32.txt
+in InputInt64 key_i64.txt
+in InputUint8 key_ui8.txt
+in InputUint16 key_ui16.txt
+in InputUint32 key_ui32.txt
+in InputUint64 key_ui64.txt
+in InputFloat key_flt.txt
+in InputDouble key_dbl.txt
+in InputString key_str.txt
+in InputOptString key_opt_str.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/empty_range.sql b/yt/yql/tests/sql/suites/key_filter/empty_range.sql
new file mode 100644
index 0000000000..3597ec3049
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/empty_range.sql
@@ -0,0 +1,17 @@
+use plato;
+
+select * from InputInt8 where value < -4 and value > 10;
+select * from InputInt16 where value < -4 and value > 10;
+select * from InputInt32 where value < -4 and value > 10;
+select * from InputInt64 where value < -4 and value > 10;
+
+select * from InputUint8 where value < 4 and value > 10;
+select * from InputUint16 where value < 4 and value > 10;
+select * from InputUint32 where value < 4 and value > 10;
+select * from InputUint64 where value < 4 and value > 10;
+
+select * from InputFloat where value < 4.1 and value > 10.5;
+select * from InputDouble where value < 4.1 and value > 10.5;
+
+select * from InputString where value < "a" and value > "c";
+select * from InputOptString where value < "a" and value > "c";
diff --git a/yt/yql/tests/sql/suites/key_filter/empty_range_over_dynamic.cfg b/yt/yql/tests/sql/suites/key_filter/empty_range_over_dynamic.cfg
new file mode 100644
index 0000000000..1908d503d1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/empty_range_over_dynamic.cfg
@@ -0,0 +1,2 @@
+in Input dynamic.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/empty_range_over_dynamic.sql b/yt/yql/tests/sql/suites/key_filter/empty_range_over_dynamic.sql
new file mode 100644
index 0000000000..59d8924372
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/empty_range_over_dynamic.sql
@@ -0,0 +1 @@
+select * from plato.Input where key<"030" and key>"200";
diff --git a/yt/yql/tests/sql/suites/key_filter/extend_over_map_with_same_schema.sql b/yt/yql/tests/sql/suites/key_filter/extend_over_map_with_same_schema.sql
new file mode 100644
index 0000000000..3f5c463eb1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/extend_over_map_with_same_schema.sql
@@ -0,0 +1,10 @@
+select * from (
+ SELECT "x023" as key, subkey, value FROM plato.Input WHERE key == "023"
+ union all
+ SELECT "x037" as key, subkey, value FROM plato.Input WHERE key == "037"
+ union all
+ SELECT "x075" as key, subkey, value FROM plato.Input WHERE key == "075"
+ union all
+ SELECT "x150" as key, subkey, value FROM plato.Input WHERE key == "150"
+) as x
+order by key, subkey; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/is_null.cfg b/yt/yql/tests/sql/suites/key_filter/is_null.cfg
new file mode 100644
index 0000000000..12a1e15863
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/is_null.cfg
@@ -0,0 +1,2 @@
+in Input optional.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/is_null.sql b/yt/yql/tests/sql/suites/key_filter/is_null.sql
new file mode 100644
index 0000000000..5edf06b299
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/is_null.sql
@@ -0,0 +1 @@
+select * from plato.Input where key is null;
diff --git a/yt/yql/tests/sql/suites/key_filter/is_null_multi_key.cfg b/yt/yql/tests/sql/suites/key_filter/is_null_multi_key.cfg
new file mode 100644
index 0000000000..12a1e15863
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/is_null_multi_key.cfg
@@ -0,0 +1,2 @@
+in Input optional.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/is_null_multi_key.sql b/yt/yql/tests/sql/suites/key_filter/is_null_multi_key.sql
new file mode 100644
index 0000000000..69b306c5f0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/is_null_multi_key.sql
@@ -0,0 +1 @@
+select * from plato.Input where key is null and subkey is null;
diff --git a/yt/yql/tests/sql/suites/key_filter/is_null_or_data.cfg b/yt/yql/tests/sql/suites/key_filter/is_null_or_data.cfg
new file mode 100644
index 0000000000..12a1e15863
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/is_null_or_data.cfg
@@ -0,0 +1,2 @@
+in Input optional.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/is_null_or_data.sql b/yt/yql/tests/sql/suites/key_filter/is_null_or_data.sql
new file mode 100644
index 0000000000..d5aa2b346c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/is_null_or_data.sql
@@ -0,0 +1 @@
+select * from plato.Input where key is null or key = "023";
diff --git a/yt/yql/tests/sql/suites/key_filter/is_null_with_condition.cfg b/yt/yql/tests/sql/suites/key_filter/is_null_with_condition.cfg
new file mode 100644
index 0000000000..12a1e15863
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/is_null_with_condition.cfg
@@ -0,0 +1,2 @@
+in Input optional.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/is_null_with_condition.sql b/yt/yql/tests/sql/suites/key_filter/is_null_with_condition.sql
new file mode 100644
index 0000000000..bff04b59d3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/is_null_with_condition.sql
@@ -0,0 +1 @@
+select * from plato.Input where key is null and subkey >= "0" and subkey <= "9";
diff --git a/yt/yql/tests/sql/suites/key_filter/key_dbl.txt.attr b/yt/yql/tests/sql/suites/key_filter/key_dbl.txt.attr
new file mode 100644
index 0000000000..8aaee30aa6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/key_dbl.txt.attr
@@ -0,0 +1,11 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["value";["DataType";"Double"]]
+ ]];
+ "SortMembers"=["value"];
+ "SortedBy"=["value"];
+ "SortDirections"=[1];
+ "SortedByTypes"=[["DataType";"Double"]]
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/key_decimal.txt.attr b/yt/yql/tests/sql/suites/key_filter/key_decimal.txt.attr
new file mode 100644
index 0000000000..e81b6ade45
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/key_decimal.txt.attr
@@ -0,0 +1,5 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["value";["DataType";"String"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/key_filter/key_double_opt_suffix.cfg b/yt/yql/tests/sql/suites/key_filter/key_double_opt_suffix.cfg
new file mode 100644
index 0000000000..6746e7263a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/key_double_opt_suffix.cfg
@@ -0,0 +1,3 @@
+out Output output.txt
+providers yt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/key_double_opt_suffix.sql b/yt/yql/tests/sql/suites/key_filter/key_double_opt_suffix.sql
new file mode 100644
index 0000000000..9f721723b1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/key_double_opt_suffix.sql
@@ -0,0 +1,13 @@
+USE plato;
+
+INSERT INTO Output
+select 1 as key, Just(Just("x")) as subkey,
+union all
+select 2 as key, null as subkey,
+union all
+select 2 as key, Just(Nothing(String?)) as subkey,
+ORDER BY key, subkey;
+commit;
+
+
+select key, subkey from Output where key == 2;
diff --git a/yt/yql/tests/sql/suites/key_filter/key_flt.txt.attr b/yt/yql/tests/sql/suites/key_filter/key_flt.txt.attr
new file mode 100644
index 0000000000..69560d7e0b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/key_flt.txt.attr
@@ -0,0 +1,11 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["value";["DataType";"Float"]]
+ ]];
+ "SortMembers"=["value"];
+ "SortedBy"=["value"];
+ "SortDirections"=[1];
+ "SortedByTypes"=[["DataType";"Float"]]
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/key_i16.txt.attr b/yt/yql/tests/sql/suites/key_filter/key_i16.txt.attr
new file mode 100644
index 0000000000..0c02f17123
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/key_i16.txt.attr
@@ -0,0 +1,11 @@
+{
+ "schema" = <"strict" = %true;"unique_keys" = %false>
+ [
+ {
+ "name" = "value";
+ "sort_order" = "ascending";
+ "type" = "int16";
+ "required" = %true;
+ }
+ ]
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/key_i32.txt.attr b/yt/yql/tests/sql/suites/key_filter/key_i32.txt.attr
new file mode 100644
index 0000000000..7fcf7442be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/key_i32.txt.attr
@@ -0,0 +1,11 @@
+{
+ "schema" = <"strict" = %true;"unique_keys" = %false>
+ [
+ {
+ "name" = "value";
+ "sort_order" = "ascending";
+ "type" = "int32";
+ "required" = %true;
+ }
+ ]
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/key_i64.txt.attr b/yt/yql/tests/sql/suites/key_filter/key_i64.txt.attr
new file mode 100644
index 0000000000..38f5923be5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/key_i64.txt.attr
@@ -0,0 +1,11 @@
+{
+ "schema" = <"strict" = %true;"unique_keys" = %false>
+ [
+ {
+ "name" = "value";
+ "sort_order" = "ascending";
+ "type" = "int64";
+ "required" = %true;
+ }
+ ]
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/key_i8.txt.attr b/yt/yql/tests/sql/suites/key_filter/key_i8.txt.attr
new file mode 100644
index 0000000000..01598a2af9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/key_i8.txt.attr
@@ -0,0 +1,11 @@
+{
+ "schema" = <"strict" = %true;"unique_keys" = %false>
+ [
+ {
+ "name" = "value";
+ "sort_order" = "ascending";
+ "type" = "int8";
+ "required" = %true;
+ }
+ ]
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/key_opt_str.txt.attr b/yt/yql/tests/sql/suites/key_filter/key_opt_str.txt.attr
new file mode 100644
index 0000000000..3b59311748
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/key_opt_str.txt.attr
@@ -0,0 +1,10 @@
+{
+ "schema" = <"strict" = %true;"unique_keys" = %false>
+ [
+ {
+ "name" = "value";
+ "sort_order" = "ascending";
+ "type" = "string";
+ }
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/key_filter/key_str.txt.attr b/yt/yql/tests/sql/suites/key_filter/key_str.txt.attr
new file mode 100644
index 0000000000..f69f774ce2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/key_str.txt.attr
@@ -0,0 +1,11 @@
+{
+ "schema" = <"strict" = %true;"unique_keys" = %false>
+ [
+ {
+ "name" = "value";
+ "sort_order" = "ascending";
+ "type" = "string";
+ "required" = %true;
+ }
+ ]
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/key_tzdate.txt.attr b/yt/yql/tests/sql/suites/key_filter/key_tzdate.txt.attr
new file mode 100644
index 0000000000..c8ad43a949
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/key_tzdate.txt.attr
@@ -0,0 +1,7 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["value";["DataType";"String"]]
+ ]];
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/key_ui16.txt.attr b/yt/yql/tests/sql/suites/key_filter/key_ui16.txt.attr
new file mode 100644
index 0000000000..d05297bf1b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/key_ui16.txt.attr
@@ -0,0 +1,11 @@
+{
+ "schema" = <"strict" = %true;"unique_keys" = %false>
+ [
+ {
+ "name" = "value";
+ "sort_order" = "ascending";
+ "type" = "uint16";
+ "required" = %true;
+ }
+ ]
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/key_ui32.txt.attr b/yt/yql/tests/sql/suites/key_filter/key_ui32.txt.attr
new file mode 100644
index 0000000000..edb661f4ea
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/key_ui32.txt.attr
@@ -0,0 +1,11 @@
+{
+ "schema" = <"strict" = %true;"unique_keys" = %false>
+ [
+ {
+ "name" = "value";
+ "sort_order" = "ascending";
+ "type" = "uint32";
+ "required" = %true;
+ }
+ ]
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/key_ui64.txt.attr b/yt/yql/tests/sql/suites/key_filter/key_ui64.txt.attr
new file mode 100644
index 0000000000..5028e033d5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/key_ui64.txt.attr
@@ -0,0 +1,11 @@
+{
+ "schema" = <"strict" = %true;"unique_keys" = %false>
+ [
+ {
+ "name" = "value";
+ "sort_order" = "ascending";
+ "type" = "uint64";
+ "required" = %true;
+ }
+ ]
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/key_ui8.txt.attr b/yt/yql/tests/sql/suites/key_filter/key_ui8.txt.attr
new file mode 100644
index 0000000000..6d04b983e9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/key_ui8.txt.attr
@@ -0,0 +1,11 @@
+{
+ "schema" = <"strict" = %true;"unique_keys" = %false>
+ [
+ {
+ "name" = "value";
+ "sort_order" = "ascending";
+ "type" = "uint8";
+ "required" = %true;
+ }
+ ]
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/key_uuid.txt.attr b/yt/yql/tests/sql/suites/key_filter/key_uuid.txt.attr
new file mode 100644
index 0000000000..9390239b63
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/key_uuid.txt.attr
@@ -0,0 +1,7 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["value";["DataType";"String"]]
+ ]];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/key_filter/lambda_with_null_filter.cfg b/yt/yql/tests/sql/suites/key_filter/lambda_with_null_filter.cfg
new file mode 100644
index 0000000000..12a1e15863
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/lambda_with_null_filter.cfg
@@ -0,0 +1,2 @@
+in Input optional.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/lambda_with_null_filter.sql b/yt/yql/tests/sql/suites/key_filter/lambda_with_null_filter.sql
new file mode 100644
index 0000000000..af8dcc75ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/lambda_with_null_filter.sql
@@ -0,0 +1,4 @@
+pragma DisableSimpleColumns;
+select * from plato.Input as a
+inner join (select * from plato.Input where key == "075") as b on a.subkey = b.subkey
+where b.value != "";
diff --git a/yt/yql/tests/sql/suites/key_filter/large_ui64.txt.attr b/yt/yql/tests/sql/suites/key_filter/large_ui64.txt.attr
new file mode 100644
index 0000000000..aaf781b3ae
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/large_ui64.txt.attr
@@ -0,0 +1,11 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint64"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1;];
+ "SortedBy"=["key"];
+ "SortedByTypes"=[["DataType";"Uint64";];];
+ "SortMembers"=["key";];
+}}
diff --git a/yt/yql/tests/sql/suites/key_filter/mixed_opt_bounds.cfg b/yt/yql/tests/sql/suites/key_filter/mixed_opt_bounds.cfg
new file mode 100644
index 0000000000..10d1015e7c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/mixed_opt_bounds.cfg
@@ -0,0 +1,4 @@
+in Input sorted1.txt
+res result.txt
+udf python2_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/key_filter/mixed_opt_bounds.sql b/yt/yql/tests/sql/suites/key_filter/mixed_opt_bounds.sql
new file mode 100644
index 0000000000..8955ef703b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/mixed_opt_bounds.sql
@@ -0,0 +1,19 @@
+/* postgres can not */
+/* syntax version 1 */
+$makeOpt = Python::makeOpt(Callable<(String, Bool)->String?>,
+@@
+def makeOpt(arg, flag):
+ if flag:
+ return arg
+ else:
+ return None
+@@
+);
+
+select * from plato.Input
+where key >= $makeOpt("030", true) and key <= "100"
+;
+
+select * from plato.Input
+where key >= $makeOpt("030", false) and key <= "100"
+;
diff --git a/yt/yql/tests/sql/suites/key_filter/mixed_sort.cfg b/yt/yql/tests/sql/suites/key_filter/mixed_sort.cfg
new file mode 100644
index 0000000000..ecac032a92
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/mixed_sort.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input1 sorted1.txt
+in Input2 sorted2.txt
+in Input3 sorted3.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/mixed_sort.sql b/yt/yql/tests/sql/suites/key_filter/mixed_sort.sql
new file mode 100644
index 0000000000..010ace4f8e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/mixed_sort.sql
@@ -0,0 +1,5 @@
+use plato;
+/* postgres can not */
+select * from concat(Input,Input1,Input2,Input3) where key="150" and subkey="1" and value>="aaa";
+
+select * from concat(Input,Input1,Input2,Input3) where subkey="1" and value>="aaa";
diff --git a/yt/yql/tests/sql/suites/key_filter/multiusage.cfg b/yt/yql/tests/sql/suites/key_filter/multiusage.cfg
new file mode 100644
index 0000000000..600154f15a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/multiusage.cfg
@@ -0,0 +1,3 @@
+in Input1 sorted3.txt
+in Input2 sorted3.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/multiusage.sql b/yt/yql/tests/sql/suites/key_filter/multiusage.sql
new file mode 100644
index 0000000000..3ce037599b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/multiusage.sql
@@ -0,0 +1,31 @@
+/* postgres can not */
+/* syntax version 1 */
+
+USE plato;
+
+$l = (
+ SELECT
+ t.*, TableName() as tn
+ FROM CONCAT(Input1, Input2) as t
+ WHERE
+ key == '023' AND
+ subkey == "3"
+);
+
+$r = (
+ SELECT
+ t.*, TableName() as tn
+ FROM CONCAT(Input1, Input2) as t
+ WHERE
+ key == '150' AND
+ subkey == "3"
+);
+
+SELECT
+ lhs.key as key,
+ rhs.value as value,
+ lhs.tn as l_tn,
+ rhs.tn as r_tn
+FROM $l as lhs
+JOIN $r as rhs
+ON lhs.subkey == rhs.subkey
diff --git a/yt/yql/tests/sql/suites/key_filter/nile_pred.cfg b/yt/yql/tests/sql/suites/key_filter/nile_pred.cfg
new file mode 100644
index 0000000000..12a1e15863
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/nile_pred.cfg
@@ -0,0 +1,2 @@
+in Input optional.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/nile_pred.sql b/yt/yql/tests/sql/suites/key_filter/nile_pred.sql
new file mode 100644
index 0000000000..fc0dd50197
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/nile_pred.sql
@@ -0,0 +1 @@
+select * from plato.Input where (key > "023") is not null and Unwrap(key > "023") order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/key_filter/no_bypass_merge.cfg b/yt/yql/tests/sql/suites/key_filter/no_bypass_merge.cfg
new file mode 100644
index 0000000000..18d6033408
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/no_bypass_merge.cfg
@@ -0,0 +1,3 @@
+in Input sorted2.txt
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/key_filter/no_bypass_merge.sql b/yt/yql/tests/sql/suites/key_filter/no_bypass_merge.sql
new file mode 100644
index 0000000000..431fbd3014
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/no_bypass_merge.sql
@@ -0,0 +1,8 @@
+/* ignore runonopt plan diff - extra LogicalOptimizer-PushdownOpColumns */
+pragma yt.PruneKeyFilterLambda = 'true';
+
+USE plato;
+
+$src = select * from Input where key == "1" || "5" || "0";
+select key, subkey from $src;
+select key, value from $src where key >= "000" and key < "999" and len(value) > 0;
diff --git a/yt/yql/tests/sql/suites/key_filter/num_key.txt.attr b/yt/yql/tests/sql/suites/key_filter/num_key.txt.attr
new file mode 100644
index 0000000000..8e04185d86
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/num_key.txt.attr
@@ -0,0 +1,11 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Int32"]];
+ ["subkey";["DataType";"Int32"]];
+ ["value";["DataType";"String"]]]
+ ];
+ "SortDirections"=[1;1;];
+ "SortedBy"=["key";"subkey";];
+ "SortedByTypes"=[["DataType";"Int32";];["DataType";"Int32";];];
+ "SortMembers"=["key";"subkey";];
+}}
diff --git a/yt/yql/tests/sql/suites/key_filter/optional.txt.attr b/yt/yql/tests/sql/suites/key_filter/optional.txt.attr
new file mode 100644
index 0000000000..9ccdbd1f1d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/optional.txt.attr
@@ -0,0 +1,11 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["OptionalType";["DataType";"String"]]];
+ ["subkey";["OptionalType";["DataType";"String"]]];
+ ["value";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1;1];
+ "SortedBy"=["key";"subkey"];
+ "SortedByTypes"=[["OptionalType"; ["DataType";"String";]];["OptionalType"; ["DataType";"String";]]];
+ "SortMembers"=["key";"subkey"];
+}}
diff --git a/yt/yql/tests/sql/suites/key_filter/part_key_over_dynamic.cfg b/yt/yql/tests/sql/suites/key_filter/part_key_over_dynamic.cfg
new file mode 100644
index 0000000000..1908d503d1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/part_key_over_dynamic.cfg
@@ -0,0 +1,2 @@
+in Input dynamic.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/part_key_over_dynamic.sql b/yt/yql/tests/sql/suites/key_filter/part_key_over_dynamic.sql
new file mode 100644
index 0000000000..f0b8cac448
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/part_key_over_dynamic.sql
@@ -0,0 +1,3 @@
+USE plato;
+
+select * from (SELECT key from Input) as a where key>="030" and key<="200";
diff --git a/yt/yql/tests/sql/suites/key_filter/pushdown_keyextract_passthrough.sql b/yt/yql/tests/sql/suites/key_filter/pushdown_keyextract_passthrough.sql
new file mode 100644
index 0000000000..ad6f05abaa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/pushdown_keyextract_passthrough.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$src = select
+ key,
+ "ZZZ" || key as subkey,
+ value,
+from Input as u
+assume order by key;
+
+select * from $src where key < "075" or key > "075" order by key, subkey, value;
+
diff --git a/yt/yql/tests/sql/suites/key_filter/pushdown_keyextract_type_adjust.sql b/yt/yql/tests/sql/suites/key_filter/pushdown_keyextract_type_adjust.sql
new file mode 100644
index 0000000000..5dc914851e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/pushdown_keyextract_type_adjust.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$src = select
+ Just(key) as key,
+ "ZZZ" || subkey as subkey,
+ value
+from Input as u
+assume order by key, subkey, value;
+
+select * from $src where key > "023" and key < "150" order by key;
+
diff --git a/yt/yql/tests/sql/suites/key_filter/r1.txt.attr b/yt/yql/tests/sql/suites/key_filter/r1.txt.attr
new file mode 100644
index 0000000000..f547b66c39
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/r1.txt.attr
@@ -0,0 +1,12 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["v1";["DataType";"String"]];
+ ["v3";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1;1;];
+ "SortedBy"=["key";"subkey";];
+ "SortedByTypes"=[["DataType";"String";];["DataType";"String";];];
+ "SortMembers"=["key";"subkey";];
+}}
diff --git a/yt/yql/tests/sql/suites/key_filter/r2.txt.attr b/yt/yql/tests/sql/suites/key_filter/r2.txt.attr
new file mode 100644
index 0000000000..84cf89978e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/r2.txt.attr
@@ -0,0 +1,13 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["v1";["DataType";"String"]];
+ ["v2";["OptionalType";["DataType";"String"]]];
+ ["v3";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1;1;];
+ "SortedBy"=["key";"subkey";];
+ "SortedByTypes"=[["DataType";"String";];["DataType";"String";];];
+ "SortMembers"=["key";"subkey";];
+}}
diff --git a/yt/yql/tests/sql/suites/key_filter/range_union.cfg b/yt/yql/tests/sql/suites/key_filter/range_union.cfg
new file mode 100644
index 0000000000..ceb49907c3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/range_union.cfg
@@ -0,0 +1,2 @@
+in Input num_key.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/range_union.sql b/yt/yql/tests/sql/suites/key_filter/range_union.sql
new file mode 100644
index 0000000000..4e84df8e36
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/range_union.sql
@@ -0,0 +1,67 @@
+/* postgres can not */
+select * from (
+ select * from plato.Input where key=8 or key>=9 --[8,)
+ union all
+ select * from plato.Input where key=8 or key>=8 --[8,)
+ union all
+ select * from plato.Input where key=8 or key>8 --[8,)
+ union all
+ select * from plato.Input where key=8 or key>7 --[8,)
+ union all
+ select * from plato.Input where key=8 or key>=7 --[7,)
+ union all
+
+ select * from plato.Input where key=8 or key<=7 --(,9)
+ union all
+ select * from plato.Input where key=8 or key<=8 --(,9)
+ union all
+ select * from plato.Input where key=8 or key<8 --(,9)
+ union all
+ select * from plato.Input where key=8 or key<9 --(,9)
+ union all
+ select * from plato.Input where key=8 or key<=9 --(,10)
+ union all
+
+ select * from plato.Input where key>8 or key<8 --(,8),[9,)
+ union all
+ select * from plato.Input where key>8 or key<=8 --(,)
+ union all
+ select * from plato.Input where key>8 or key<9 --(,)
+ union all
+ select * from plato.Input where key>7 or key<9 --(,)
+ union all
+ select * from plato.Input where key>=7 or key<9 --(,)
+ union all
+ select * from plato.Input where key>7 or key<=9 --(,)
+ union all
+
+ select * from plato.Input where (key>5 and key<7) or (key>4 and key<8) -- [5,8)
+ union all
+ select * from plato.Input where (key>5 and key<7) or (key>5 and key<8) -- [6,8)
+ union all
+ select * from plato.Input where (key>=5 and key<7) or (key>=5 and key<8) -- [5,8)
+ union all
+ select * from plato.Input where (key>5 and key<=7) or (key>4 and key<8) -- [5,8)
+ union all
+ select * from plato.Input where (key>5 and key<=7) or (key>4 and key<=7) -- [5,8)
+ union all
+ select * from plato.Input where (key>5 and key<8) or (key>4 and key<8) -- [5,8)
+ union all
+
+ select * from plato.Input where (key=1 and subkey<4 and subkey>1) or (key=2 and subkey<4 and subkey>1) --[{1,2},{1,4}),[{2,2},{2,4})
+ union all
+ select * from plato.Input where (key=1 and subkey<3 and subkey>1) or (key=2 and subkey<3 and subkey>1) --[{1,2}],[{2,2}]
+ union all
+ select * from plato.Input where (key=1 and subkey>1) or (key=2 and subkey<3) --[{1,2},{1}],[{2},{2,3})
+ union all
+ select * from plato.Input where (key=1 and subkey<3 and subkey>1) or key=1 --[1]
+ union all
+ select * from plato.Input where (key=1 and subkey>1) or key=1 --[1]
+ union all
+ select * from plato.Input where (key=1 and subkey<4 and subkey>1) or (key>1) --[{1,2},{1,4}),[2,)
+ union all
+ select * from plato.Input where key=1 and (subkey between 2 and 3 or subkey < 2) --[{1},{1,3}]
+ union all
+ select * from plato.Input where key=1 and (subkey >= 2 or subkey < 2) --[1]
+)
+order by key,subkey;
diff --git a/yt/yql/tests/sql/suites/key_filter/range_union_lower_excluded.sql b/yt/yql/tests/sql/suites/key_filter/range_union_lower_excluded.sql
new file mode 100644
index 0000000000..550128a88e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/range_union_lower_excluded.sql
@@ -0,0 +1,2 @@
+select * from plato.Input where key > "075" or (key == "075" and subkey == "1" and value == "abc") order by key, subkey, value;
+
diff --git a/yt/yql/tests/sql/suites/key_filter/ranges.cfg b/yt/yql/tests/sql/suites/key_filter/ranges.cfg
new file mode 100644
index 0000000000..2334ceb124
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/ranges.cfg
@@ -0,0 +1,2 @@
+in Input sorted1.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/ranges.sql b/yt/yql/tests/sql/suites/key_filter/ranges.sql
new file mode 100644
index 0000000000..cf4ed498a6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/ranges.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+select * from (
+ select * from plato.Input where key<="037" and key>="037"
+ union all
+ select * from plato.Input where key>="037" and key<="037"
+ union all
+ select * from plato.Input where key between "037" and "037"
+)
+order by key,subkey;
diff --git a/yt/yql/tests/sql/suites/key_filter/sorted1.txt.attr b/yt/yql/tests/sql/suites/key_filter/sorted1.txt.attr
new file mode 100644
index 0000000000..391c1a05f6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/sorted1.txt.attr
@@ -0,0 +1,11 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1;1;1;];
+ "SortedBy"=["key";"subkey";"value";];
+ "SortedByTypes"=[["DataType";"String";];["DataType";"String";];["DataType";"String";];];
+ "SortMembers"=["key";"subkey";"value";];
+}}
diff --git a/yt/yql/tests/sql/suites/key_filter/sorted2.txt.attr b/yt/yql/tests/sql/suites/key_filter/sorted2.txt.attr
new file mode 100644
index 0000000000..be6e381cb4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/sorted2.txt.attr
@@ -0,0 +1,11 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1;];
+ "SortedBy"=["key";];
+ "SortedByTypes"=[["DataType";"String";];];
+ "SortMembers"=["key";];
+}}
diff --git a/yt/yql/tests/sql/suites/key_filter/sorted3.txt.attr b/yt/yql/tests/sql/suites/key_filter/sorted3.txt.attr
new file mode 100644
index 0000000000..bcd06590fb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/sorted3.txt.attr
@@ -0,0 +1,11 @@
+{"_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";];
+}}
diff --git a/yt/yql/tests/sql/suites/key_filter/sorted4.txt.attr b/yt/yql/tests/sql/suites/key_filter/sorted4.txt.attr
new file mode 100644
index 0000000000..391c1a05f6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/sorted4.txt.attr
@@ -0,0 +1,11 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1;1;1;];
+ "SortedBy"=["key";"subkey";"value";];
+ "SortedByTypes"=[["DataType";"String";];["DataType";"String";];["DataType";"String";];];
+ "SortMembers"=["key";"subkey";"value";];
+}}
diff --git a/yt/yql/tests/sql/suites/key_filter/split_input_with_key_filter1.cfg b/yt/yql/tests/sql/suites/key_filter/split_input_with_key_filter1.cfg
new file mode 100644
index 0000000000..3b40f69cee
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/split_input_with_key_filter1.cfg
@@ -0,0 +1,3 @@
+in Input sorted1.txt
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/key_filter/split_input_with_key_filter1.sql b/yt/yql/tests/sql/suites/key_filter/split_input_with_key_filter1.sql
new file mode 100644
index 0000000000..94f7647dcd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/split_input_with_key_filter1.sql
@@ -0,0 +1,10 @@
+USE plato;
+
+pragma yt.MaxInputTables="2";
+SELECT
+ key as key,
+ "" as subkey,
+ "value:" || value as value
+FROM concat(Input, Input, Input, Input)
+WHERE key = "07" || "5"
+; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/split_input_with_key_filter2.cfg b/yt/yql/tests/sql/suites/key_filter/split_input_with_key_filter2.cfg
new file mode 100644
index 0000000000..3b40f69cee
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/split_input_with_key_filter2.cfg
@@ -0,0 +1,3 @@
+in Input sorted1.txt
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/key_filter/split_input_with_key_filter2.sql b/yt/yql/tests/sql/suites/key_filter/split_input_with_key_filter2.sql
new file mode 100644
index 0000000000..b2662fbedf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/split_input_with_key_filter2.sql
@@ -0,0 +1,10 @@
+USE plato;
+
+pragma yt.MaxInputTables="2";
+SELECT
+ key as key,
+ "" as subkey,
+ "value:" || value as value
+FROM concat(Input, Input, Input)
+WHERE key = "07" || "5"
+; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/string_with.sql b/yt/yql/tests/sql/suites/key_filter/string_with.sql
new file mode 100644
index 0000000000..abd53c9618
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/string_with.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+SELECT * FROM plato.Input
+WHERE StartsWith(key, "0") AND EndsWith(key, "5");
+
diff --git a/yt/yql/tests/sql/suites/key_filter/string_with_ff.sql b/yt/yql/tests/sql/suites/key_filter/string_with_ff.sql
new file mode 100644
index 0000000000..07d85b43c9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/string_with_ff.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+insert into @src
+select "\xff\xff" || key as key from Input order by key;
+
+commit;
+
+select count(*) from (
+ select * from @src where StartsWith(key, "\xff\xff") and EndsWith(key, "5")
+);
+
diff --git a/yt/yql/tests/sql/suites/key_filter/string_with_legacy.cfg b/yt/yql/tests/sql/suites/key_filter/string_with_legacy.cfg
new file mode 100644
index 0000000000..965c7fe965
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/string_with_legacy.cfg
@@ -0,0 +1,2 @@
+in Input sorted4.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/string_with_legacy.sql b/yt/yql/tests/sql/suites/key_filter/string_with_legacy.sql
new file mode 100644
index 0000000000..415a38d93d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/string_with_legacy.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+pragma yt.UseNewPredicateExtraction="false";
+
+SELECT key FROM plato.Input WHERE StartsWith(key, String("150")) ORDER BY key;
+
+SELECT key FROM plato.Input WHERE StartsWith(key, Utf8("15")) OR StartsWith(key, Utf8("150")) ORDER BY key;
+
+SELECT key FROM plato.Input WHERE StartsWith(key, Utf8("тест")) OR StartsWith(key, String("тест\xff")) ORDER BY key;
+
+SELECT key FROM plato.Input WHERE StartsWith(key, String("\xff")) ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/key_filter/tzdate.cfg b/yt/yql/tests/sql/suites/key_filter/tzdate.cfg
new file mode 100644
index 0000000000..2c7908c6e7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/tzdate.cfg
@@ -0,0 +1,2 @@
+in Input key_tzdate.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/tzdate.sql b/yt/yql/tests/sql/suites/key_filter/tzdate.sql
new file mode 100644
index 0000000000..c5fe5ab841
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/tzdate.sql
@@ -0,0 +1,35 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+$asIs = Python::asIs(Callable<(String)->String>,
+@@
+def asIs(arg):
+ return arg
+@@
+);
+
+insert into @tzdate
+select cast(value as TzDate) as value from Input order by value;
+
+commit;
+
+select * from (
+ select * from @tzdate where value < TzDate("1999-01-01,Europe/Moscow") and value > TzDate("2011-01-01,Europe/Moscow") -- empty
+ union all
+ select * from @tzdate where value > TzDate("2105-12-30,posixrules") -- empty
+ union all
+ select * from @tzdate where value < TzDate("1970-01-01,GMT") -- empty
+ union all
+ select * from @tzdate where value = TzDate("2018-02-01,GMT")
+ union all
+ select * from @tzdate where value > TzDate("1999-01-01,GMT") or value >= TzDate("1999-01-01,Europe/Moscow")
+ union all
+ select * from @tzdate where value >= TzDate("2018-02-01,Europe/Moscow") and value <= TzDate("2105-12-30,America/Los_Angeles") -- Should include 2018-02-01,GMT and 2105-12-31,posixrules
+)
+order by value;
+
+-- Don't union all to calc nodes separatelly
+select * from @tzdate where value = cast("1999-01-01,Europe/Moscow" as TzDate); -- Safe key filter calc
+select * from @tzdate where value = cast($asIs("2105-12-30,America/Los_Angeles") as TzDate); -- Unsafe key filter calc
+select * from @tzdate where value = cast($asIs("bad") as TzDate); -- Unsafe key filter calc
diff --git a/yt/yql/tests/sql/suites/key_filter/utf8.txt.attr b/yt/yql/tests/sql/suites/key_filter/utf8.txt.attr
new file mode 100644
index 0000000000..ef4d43d3a3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/utf8.txt.attr
@@ -0,0 +1,11 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Utf8"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1;1;1;];
+ "SortedBy"=["key";"subkey";"value";];
+ "SortedByTypes"=[["DataType";"Utf8";];["DataType";"String";];["DataType";"String";];];
+ "SortMembers"=["key";"subkey";"value";];
+}}
diff --git a/yt/yql/tests/sql/suites/key_filter/utf8_with_legacy.cfg b/yt/yql/tests/sql/suites/key_filter/utf8_with_legacy.cfg
new file mode 100644
index 0000000000..71de3c4553
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/utf8_with_legacy.cfg
@@ -0,0 +1,2 @@
+in Input utf8.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/utf8_with_legacy.sql b/yt/yql/tests/sql/suites/key_filter/utf8_with_legacy.sql
new file mode 100644
index 0000000000..37b892db0d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/utf8_with_legacy.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+pragma yt.UseNewPredicateExtraction="false";
+
+SELECT key FROM plato.Input WHERE StartsWith(key, String("150")) ORDER BY key;
+
+SELECT key FROM plato.Input WHERE StartsWith(key, String("15")) OR StartsWith(key, String("150")) ORDER BY key;
+
+SELECT key FROM plato.Input WHERE StartsWith(key, String("\xf5")) ORDER BY key;
+
+SELECT key FROM plato.Input WHERE StartsWith(key, Utf8("тест\xf4\x8f\xbf\xbf")) ORDER BY key;
+
+SELECT key FROM plato.Input WHERE StartsWith(key, Utf8("тест")) OR StartsWith(key, Utf8("тест\xf4\x8f\xbf\xbf")) ORDER BY key;
+
+SELECT key FROM plato.Input WHERE StartsWith(key, Utf8("\xf4\x8f\xbf\xbf")) ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/key_filter/uuid.cfg b/yt/yql/tests/sql/suites/key_filter/uuid.cfg
new file mode 100644
index 0000000000..8e98e96be2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/uuid.cfg
@@ -0,0 +1,2 @@
+in Input key_uuid.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/uuid.sql b/yt/yql/tests/sql/suites/key_filter/uuid.sql
new file mode 100644
index 0000000000..6a9a392561
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/uuid.sql
@@ -0,0 +1,41 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+$asIs = Python::asIs(Callable<(String)->String>,
+@@
+def asIs(arg):
+ return arg
+@@
+);
+
+insert into @uuid
+select cast(value as Uuid) as value from Input order by value;
+
+commit;
+
+select * from (
+ select * from @uuid where value < Uuid("00000000-0000-0000-0000-100000000000") and value > Uuid("00000000-0000-0000-0000-400000000000") -- empty
+ union all
+ select * from @uuid where value > Uuid("FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF") -- empty
+ union all
+ select * from @uuid where value < Uuid("00000000-0000-0000-0000-000000000000") -- empty
+ union all
+ select * from @uuid where value > Uuid("00000000-0000-0000-0000-100000000000") or value >= Uuid("00000000-0000-0000-0000-200000000000") --(00000000-0000-0000-0000-100000000000,)
+ union all
+ select * from @uuid where value >= Uuid("00000000-0000-0000-0000-100000000000") or value > Uuid("00000000-0000-0000-0000-200000000000") --[00000000-0000-0000-0000-100000000000,)
+ union all
+ select * from @uuid where value = Uuid("00000000-0000-0000-0000-100000000000") or value < Uuid("00000000-0000-0000-0000-200000000000") --(,00000000-0000-0000-0000-200000000000)
+ union all
+ select * from @uuid where value < Uuid("00000000-0000-0000-0000-100000000000") or value <= Uuid("00000000-0000-0000-0000-200000000000") --(,00000000-0000-0000-0000-200000000000]
+ union all
+ select * from @uuid where value < Uuid("00000000-0000-0000-0000-100000000000") or value <= Uuid("00000000-0000-0000-0000-200000000000") --(,00000000-0000-0000-0000-200000000000]
+ union all
+ select * from @uuid where value > Uuid("00000000-0000-0000-0000-100000000000") and value <= Uuid("00000000-0000-0000-0000-400000000000") --(00000000-0000-0000-0000-100000000000,00000000-0000-0000-0000-400000000000]
+)
+order by value;
+
+-- Don't union all to calc nodes separatelly
+select * from @uuid where value = cast("00000000-0000-0000-0000-100000000000" as Uuid); -- Safe key filter calc
+select * from @uuid where value = cast($asIs("00000000-0000-0000-0000-200000000000") as Uuid); -- Unsafe key filter calc
+select * from @uuid where value = cast($asIs("bad") as Uuid); -- Unsafe key filter calc
diff --git a/yt/yql/tests/sql/suites/key_filter/yql-14157.cfg b/yt/yql/tests/sql/suites/key_filter/yql-14157.cfg
new file mode 100644
index 0000000000..f2977cd84e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/yql-14157.cfg
@@ -0,0 +1,3 @@
+in Input1 r1.txt
+in Input2 r2.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/yql-14157.sql b/yt/yql/tests/sql/suites/key_filter/yql-14157.sql
new file mode 100644
index 0000000000..ec132b55ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/yql-14157.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+SELECT v1, v2
+FROM RANGE("", "Input1", "Input2")
+WHERE key == "037";
+
+SELECT v1, v2
+FROM RANGE("", "Input1", "Input2")
+WHERE key == "150" and subkey = "1";
+
diff --git a/yt/yql/tests/sql/suites/key_filter/yql-8117-table_key_filter.cfg b/yt/yql/tests/sql/suites/key_filter/yql-8117-table_key_filter.cfg
new file mode 100644
index 0000000000..8dbea3de64
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/yql-8117-table_key_filter.cfg
@@ -0,0 +1,4 @@
+in InputA sorted2.txt
+in InputB sorted2.txt
+in InputC sorted2.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/yql-8117-table_key_filter.sql b/yt/yql/tests/sql/suites/key_filter/yql-8117-table_key_filter.sql
new file mode 100644
index 0000000000..5bb0744c2f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/yql-8117-table_key_filter.sql
@@ -0,0 +1,16 @@
+USE plato;
+
+SELECT * FROM (
+ SELECT
+ value
+ FROM RANGE("", "InputA", "InputC")
+ WHERE
+ (key == "023" OR key == "037") AND value != ""
+ UNION ALL
+ SELECT
+ value
+ FROM RANGE("", "InputA", "InputC")
+ WHERE
+ (key == "075" OR key == "150") AND value != ""
+)
+ORDER BY value; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/yql-8663-dedup_ranges.cfg b/yt/yql/tests/sql/suites/key_filter/yql-8663-dedup_ranges.cfg
new file mode 100644
index 0000000000..2334ceb124
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/yql-8663-dedup_ranges.cfg
@@ -0,0 +1,2 @@
+in Input sorted1.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/key_filter/yql-8663-dedup_ranges.sql b/yt/yql/tests/sql/suites/key_filter/yql-8663-dedup_ranges.sql
new file mode 100644
index 0000000000..c6a99abbaf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/yql-8663-dedup_ranges.sql
@@ -0,0 +1,4 @@
+SELECT *
+FROM plato.Input
+WHERE key ='023'
+ AND (value = "aaa" OR subkey = "3") \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/key_filter/yql_5895_or.sql b/yt/yql/tests/sql/suites/key_filter/yql_5895_or.sql
new file mode 100644
index 0000000000..57116d5d35
--- /dev/null
+++ b/yt/yql/tests/sql/suites/key_filter/yql_5895_or.sql
@@ -0,0 +1,4 @@
+SELECT
+ *
+FROM plato.Input
+WHERE key > "023" or key > "075" or key < "075";
diff --git a/yt/yql/tests/sql/suites/lambda/default.cfg b/yt/yql/tests/sql/suites/lambda/default.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lambda/default.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/lambda/lambda_simple.sql b/yt/yql/tests/sql/suites/lambda/lambda_simple.sql
new file mode 100644
index 0000000000..93f7ea3e96
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lambda/lambda_simple.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+USE plato;
+PRAGMA DisableSimpleColumns;
+
+$shiftSteps=1;
+$linear = ($x, $z)->{
+ $v = 10 * $z + $x;
+ $shift = ($item) -> {return $item << $shiftSteps};
+ return $shift($v)
+};
+
+--INSERT INTO Output
+SELECT t.*, $linear(cast(key as uint64), cast(subkey as uint64)) FROM Input as t;
diff --git a/yt/yql/tests/sql/suites/lambda/lambda_udf.cfg b/yt/yql/tests/sql/suites/lambda/lambda_udf.cfg
new file mode 100644
index 0000000000..b0a6e1e6b6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lambda/lambda_udf.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf math_udf
diff --git a/yt/yql/tests/sql/suites/lambda/lambda_udf.sql b/yt/yql/tests/sql/suites/lambda/lambda_udf.sql
new file mode 100644
index 0000000000..aff4e45606
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lambda/lambda_udf.sql
@@ -0,0 +1,16 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+
+$shiftSteps = 1;
+$linear = ($x, $z) -> {
+ $v = 10 * $z + $x;
+ $shift = ($item) -> {
+ return $item << $shiftSteps
+ };
+ $res = Math::Floor(Math::Pi() * $shift($v));
+ return $res
+};
+
+--INSERT INTO Output
+SELECT t.*, $linear(cast(key as uint64), cast(subkey as uint64)) as linear FROM Input as t;
diff --git a/yt/yql/tests/sql/suites/lambda/lambda_use_labmda_as_arg.sql b/yt/yql/tests/sql/suites/lambda/lambda_use_labmda_as_arg.sql
new file mode 100644
index 0000000000..dafd67ef4f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lambda/lambda_use_labmda_as_arg.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+USE plato;
+PRAGMA DisableSimpleColumns;
+
+$shiftSteps=($item) -> { return Cast($item % 4 as Uint8)??0 };
+
+$linear = ($x, $z, $func) -> {
+ $v = 10 * $z + $x;
+ $shift = ($item, $sk) -> {return $item << $func($sk)};
+ return $shift($v, $z)
+};
+
+--INSERT INTO Output
+SELECT t.*, $linear(cast(key as uint64), cast(subkey as uint64), $shiftSteps) FROM Input as t;
diff --git a/yt/yql/tests/sql/suites/lambda/lambda_with_tie.sql b/yt/yql/tests/sql/suites/lambda/lambda_with_tie.sql
new file mode 100644
index 0000000000..83c9aa7f46
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lambda/lambda_with_tie.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+USE plato;
+
+$func = ($x, $y)->{
+ $y, $x = AsTuple($x, $y);
+ return $x || "_" || $y;
+};
+
+--INSERT INTO Output
+SELECT $func(key, subkey) as func FROM Input;
diff --git a/yt/yql/tests/sql/suites/library/p_package_cluster.json b/yt/yql/tests/sql/suites/library/p_package_cluster.json
new file mode 100644
index 0000000000..8824674974
--- /dev/null
+++ b/yt/yql/tests/sql/suites/library/p_package_cluster.json
@@ -0,0 +1 @@
+"plato"
diff --git a/yt/yql/tests/sql/suites/library/package.cfg b/yt/yql/tests/sql/suites/library/package.cfg
new file mode 100644
index 0000000000..2ec4243a95
--- /dev/null
+++ b/yt/yql/tests/sql/suites/library/package.cfg
@@ -0,0 +1,5 @@
+providers yt
+yt_file yt://plato/package/total.sql package_total.sql.txt
+yt_file yt://plato/package/detail/foo.sql package_foo.sql.txt
+yt_file yt://plato/package/detail/bar.sql package_bar.sql.txt
+param $cluster p_package_cluster.json
diff --git a/yt/yql/tests/sql/suites/library/package.sql b/yt/yql/tests/sql/suites/library/package.sql
new file mode 100644
index 0000000000..e649b298a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/library/package.sql
@@ -0,0 +1,9 @@
+/* ytfile can not */
+
+declare $cluster as String;
+
+pragma package("project.package", "yt://{$cluster}/package");
+
+import pkg.project.package.total symbols $do_total;
+
+select $do_total(1);
diff --git a/yt/yql/tests/sql/suites/library/package_override.cfg b/yt/yql/tests/sql/suites/library/package_override.cfg
new file mode 100644
index 0000000000..5cc9b05eda
--- /dev/null
+++ b/yt/yql/tests/sql/suites/library/package_override.cfg
@@ -0,0 +1,5 @@
+providers yt
+file pkg/project/package/detail/bar.sql package_bar_override.sql.txt
+yt_file yt://plato/package/total.sql package_total.sql.txt
+yt_file yt://plato/package/detail/foo.sql package_foo.sql.txt
+yt_file yt://plato/package/detail/bar.sql package_bar.sql.txt
diff --git a/yt/yql/tests/sql/suites/library/package_override.sql b/yt/yql/tests/sql/suites/library/package_override.sql
new file mode 100644
index 0000000000..bd0b2c7625
--- /dev/null
+++ b/yt/yql/tests/sql/suites/library/package_override.sql
@@ -0,0 +1,8 @@
+/* ytfile can not */
+
+pragma package("project.package", "yt://plato/package");
+pragma override_library("project/package/detail/bar.sql");
+
+import pkg.project.package.total symbols $do_total;
+
+select $do_total(1);
diff --git a/yt/yql/tests/sql/suites/like/default.cfg b/yt/yql/tests/sql/suites/like/default.cfg
new file mode 100644
index 0000000000..e300a83153
--- /dev/null
+++ b/yt/yql/tests/sql/suites/like/default.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf re2_udf
diff --git a/yt/yql/tests/sql/suites/like/ilike_clause.sql b/yt/yql/tests/sql/suites/like/ilike_clause.sql
new file mode 100644
index 0000000000..42bb62c45e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/like/ilike_clause.sql
@@ -0,0 +1,2 @@
+select key, subkey, value from plato.Input
+where value ilike "q_Z" or value ilike "%Q";
diff --git a/yt/yql/tests/sql/suites/like/like_clause.sql b/yt/yql/tests/sql/suites/like/like_clause.sql
new file mode 100644
index 0000000000..4e190d1a05
--- /dev/null
+++ b/yt/yql/tests/sql/suites/like/like_clause.sql
@@ -0,0 +1,2 @@
+select key, subkey, value from plato.Input
+where value like "q_z" or value like "%q"; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/like/like_clause_escape.sql b/yt/yql/tests/sql/suites/like/like_clause_escape.sql
new file mode 100644
index 0000000000..9f7f67fb36
--- /dev/null
+++ b/yt/yql/tests/sql/suites/like/like_clause_escape.sql
@@ -0,0 +1,5 @@
+select key, subkey, value from plato.Input
+where
+value like "!%z" escape "!" or
+value || "_" like "_?_" escape "?" or
+value || "!" like "ddd!!" escape "!"; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/like/like_clause_no_pattern.sql b/yt/yql/tests/sql/suites/like/like_clause_no_pattern.sql
new file mode 100644
index 0000000000..59e13dafdf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/like/like_clause_no_pattern.sql
@@ -0,0 +1,9 @@
+select
+ value,
+ case when
+ value like "abc"
+ then "true"
+ else "false"
+ end as is_abc
+from plato.Input
+order by is_abc desc, value asc; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/like/regexp_clause.cfg b/yt/yql/tests/sql/suites/like/regexp_clause.cfg
new file mode 100644
index 0000000000..93eff5b6bc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/like/regexp_clause.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+udf re2_udf
+udf pire_udf
diff --git a/yt/yql/tests/sql/suites/like/regexp_clause.sql b/yt/yql/tests/sql/suites/like/regexp_clause.sql
new file mode 100644
index 0000000000..648029051d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/like/regexp_clause.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+/* syntax version 1 */
+select key, subkey, value from plato.Input
+where value regexp "^a";
diff --git a/yt/yql/tests/sql/suites/limit/default.cfg b/yt/yql/tests/sql/suites/limit/default.cfg
new file mode 100644
index 0000000000..09cf05d98c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/default.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+res result.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/limit/dynamic.txt.attr b/yt/yql/tests/sql/suites/limit/dynamic.txt.attr
new file mode 100644
index 0000000000..9e3c33c4cb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/dynamic.txt.attr
@@ -0,0 +1,33 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key"; ["DataType"; "String"]];
+ ["subkey"; ["DataType"; "String"]];
+ ["value"; ["DataType"; "String"]];
+ ]];
+ "SortMembers"=["key"; "subkey"];
+ "SortedBy"=["key"; "subkey"];
+ "SortDirections"=[1; 1];
+ "SortedByTypes"=[["DataType";"String"]; ["DataType";"String"]]
+ };
+ "_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/limit/dynamic_limit.cfg b/yt/yql/tests/sql/suites/limit/dynamic_limit.cfg
new file mode 100644
index 0000000000..eb1992232a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/dynamic_limit.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+res result.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/limit/dynamic_limit.sql b/yt/yql/tests/sql/suites/limit/dynamic_limit.sql
new file mode 100644
index 0000000000..b4eac0329a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/dynamic_limit.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+use plato;
+
+$avg = (SELECT AVG(Length(key)) FROM Input);
+
+SELECT key FROM Input LIMIT Cast($avg as Uint64) ?? 0;
diff --git a/yt/yql/tests/sql/suites/limit/dynamic_sort_limit.cfg b/yt/yql/tests/sql/suites/limit/dynamic_sort_limit.cfg
new file mode 100644
index 0000000000..1bfc4d45f1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/dynamic_sort_limit.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+res result.txt
+udf python2_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/limit/dynamic_sort_limit.sql b/yt/yql/tests/sql/suites/limit/dynamic_sort_limit.sql
new file mode 100644
index 0000000000..96e033df95
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/dynamic_sort_limit.sql
@@ -0,0 +1,19 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+
+$script = @@
+def f(s):
+ return int(s)
+@@;
+
+$callable = Python::f(Callable<(String)->Uint64?>,$script);
+
+$i = unwrap($callable("2"));
+
+SELECT
+ key,
+ SOME(value) as value
+FROM Input
+GROUP BY key
+ORDER BY key LIMIT $i;
diff --git a/yt/yql/tests/sql/suites/limit/empty_input_after_limit.sql b/yt/yql/tests/sql/suites/limit/empty_input_after_limit.sql
new file mode 100644
index 0000000000..3a15ab796f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/empty_input_after_limit.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+$in = (
+ select * from plato.Input where key = "150"
+ union all
+ select * from plato.Input where key = "075"
+);
+
+select * from $in order by key limit 100 offset 90;
diff --git a/yt/yql/tests/sql/suites/limit/empty_read_after_limit.sql b/yt/yql/tests/sql/suites/limit/empty_read_after_limit.sql
new file mode 100644
index 0000000000..bc0dfad64e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/empty_read_after_limit.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+pragma direct_read;
+select * from plato.Input order by key limit 100 offset 90;
diff --git a/yt/yql/tests/sql/suites/limit/empty_sort_after_limit.sql b/yt/yql/tests/sql/suites/limit/empty_sort_after_limit.sql
new file mode 100644
index 0000000000..11ed40c1ab
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/empty_sort_after_limit.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select * from plato.Input order by key limit 100 offset 90;
diff --git a/yt/yql/tests/sql/suites/limit/empty_sort_calc_after_limit.sql b/yt/yql/tests/sql/suites/limit/empty_sort_calc_after_limit.sql
new file mode 100644
index 0000000000..08033a5fef
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/empty_sort_calc_after_limit.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select * from plato.Input order by key || subkey limit 100 offset 90;
diff --git a/yt/yql/tests/sql/suites/limit/empty_sort_desc_after_limit.sql b/yt/yql/tests/sql/suites/limit/empty_sort_desc_after_limit.sql
new file mode 100644
index 0000000000..8bf56e6f2d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/empty_sort_desc_after_limit.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select * from plato.Input order by key desc limit 100 offset 90;
diff --git a/yt/yql/tests/sql/suites/limit/insert_with_limit-dynamic.cfg b/yt/yql/tests/sql/suites/limit/insert_with_limit-dynamic.cfg
new file mode 100644
index 0000000000..b4ffc75e3c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/insert_with_limit-dynamic.cfg
@@ -0,0 +1,2 @@
+in Input dynamic.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/limit/insert_with_limit.cfg b/yt/yql/tests/sql/suites/limit/insert_with_limit.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/insert_with_limit.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/limit/insert_with_limit.sql b/yt/yql/tests/sql/suites/limit/insert_with_limit.sql
new file mode 100644
index 0000000000..f51506c8af
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/insert_with_limit.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+insert into plato.Output with truncate
+select * from plato.Input limit 2;
diff --git a/yt/yql/tests/sql/suites/limit/limit-dynamic.cfg b/yt/yql/tests/sql/suites/limit/limit-dynamic.cfg
new file mode 100644
index 0000000000..80e8546f07
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/limit-dynamic.cfg
@@ -0,0 +1 @@
+in Input dynamic.txt
diff --git a/yt/yql/tests/sql/suites/limit/limit.cfg b/yt/yql/tests/sql/suites/limit/limit.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/limit.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/limit/limit.sql b/yt/yql/tests/sql/suites/limit/limit.sql
new file mode 100644
index 0000000000..8b2d036f97
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/limit.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select * from plato.Input limit 1000; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/limit/limit_offset.sql b/yt/yql/tests/sql/suites/limit/limit_offset.sql
new file mode 100644
index 0000000000..99ac57e551
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/limit_offset.sql
@@ -0,0 +1 @@
+select value, subkey, key from (select * from plato.Input) as x order by key, subkey limit 1 offset 1;
diff --git a/yt/yql/tests/sql/suites/limit/limit_over_sort_desc_in_subquery.cfg b/yt/yql/tests/sql/suites/limit/limit_over_sort_desc_in_subquery.cfg
new file mode 100644
index 0000000000..c85115a8e4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/limit_over_sort_desc_in_subquery.cfg
@@ -0,0 +1,2 @@
+in Input sorted_desc.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/limit/limit_over_sort_desc_in_subquery.sql b/yt/yql/tests/sql/suites/limit/limit_over_sort_desc_in_subquery.sql
new file mode 100644
index 0000000000..9567209c22
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/limit_over_sort_desc_in_subquery.sql
@@ -0,0 +1,19 @@
+/* postgres can not */
+/* hybridfile can not YQL-17743 */
+/* syntax version 1 */
+USE plato;
+
+$in = (
+ select
+ *
+ from Input
+ where subkey > '1'
+ order by
+ key desc
+ limit 15000
+);
+
+select
+ *
+from $in
+where value like "a%";
diff --git a/yt/yql/tests/sql/suites/limit/limit_skip_take.sql b/yt/yql/tests/sql/suites/limit/limit_skip_take.sql
new file mode 100644
index 0000000000..d6c63e4d82
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/limit_skip_take.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select value, subkey, key from (select * from plato.Input) order by key, subkey limit 1,2;
diff --git a/yt/yql/tests/sql/suites/limit/many_top_sorts.sql b/yt/yql/tests/sql/suites/limit/many_top_sorts.sql
new file mode 100644
index 0000000000..ee81465874
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/many_top_sorts.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+/* ignore runonopt ast diff */
+/* ignore runonopt plan diff */
+use plato;
+
+$i = (select * from Input where key > "100");
+
+select * from $i order by key limit 1;
+
+select * from $i order by subkey limit 2; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/limit/sort_calc_limit.cfg b/yt/yql/tests/sql/suites/limit/sort_calc_limit.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/sort_calc_limit.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/limit/sort_calc_limit.sql b/yt/yql/tests/sql/suites/limit/sort_calc_limit.sql
new file mode 100644
index 0000000000..62bb39d249
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/sort_calc_limit.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+USE plato;
+
+insert into Output with truncate
+select *
+from Input
+order by key || subkey
+limit 2; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/limit/sorted_desc.txt.attr b/yt/yql/tests/sql/suites/limit/sorted_desc.txt.attr
new file mode 100644
index 0000000000..5a6ca5761e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/sorted_desc.txt.attr
@@ -0,0 +1,47 @@
+{
+ "_yql_row_spec" = {
+ "SortMembers" = [
+ "key"
+ ];
+ "SortDirections" = [
+ 0
+ ];
+ "UniqueKeys" = %false;
+ "SortedByTypes" = [
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ "StrictSchema" = %true;
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ];
+ "SortedBy" = [
+ "_yql_column_0"
+ ]
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/limit/yql-7900_empty_sorted_without_keys.sql b/yt/yql/tests/sql/suites/limit/yql-7900_empty_sorted_without_keys.sql
new file mode 100644
index 0000000000..d61f7e9183
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/yql-7900_empty_sorted_without_keys.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+USE plato;
+
+$cnt = (select count(*) from Input);
+$offset = ($cnt + 10) ?? 0;
+
+$data_limited = (select * from Input order by key || value limit 1 offset $offset);
+
+$result_top = (SELECT subkey, Length(key) as l, key FROM $data_limited);
+
+SELECT * FROM $result_top;
diff --git a/yt/yql/tests/sql/suites/limit/yql-8046_empty_sorted_desc.cfg b/yt/yql/tests/sql/suites/limit/yql-8046_empty_sorted_desc.cfg
new file mode 100644
index 0000000000..2e3eaf9682
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/yql-8046_empty_sorted_desc.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+out Output output.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/limit/yql-8046_empty_sorted_desc.sql b/yt/yql/tests/sql/suites/limit/yql-8046_empty_sorted_desc.sql
new file mode 100644
index 0000000000..6647df9e90
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/yql-8046_empty_sorted_desc.sql
@@ -0,0 +1,45 @@
+/* postgres can not */
+USE plato;
+
+$visitors = (
+SELECT
+ key,
+ subkey,
+ value
+FROM Input
+WHERE subkey != ""
+);
+
+$over_threshold = (
+SELECT
+ key,
+ subkey,
+ value
+FROM $visitors
+WHERE key > "070"
+);
+
+$clean = (SELECT COUNT(*) FROM $over_threshold);
+
+$tail = (
+SELECT
+ key,
+ subkey,
+ value
+FROM $visitors
+ORDER BY key DESC
+LIMIT IF($clean ?? 0 < 2, 2 - $clean ?? 0, 0)
+);
+
+INSERT INTO Output WITH TRUNCATE
+SELECT
+ key,
+ subkey,
+ value
+FROM $over_threshold
+UNION ALL
+SELECT
+ key,
+ subkey,
+ value
+FROM $tail;
diff --git a/yt/yql/tests/sql/suites/limit/yql-8611_calc_peephole.cfg b/yt/yql/tests/sql/suites/limit/yql-8611_calc_peephole.cfg
new file mode 100644
index 0000000000..b3080c2484
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/yql-8611_calc_peephole.cfg
@@ -0,0 +1,6 @@
+in Input input.txt
+out Output0 output0.txt
+out Output1 output1.txt
+out Output2 output2.txt
+out Output3 output3.txt
+udf libyson_udf
diff --git a/yt/yql/tests/sql/suites/limit/yql-8611_calc_peephole.sql b/yt/yql/tests/sql/suites/limit/yql-8611_calc_peephole.sql
new file mode 100644
index 0000000000..aa1546401e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/yql-8611_calc_peephole.sql
@@ -0,0 +1,31 @@
+USE plato;
+
+$tableList = AsList(
+ AsStruct(Yson('{"row_count"=9}') as Attributes, "Input1" as Path, "table" as Type),
+ AsStruct(Yson('{"row_count"=19}') as Attributes, "Input2" as Path, "table" as Type)
+);
+
+-- $bucket_size = 1000000;
+$buckets = ASLIST(0, 1, 2, 3);
+
+$row_count = (
+ SELECT Yson::LookupInt64(Attributes, "row_count")
+ FROM AS_TABLE($tableList)
+ WHERE
+ Type = "table"
+);
+
+$bucket_size = unwrap(CAST($row_count / ListLength($buckets) AS Uint64));
+
+DEFINE ACTION $make_bucket($bucket_number) AS
+ $offset = unwrap(CAST($bucket_number AS UInt8)) * $bucket_size;
+ $dst = "Output" || $bucket_number;
+
+ INSERT INTO $dst (
+ SELECT * FROM Input
+ ORDER BY key
+ LIMIT $bucket_size OFFSET $offset);
+END DEFINE;
+
+EVALUATE FOR $bucket_number IN $buckets
+ DO $make_bucket(CAST($bucket_number AS String));
diff --git a/yt/yql/tests/sql/suites/limit/yql-9617_empty_lambda.sql b/yt/yql/tests/sql/suites/limit/yql-9617_empty_lambda.sql
new file mode 100644
index 0000000000..8d438c5122
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/yql-9617_empty_lambda.sql
@@ -0,0 +1,7 @@
+use plato;
+
+select key, some(value) as value from Input
+where key > "999"
+group by key
+order by key
+limit 10; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/limit/zero_limit.sql b/yt/yql/tests/sql/suites/limit/zero_limit.sql
new file mode 100644
index 0000000000..6532fb3737
--- /dev/null
+++ b/yt/yql/tests/sql/suites/limit/zero_limit.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+use plato;
+
+$x = (select * from Input order by value limit 10);
+
+select * from $x where key > "000" limit coalesce(cast(0.1 * 0 as Uint64), 0);
diff --git a/yt/yql/tests/sql/suites/lineage/default.cfg b/yt/yql/tests/sql/suites/lineage/default.cfg
new file mode 100644
index 0000000000..d818ef972a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/default.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+out Output output.txt
+providers yt
+canonize_lineage \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/lineage/error_type.cfg b/yt/yql/tests/sql/suites/lineage/error_type.cfg
new file mode 100644
index 0000000000..71212661a3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/error_type.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+out Output output.txt
+providers yt
+xfail
+
diff --git a/yt/yql/tests/sql/suites/lineage/error_type.sql b/yt/yql/tests/sql/suites/lineage/error_type.sql
new file mode 100644
index 0000000000..94fea56f9d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/error_type.sql
@@ -0,0 +1,14 @@
+/* custom error:Uncompatible member foo types: Int32 and String*/
+USE plato;
+
+INSERT INTO Output
+SELECT
+ 1 as foo
+FROM Input
+
+UNION ALL
+
+SELECT
+ 'x' as foo
+FROM Input
+
diff --git a/yt/yql/tests/sql/suites/lineage/flatten_by.cfg b/yt/yql/tests/sql/suites/lineage/flatten_by.cfg
new file mode 100644
index 0000000000..ed48d1a300
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/flatten_by.cfg
@@ -0,0 +1 @@
+in Input input_list_2.txt
diff --git a/yt/yql/tests/sql/suites/lineage/flatten_by.sql b/yt/yql/tests/sql/suites/lineage/flatten_by.sql
new file mode 100644
index 0000000000..16bc737177
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/flatten_by.sql
@@ -0,0 +1,21 @@
+use plato;
+
+$subquery1 =
+SELECT
+key, subkey, z
+FROM Input
+FLATTEN LIST BY value as z;
+
+$subquery2 =
+SELECT
+key, subkey, value as z, value2
+FROM Input
+FLATTEN LIST BY (value, value2);
+
+INSERT INTO @tmp1 WITH TRUNCATE
+SELECT *
+FROM $subquery1;
+
+INSERT INTO @tmp2 WITH TRUNCATE
+SELECT *
+FROM $subquery2; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/lineage/flatten_list_nested_lambda.cfg b/yt/yql/tests/sql/suites/lineage/flatten_list_nested_lambda.cfg
new file mode 100644
index 0000000000..0670741477
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/flatten_list_nested_lambda.cfg
@@ -0,0 +1,4 @@
+in Input input_list.txt
+out Output output.txt
+providers yt
+canonize_lineage
diff --git a/yt/yql/tests/sql/suites/lineage/flatten_list_nested_lambda.sql b/yt/yql/tests/sql/suites/lineage/flatten_list_nested_lambda.sql
new file mode 100644
index 0000000000..f534644d0d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/flatten_list_nested_lambda.sql
@@ -0,0 +1,19 @@
+USE plato;
+
+$sub = (
+ select key
+ from Input
+ flatten list by
+ key
+);
+
+insert into Output
+ select
+ value,
+ ListFilter(
+ [value],
+ ($x) -> ($x in $sub)
+ ) as f
+ from Input
+ order by value
+ \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/lineage/flatten_where.sql b/yt/yql/tests/sql/suites/lineage/flatten_where.sql
new file mode 100644
index 0000000000..8f2d499356
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/flatten_where.sql
@@ -0,0 +1,11 @@
+USE plato;
+
+INSERT INTO Output
+SELECT * FROM (
+ SELECT
+ [key, key] as key2,
+ value
+ FROM Input
+ WHERE value > ''
+) FLATTEN LIST BY key2
+
diff --git a/yt/yql/tests/sql/suites/lineage/group_by_asstruct_key.sql b/yt/yql/tests/sql/suites/lineage/group_by_asstruct_key.sql
new file mode 100644
index 0000000000..ea37605e02
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/group_by_asstruct_key.sql
@@ -0,0 +1,10 @@
+INSERT INTO plato.Output
+SELECT * FROM (
+SELECT x FROM (
+SELECT
+ <|a:key,b:value|> as x
+FROM plato.Input
+)
+group by x
+)
+flatten columns
diff --git a/yt/yql/tests/sql/suites/lineage/grouping_sets.cfg b/yt/yql/tests/sql/suites/lineage/grouping_sets.cfg
new file mode 100644
index 0000000000..90436a56f9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/grouping_sets.cfg
@@ -0,0 +1 @@
+in Input input_optional.txt
diff --git a/yt/yql/tests/sql/suites/lineage/grouping_sets.sql b/yt/yql/tests/sql/suites/lineage/grouping_sets.sql
new file mode 100644
index 0000000000..3bece90183
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/grouping_sets.sql
@@ -0,0 +1,17 @@
+USE plato;
+
+$data = select
+ key, subkey, value
+from Input
+group by GROUPING SETS (
+ (key, subkey),
+ (subkey, value)
+ );
+
+INSERT INTO @tmp WITH TRUNCATE
+SELECT
+ b.value
+FROM $data AS a
+LEFT JOIN Input AS b
+USING (key)
+ \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/lineage/if_struct.sql b/yt/yql/tests/sql/suites/lineage/if_struct.sql
new file mode 100644
index 0000000000..c8e9b16f0c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/if_struct.sql
@@ -0,0 +1,4 @@
+insert into plato.Output
+select * from (select IF(key == "foo", CombineMembers(RemoveMembers(LAG(data) OVER w, ["key"]), ChooseMembers(data, ["key"])), data) from
+ (select TableRow() as data, key, value from plato.Input)
+window w as (partition by key)) flatten columns; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/lineage/input.txt.attr b/yt/yql/tests/sql/suites/lineage/input.txt.attr
new file mode 100644
index 0000000000..36b3c00c90
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/input.txt.attr
@@ -0,0 +1,5 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[["key";["DataType";"String";];];["subkey";["DataType";"String";];];["value";["DataType";"String";];];];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/lineage/input_list.txt.attr b/yt/yql/tests/sql/suites/lineage/input_list.txt.attr
new file mode 100644
index 0000000000..01a4a26d00
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/input_list.txt.attr
@@ -0,0 +1,5 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[["key";["ListType";["DataType";"String";];];];["subkey";["DataType";"String";];];["value";["DataType";"String";];];];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/lineage/input_list_2.txt.attr b/yt/yql/tests/sql/suites/lineage/input_list_2.txt.attr
new file mode 100644
index 0000000000..26fc5bf429
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/input_list_2.txt.attr
@@ -0,0 +1,10 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String";];];
+ ["subkey";["DataType";"String";];];
+ ["value";["ListType";["DataType";"String";];];];
+ ["value2";["ListType";["DataType";"String";];];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/lineage/input_optional.txt.attr b/yt/yql/tests/sql/suites/lineage/input_optional.txt.attr
new file mode 100644
index 0000000000..b971d222d4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/input_optional.txt.attr
@@ -0,0 +1,5 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[["key";["OptionalType";["DataType";"String"]]];["subkey";["OptionalType";["DataType";"String"]]];["value";["OptionalType";["DataType";"Int64"];];];];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/lineage/isolated.sql b/yt/yql/tests/sql/suites/lineage/isolated.sql
new file mode 100644
index 0000000000..2bd18612e5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/isolated.sql
@@ -0,0 +1,8 @@
+USE plato;
+
+$one = select dummy from as_table([<|dummy:1|>]);
+
+INSERT INTO Output
+SELECT key FROM Input AS a
+CROSS JOIN $one AS b;
+
diff --git a/yt/yql/tests/sql/suites/lineage/join_as_struct.sql b/yt/yql/tests/sql/suites/lineage/join_as_struct.sql
new file mode 100644
index 0000000000..2bb80fe374
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/join_as_struct.sql
@@ -0,0 +1,15 @@
+INSERT INTO plato.Output
+SELECT * FROM (
+SELECT x,y FROM (
+SELECT
+ key, <|a:key,b:value|> as x
+FROM plato.Input
+) as a
+JOIN (
+SELECT
+ key, <|c:key,d:value|> as y
+FROM plato.Input
+) as b
+ON a.key = b.key
+)
+flatten columns
diff --git a/yt/yql/tests/sql/suites/lineage/list_literal1.sql b/yt/yql/tests/sql/suites/lineage/list_literal1.sql
new file mode 100644
index 0000000000..b839e4526b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/list_literal1.sql
@@ -0,0 +1,8 @@
+USE plato;
+
+$key = select min(key) from Input;
+
+INSERT INTO Output
+SELECT
+$key as key;
+
diff --git a/yt/yql/tests/sql/suites/lineage/list_literal2.sql b/yt/yql/tests/sql/suites/lineage/list_literal2.sql
new file mode 100644
index 0000000000..6fe5bf0773
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/list_literal2.sql
@@ -0,0 +1,10 @@
+USE plato;
+
+$key = select min(key) from Input;
+
+INSERT INTO Output
+SELECT * FROM (
+ SELECT $key as key
+)
+where key > '';
+
diff --git a/yt/yql/tests/sql/suites/lineage/list_literal3.sql b/yt/yql/tests/sql/suites/lineage/list_literal3.sql
new file mode 100644
index 0000000000..6344c18387
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/list_literal3.sql
@@ -0,0 +1,12 @@
+USE plato;
+
+$key = select min(key) from Input;
+$value = select min(value) from Input;
+
+INSERT INTO Output
+SELECT * FROM (
+ SELECT $key as key
+ UNION ALL
+ SELECT $value as val
+)
+
diff --git a/yt/yql/tests/sql/suites/lineage/list_literal4.sql b/yt/yql/tests/sql/suites/lineage/list_literal4.sql
new file mode 100644
index 0000000000..8ab9cafc82
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/list_literal4.sql
@@ -0,0 +1,13 @@
+USE plato;
+
+$key = select min(key) from Input;
+$value = select min(value) from Input;
+
+INSERT INTO Output
+SELECT * FROM (
+ SELECT $key as key
+ UNION ALL
+ SELECT $value as val
+)
+WHERE key > '';
+
diff --git a/yt/yql/tests/sql/suites/lineage/member_over_if_struct.sql b/yt/yql/tests/sql/suites/lineage/member_over_if_struct.sql
new file mode 100644
index 0000000000..ceaf6df9b9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/member_over_if_struct.sql
@@ -0,0 +1,4 @@
+insert into plato.Output
+select * from (select IF(key == "foo", LAG(data) over w, data) from
+ (select TableRow() as data, key, value from plato.Input)
+window w as (partition by key)) flatten columns; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/lineage/nested_lambda_fields.sql b/yt/yql/tests/sql/suites/lineage/nested_lambda_fields.sql
new file mode 100644
index 0000000000..9091bae31e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/nested_lambda_fields.sql
@@ -0,0 +1,18 @@
+USE plato;
+
+$v = ($x) -> {
+ return ListFilter(["a","b"],($y)->($y = $x));
+};
+
+$k = ($x) -> {
+ return $x;
+};
+
+
+insert into Output
+with truncate
+select
+ $k(key) as k,
+ $v(value) as v
+from
+ Input
diff --git a/yt/yql/tests/sql/suites/lineage/process.sql b/yt/yql/tests/sql/suites/lineage/process.sql
new file mode 100644
index 0000000000..a97e7a237c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/process.sql
@@ -0,0 +1,8 @@
+USE plato;
+
+$p = ($s) -> ($s);
+
+INSERT INTO Output
+PROCESS Input
+USING $p(TableRows());
+
diff --git a/yt/yql/tests/sql/suites/lineage/reduce.sql b/yt/yql/tests/sql/suites/lineage/reduce.sql
new file mode 100644
index 0000000000..bc097c26af
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/reduce.sql
@@ -0,0 +1,7 @@
+USE plato;
+
+$r = ($_key, $s) -> ($s);
+
+INSERT INTO Output
+REDUCE Input
+ON key USING $r(TableRow());
diff --git a/yt/yql/tests/sql/suites/lineage/reduce_all.sql b/yt/yql/tests/sql/suites/lineage/reduce_all.sql
new file mode 100644
index 0000000000..aa16229644
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/reduce_all.sql
@@ -0,0 +1,8 @@
+USE plato;
+
+$r = ($s) -> ($s);
+
+INSERT INTO Output
+REDUCE Input
+ON key USING ALL $r(TableRows());
+
diff --git a/yt/yql/tests/sql/suites/lineage/reduce_all_row.sql b/yt/yql/tests/sql/suites/lineage/reduce_all_row.sql
new file mode 100644
index 0000000000..21be7d15ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/reduce_all_row.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+$r = ($s) -> (Yql::FlatMap($s, ($x)->($x.1)));
+
+INSERT INTO Output
+REDUCE Input
+ON key USING ALL $r(TableRow());
+
+
diff --git a/yt/yql/tests/sql/suites/lineage/scalar_context.cfg b/yt/yql/tests/sql/suites/lineage/scalar_context.cfg
new file mode 100644
index 0000000000..0670741477
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/scalar_context.cfg
@@ -0,0 +1,4 @@
+in Input input_list.txt
+out Output output.txt
+providers yt
+canonize_lineage
diff --git a/yt/yql/tests/sql/suites/lineage/scalar_context.sql b/yt/yql/tests/sql/suites/lineage/scalar_context.sql
new file mode 100644
index 0000000000..ef0f4d18f5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/scalar_context.sql
@@ -0,0 +1,12 @@
+USE plato;
+
+$sub = (
+ select key
+ from Input where value = 'abc'
+);
+
+insert into Output
+ select
+ value, $sub as s
+ from Input
+ order by value
diff --git a/yt/yql/tests/sql/suites/lineage/select_all.sql b/yt/yql/tests/sql/suites/lineage/select_all.sql
new file mode 100644
index 0000000000..e83b513cf5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/select_all.sql
@@ -0,0 +1,3 @@
+insert into plato.Output
+select * from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/lineage/select_all_filter.sql b/yt/yql/tests/sql/suites/lineage/select_all_filter.sql
new file mode 100644
index 0000000000..660930df9c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/select_all_filter.sql
@@ -0,0 +1,4 @@
+insert into plato.Output
+select * from plato.Input
+where key > ''
+
diff --git a/yt/yql/tests/sql/suites/lineage/select_field.sql b/yt/yql/tests/sql/suites/lineage/select_field.sql
new file mode 100644
index 0000000000..af706633d9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/select_field.sql
@@ -0,0 +1,3 @@
+insert into plato.Output
+select key from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/lineage/select_field_filter.sql b/yt/yql/tests/sql/suites/lineage/select_field_filter.sql
new file mode 100644
index 0000000000..f07279fd60
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/select_field_filter.sql
@@ -0,0 +1,4 @@
+insert into plato.Output
+select key from plato.Input
+where key > ''
+
diff --git a/yt/yql/tests/sql/suites/lineage/select_field_limit_offset.sql b/yt/yql/tests/sql/suites/lineage/select_field_limit_offset.sql
new file mode 100644
index 0000000000..2d4e4d2d89
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/select_field_limit_offset.sql
@@ -0,0 +1,6 @@
+insert into plato.Output
+select key from plato.Input
+order by key
+limit 4 offset 1;
+
+
diff --git a/yt/yql/tests/sql/suites/lineage/select_field_order_by.sql b/yt/yql/tests/sql/suites/lineage/select_field_order_by.sql
new file mode 100644
index 0000000000..6168ad6662
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/select_field_order_by.sql
@@ -0,0 +1,4 @@
+insert into plato.Output
+select key, value from plato.Input
+order by key;
+
diff --git a/yt/yql/tests/sql/suites/lineage/select_field_rename.sql b/yt/yql/tests/sql/suites/lineage/select_field_rename.sql
new file mode 100644
index 0000000000..deebad403e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/select_field_rename.sql
@@ -0,0 +1,3 @@
+insert into plato.Output
+select key as key2 from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/lineage/select_group_by_all.sql b/yt/yql/tests/sql/suites/lineage/select_group_by_all.sql
new file mode 100644
index 0000000000..f0d0e6abd1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/select_group_by_all.sql
@@ -0,0 +1,3 @@
+insert into plato.Output
+select count(*), min(value) from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/lineage/select_group_by_key.sql b/yt/yql/tests/sql/suites/lineage/select_group_by_key.sql
new file mode 100644
index 0000000000..1c9e4b383d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/select_group_by_key.sql
@@ -0,0 +1,3 @@
+insert into plato.Output
+select key, count(*), min(value) from plato.Input group by key order by key;
+
diff --git a/yt/yql/tests/sql/suites/lineage/select_join.sql b/yt/yql/tests/sql/suites/lineage/select_join.sql
new file mode 100644
index 0000000000..fce7a756e2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/select_join.sql
@@ -0,0 +1,5 @@
+insert into plato.Output
+select a.key as x, b.value as y from plato.Input as a
+join plato.Input as b on a.key = b.key
+order by x;
+
diff --git a/yt/yql/tests/sql/suites/lineage/select_mix_fields.sql b/yt/yql/tests/sql/suites/lineage/select_mix_fields.sql
new file mode 100644
index 0000000000..61033e1f87
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/select_mix_fields.sql
@@ -0,0 +1,3 @@
+insert into plato.Output
+select key || value from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/lineage/select_nested_table_row.sql b/yt/yql/tests/sql/suites/lineage/select_nested_table_row.sql
new file mode 100644
index 0000000000..adcc6c3619
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/select_nested_table_row.sql
@@ -0,0 +1,3 @@
+insert into plato.Output
+select StablePickle(TableRow()) from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/lineage/select_table_row.sql b/yt/yql/tests/sql/suites/lineage/select_table_row.sql
new file mode 100644
index 0000000000..ca19dafd36
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/select_table_row.sql
@@ -0,0 +1,3 @@
+insert into plato.Output
+select TableRow() from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/lineage/select_union_all.sql b/yt/yql/tests/sql/suites/lineage/select_union_all.sql
new file mode 100644
index 0000000000..24a56b8454
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/select_union_all.sql
@@ -0,0 +1,5 @@
+insert into plato.Output
+select key as x from plato.Input
+union all
+select value as x from plato.Input;
+
diff --git a/yt/yql/tests/sql/suites/lineage/some_tablerow.sql b/yt/yql/tests/sql/suites/lineage/some_tablerow.sql
new file mode 100644
index 0000000000..6edbc01dce
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/some_tablerow.sql
@@ -0,0 +1,6 @@
+INSERT INTO plato.Output
+SELECT * FROM (
+SELECT
+ some(TableRow())
+FROM plato.Input)
+flatten columns
diff --git a/yt/yql/tests/sql/suites/lineage/topsort.sql b/yt/yql/tests/sql/suites/lineage/topsort.sql
new file mode 100644
index 0000000000..2289cb02b1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/topsort.sql
@@ -0,0 +1,8 @@
+USE plato;
+
+INSERT INTO Output
+SELECT a.value
+FROM Input AS a
+INNER JOIN (SELECT value FROM Input ORDER BY value LIMIT 1) AS b
+USING (value);
+
diff --git a/yt/yql/tests/sql/suites/lineage/union_all_tablerow.sql b/yt/yql/tests/sql/suites/lineage/union_all_tablerow.sql
new file mode 100644
index 0000000000..c2d3407e9e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/union_all_tablerow.sql
@@ -0,0 +1,11 @@
+INSERT INTO plato.Output
+SELECT * FROM (
+SELECT
+ TableRow() as x
+FROM plato.Input
+UNION ALL
+SELECT
+ 1 as y
+FROM plato.Input
+)
+flatten columns
diff --git a/yt/yql/tests/sql/suites/lineage/unordered_subquery.sql b/yt/yql/tests/sql/suites/lineage/unordered_subquery.sql
new file mode 100644
index 0000000000..d7b657468d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/unordered_subquery.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+define subquery $f() as
+ SELECT * FROM Input
+end define;
+
+insert into Output with truncate
+ select * from $f()
+
diff --git a/yt/yql/tests/sql/suites/lineage/window_asstruct.sql b/yt/yql/tests/sql/suites/lineage/window_asstruct.sql
new file mode 100644
index 0000000000..3a65047285
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/window_asstruct.sql
@@ -0,0 +1,6 @@
+INSERT INTO plato.Output
+SELECT * FROM (
+SELECT
+ lead(<|a:key,b:value|>) over ()
+FROM plato.Input)
+flatten columns
diff --git a/yt/yql/tests/sql/suites/lineage/window_many.sql b/yt/yql/tests/sql/suites/lineage/window_many.sql
new file mode 100644
index 0000000000..5fe93a4226
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/window_many.sql
@@ -0,0 +1,4 @@
+insert into plato.Output
+select key, row_number() over w1, lag(value) over w1, lead(value) over w1,
+ rank(value) over w2, dense_rank(value) over w2
+ from plato.Input window w1 as (order by key), w2 as (order by key desc) \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/lineage/window_member_struct.sql b/yt/yql/tests/sql/suites/lineage/window_member_struct.sql
new file mode 100644
index 0000000000..ff33cb8542
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/window_member_struct.sql
@@ -0,0 +1,4 @@
+insert into plato.Output WITH TRUNCATE
+select * from (select lag(data) over w from
+ (select TableRow() as data, key from plato.Input)
+window w as (partition by key)) flatten columns;
diff --git a/yt/yql/tests/sql/suites/lineage/window_one.sql b/yt/yql/tests/sql/suites/lineage/window_one.sql
new file mode 100644
index 0000000000..6bd40dc505
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/window_one.sql
@@ -0,0 +1,2 @@
+insert into plato.Output
+select key, row_number() over () from plato.Input \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/lineage/window_session.sql b/yt/yql/tests/sql/suites/lineage/window_session.sql
new file mode 100644
index 0000000000..74ba0f70d1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/window_session.sql
@@ -0,0 +1,4 @@
+insert into plato.Output
+select key, row_number() over w as r, session_start() over w as s from plato.Input
+window w AS (PARTITION BY key, SessionWindow(cast(subkey as Datetime), DateTime::IntervalFromMinutes(15)));
+
diff --git a/yt/yql/tests/sql/suites/lineage/window_tablerow.sql b/yt/yql/tests/sql/suites/lineage/window_tablerow.sql
new file mode 100644
index 0000000000..e96be1ecfb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/window_tablerow.sql
@@ -0,0 +1,6 @@
+INSERT INTO plato.Output
+SELECT * FROM (
+SELECT
+ lead(TableRow()) over ()
+FROM plato.Input)
+flatten columns
diff --git a/yt/yql/tests/sql/suites/lineage/with_inline.sql b/yt/yql/tests/sql/suites/lineage/with_inline.sql
new file mode 100644
index 0000000000..2c98d76f82
--- /dev/null
+++ b/yt/yql/tests/sql/suites/lineage/with_inline.sql
@@ -0,0 +1,8 @@
+USE plato;
+
+INSERT INTO Output
+SELECT
+key as key,
+"" as subkey,
+"value:" || value as value
+FROM Input WITH INLINE
diff --git a/yt/yql/tests/sql/suites/optimizers/aggregate_over_aggregate.cfg b/yt/yql/tests/sql/suites/optimizers/aggregate_over_aggregate.cfg
new file mode 100644
index 0000000000..0474ee88ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/aggregate_over_aggregate.cfg
@@ -0,0 +1,2 @@
+in Input input3.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/aggregate_over_aggregate.sql b/yt/yql/tests/sql/suites/optimizers/aggregate_over_aggregate.sql
new file mode 100644
index 0000000000..39306eb32a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/aggregate_over_aggregate.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+
+use plato;
+
+select distinct * from Input group by value, subkey, key order by subkey;
diff --git a/yt/yql/tests/sql/suites/optimizers/combinebykey_fields_subset.cfg b/yt/yql/tests/sql/suites/optimizers/combinebykey_fields_subset.cfg
new file mode 100644
index 0000000000..3f5bebb5a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/combinebykey_fields_subset.cfg
@@ -0,0 +1,2 @@
+in Input sorted.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/combinebykey_fields_subset.sql b/yt/yql/tests/sql/suites/optimizers/combinebykey_fields_subset.sql
new file mode 100644
index 0000000000..6ed4e0ed36
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/combinebykey_fields_subset.sql
@@ -0,0 +1,3 @@
+SELECT count(DISTINCT subkey) AS subkey
+FROM plato.Input
+WHERE (key == "075" OR key == "150");
diff --git a/yt/yql/tests/sql/suites/optimizers/combinebykey_fields_subset_range.cfg b/yt/yql/tests/sql/suites/optimizers/combinebykey_fields_subset_range.cfg
new file mode 100644
index 0000000000..f2bc0f7ec7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/combinebykey_fields_subset_range.cfg
@@ -0,0 +1,3 @@
+in Input0 sorted.txt
+in Input1 sorted.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/combinebykey_fields_subset_range.sql b/yt/yql/tests/sql/suites/optimizers/combinebykey_fields_subset_range.sql
new file mode 100644
index 0000000000..3acd90202b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/combinebykey_fields_subset_range.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+
+SELECT count(DISTINCT subkey) AS subkey
+FROM plato.CONCAT(Input0, Input1)
+WHERE (key == "075" OR key == "150");
diff --git a/yt/yql/tests/sql/suites/optimizers/default.cfg b/yt/yql/tests/sql/suites/optimizers/default.cfg
new file mode 100644
index 0000000000..9b1614d4c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/default.cfg
@@ -0,0 +1,3 @@
+in Input0 input0.txt
+in Input1 input1.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/direct_row_after_merge.cfg b/yt/yql/tests/sql/suites/optimizers/direct_row_after_merge.cfg
new file mode 100644
index 0000000000..3712d0f1ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/direct_row_after_merge.cfg
@@ -0,0 +1,3 @@
+in Input1 sorted.txt
+in Input2 sorted.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/direct_row_after_merge.sql b/yt/yql/tests/sql/suites/optimizers/direct_row_after_merge.sql
new file mode 100644
index 0000000000..cde00141a3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/direct_row_after_merge.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+USE plato;
+
+SELECT
+ key,
+ TablePath() as path
+FROM concat(Input1, Input2)
+order by key, path; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/field_subset_for_multiusage.cfg b/yt/yql/tests/sql/suites/optimizers/field_subset_for_multiusage.cfg
new file mode 100644
index 0000000000..670afdcdfa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/field_subset_for_multiusage.cfg
@@ -0,0 +1,3 @@
+in Input1 input3.txt
+in Input2 input_other.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/field_subset_for_multiusage.sql b/yt/yql/tests/sql/suites/optimizers/field_subset_for_multiusage.sql
new file mode 100644
index 0000000000..3a568de9ae
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/field_subset_for_multiusage.sql
@@ -0,0 +1,15 @@
+use plato;
+
+select
+ key,
+ count(1) as cnt,
+ sum(cast(subkey as int32)) as sm
+from concat(Input1, Input2)
+where subkey in ("1", "2", "3", "4")
+group by key
+order by sm desc;
+
+select
+ count(1) as cnt,
+ sum(cast(subkey as int32)) as sm
+from concat(Input1, Input2);
diff --git a/yt/yql/tests/sql/suites/optimizers/flatmap_with_non_struct_out.cfg b/yt/yql/tests/sql/suites/optimizers/flatmap_with_non_struct_out.cfg
new file mode 100644
index 0000000000..86ef4956fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/flatmap_with_non_struct_out.cfg
@@ -0,0 +1,3 @@
+in Input input3.txt
+res result.txt
+providers yt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/flatmap_with_non_struct_out.sql b/yt/yql/tests/sql/suites/optimizers/flatmap_with_non_struct_out.sql
new file mode 100644
index 0000000000..4a99afbccf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/flatmap_with_non_struct_out.sql
@@ -0,0 +1,6 @@
+USE plato;
+
+$lst = process Input;
+$dict = ToDict(ListMap($lst,($x)->(($x.key, $x.subkey))));
+
+SELECT DictLength($dict); \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/group_visit_lambdas.cfg b/yt/yql/tests/sql/suites/optimizers/group_visit_lambdas.cfg
new file mode 100644
index 0000000000..de847dcf33
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/group_visit_lambdas.cfg
@@ -0,0 +1,6 @@
+in Input1 input3.txt
+in Input2 input3.txt
+in Input3 input3.txt
+in Input4 opt_key.txt
+in Input5 opt_key.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/group_visit_lambdas.sql b/yt/yql/tests/sql/suites/optimizers/group_visit_lambdas.sql
new file mode 100644
index 0000000000..f5e2aab6e5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/group_visit_lambdas.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+
+USE plato;
+
+select
+ key,
+ subkey,
+ value,
+ TablePath() as path
+from
+ range("", "Input1", "Input5")
+where key != ""
+order by key, subkey, path; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/input1.txt.attr b/yt/yql/tests/sql/suites/optimizers/input1.txt.attr
new file mode 100644
index 0000000000..ffb9a19cab
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/input1.txt.attr
@@ -0,0 +1,42 @@
+{
+ "_yql_row_spec" = {
+ "UniqueKeys"=%true;
+ "SortMembers"=["Group"; "Name"];
+ "SortedBy"=["Group"; "Name"];
+ "SortDirections"=[1; 1];
+ "SortedByTypes"=[["DataType";"Uint64"]; ["DataType";"String"]];
+ "Type" = [
+ "StructType";
+ [
+ [
+ "Group";
+ [
+ "DataType";
+ "Uint64"
+ ]
+ ];
+ [
+ "Name";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "Amount";
+ [
+ "DataType";
+ "Int64"
+ ]
+ ];
+ [
+ "Comment";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/input3.txt.attr b/yt/yql/tests/sql/suites/optimizers/input3.txt.attr
new file mode 100644
index 0000000000..b6100e5fd0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/input3.txt.attr
@@ -0,0 +1,30 @@
+{
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/input4.txt.attr b/yt/yql/tests/sql/suites/optimizers/input4.txt.attr
new file mode 100644
index 0000000000..9678beab02
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/input4.txt.attr
@@ -0,0 +1,10 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["info";["DataType";"String"]];
+ ]];
+ "SortDirections"=[1;];
+ "SortedBy"=["key"];
+ "SortedByTypes"=[["DataType";"String";]];
+ "SortMembers"=["key"];
+}}
diff --git a/yt/yql/tests/sql/suites/optimizers/input5.txt.attr b/yt/yql/tests/sql/suites/optimizers/input5.txt.attr
new file mode 100644
index 0000000000..ed13e20223
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/input5.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/optimizers/input_other.txt.attr b/yt/yql/tests/sql/suites/optimizers/input_other.txt.attr
new file mode 100644
index 0000000000..9d84682ce5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/input_other.txt.attr
@@ -0,0 +1,8 @@
+{
+ "_read_schema" =
+ <"strict" = "false";>
+ [
+ {"name"="key"; "type"="string"};
+ {"name"="subkey"; "type"="string"};
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/optimizers/input_view.txt.attr b/yt/yql/tests/sql/suites/optimizers/input_view.txt.attr
new file mode 100644
index 0000000000..41ea51e276
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/input_view.txt.attr
@@ -0,0 +1,4 @@
+{
+ "_yql_type"="view";
+ "type"="document";
+}
diff --git a/yt/yql/tests/sql/suites/optimizers/length_over_merge.cfg b/yt/yql/tests/sql/suites/optimizers/length_over_merge.cfg
new file mode 100644
index 0000000000..0474ee88ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/length_over_merge.cfg
@@ -0,0 +1,2 @@
+in Input input3.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/length_over_merge.sql b/yt/yql/tests/sql/suites/optimizers/length_over_merge.sql
new file mode 100644
index 0000000000..b102fdee47
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/length_over_merge.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+use plato;
+
+$input = (select key, key || subkey as subkey, value from Input);
+
+$total_count = (select count(1) from $input);
+
+$filtered = (select * from $input where key in ("023", "037", "075"));
+
+$filtered_cnt = (select count(1) from $filtered);
+
+select $filtered_cnt / cast($total_count as Double) as cnt;
diff --git a/yt/yql/tests/sql/suites/optimizers/length_over_merge_fs_multiusage.cfg b/yt/yql/tests/sql/suites/optimizers/length_over_merge_fs_multiusage.cfg
new file mode 100644
index 0000000000..0474ee88ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/length_over_merge_fs_multiusage.cfg
@@ -0,0 +1,2 @@
+in Input input3.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/length_over_merge_fs_multiusage.sql b/yt/yql/tests/sql/suites/optimizers/length_over_merge_fs_multiusage.sql
new file mode 100644
index 0000000000..ff060f1ab3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/length_over_merge_fs_multiusage.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+pragma config.flags("OptimizerFlags", "FieldSubsetEnableMultiusage");
+
+use plato;
+
+$input = (select key, key || subkey as subkey, value from Input);
+
+$total_count = (select count(1) from $input);
+
+$filtered = (select * from $input where key in ("023", "037", "075"));
+
+$filtered_cnt = (select count(1) from $filtered);
+
+select $filtered_cnt / cast($total_count as Double) as cnt;
diff --git a/yt/yql/tests/sql/suites/optimizers/multi_to_empty_constraint.cfg b/yt/yql/tests/sql/suites/optimizers/multi_to_empty_constraint.cfg
new file mode 100644
index 0000000000..0474ee88ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/multi_to_empty_constraint.cfg
@@ -0,0 +1,2 @@
+in Input input3.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/multi_to_empty_constraint.sql b/yt/yql/tests/sql/suites/optimizers/multi_to_empty_constraint.sql
new file mode 100644
index 0000000000..d66d589ab8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/multi_to_empty_constraint.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+
+USE plato;
+
+select key, some(subkey) from (select * from Input where key > "010" and value in []) group by key
+union all
+select key, some(subkey) from (select * from Input where key > "020" and value in []) group by key
+;
diff --git a/yt/yql/tests/sql/suites/optimizers/nonselected_direct_row.cfg b/yt/yql/tests/sql/suites/optimizers/nonselected_direct_row.cfg
new file mode 100644
index 0000000000..a6e1f32b6e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/nonselected_direct_row.cfg
@@ -0,0 +1,3 @@
+in Input1 input3.txt
+in Input2 input3.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/nonselected_direct_row.sql b/yt/yql/tests/sql/suites/optimizers/nonselected_direct_row.sql
new file mode 100644
index 0000000000..c0e6c1c34a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/nonselected_direct_row.sql
@@ -0,0 +1,8 @@
+use plato;
+
+select key, subkey, value
+from (
+ select TablePath() as tbl, key, subkey, value
+ from concat(Input1, Input2)
+)
+where tbl = "Input" and value != "";
diff --git a/yt/yql/tests/sql/suites/optimizers/opt_key.txt.attr b/yt/yql/tests/sql/suites/optimizers/opt_key.txt.attr
new file mode 100644
index 0000000000..72a3e1401c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/opt_key.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";[OptionalType;["DataType";"String"]]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/optimizers/passthrough_sortness_over_map.sql b/yt/yql/tests/sql/suites/optimizers/passthrough_sortness_over_map.sql
new file mode 100644
index 0000000000..0c6b58a563
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/passthrough_sortness_over_map.sql
@@ -0,0 +1,31 @@
+/* postgres can not */
+/* kikimr can not - anon tables */
+USE plato;
+
+INSERT INTO @a
+SELECT
+ *
+FROM Input0
+ORDER BY key, subkey;
+
+commit;
+
+INSERT INTO @c
+SELECT * FROM @a
+WHERE key < "100"
+ORDER BY key, subkey;
+
+INSERT INTO @d
+SELECT
+ key as key,
+ "" as subkey,
+ "value:" || value as value
+FROM @a
+WHERE key < "100"
+ORDER BY key;
+
+commit;
+
+select * from @c;
+
+select * from @d;
diff --git a/yt/yql/tests/sql/suites/optimizers/pushdown_nonsep_over_aggregate.cfg b/yt/yql/tests/sql/suites/optimizers/pushdown_nonsep_over_aggregate.cfg
new file mode 100644
index 0000000000..f3472752d8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/pushdown_nonsep_over_aggregate.cfg
@@ -0,0 +1,3 @@
+in Input input5.txt
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/optimizers/pushdown_nonsep_over_aggregate.sql b/yt/yql/tests/sql/suites/optimizers/pushdown_nonsep_over_aggregate.sql
new file mode 100644
index 0000000000..b3469e9a3b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/pushdown_nonsep_over_aggregate.sql
@@ -0,0 +1,12 @@
+USE plato;
+
+pragma config.flags("OptimizerFlags", "PushdownComplexFiltersOverAggregate");
+
+SELECT * FROM (
+ SELECT
+ key as key,
+ min(value) as mv
+ FROM Input
+ GROUP BY key
+)
+WHERE AssumeNonStrict(200 > 100) and (2000 > 1000) and key != "911" and (key < "150" and mv != "ddd" or key > "200");
diff --git a/yt/yql/tests/sql/suites/optimizers/reduce_with_aux_sort_column.cfg b/yt/yql/tests/sql/suites/optimizers/reduce_with_aux_sort_column.cfg
new file mode 100644
index 0000000000..66737248b8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/reduce_with_aux_sort_column.cfg
@@ -0,0 +1,2 @@
+in Input sorted.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/reduce_with_aux_sort_column.sql b/yt/yql/tests/sql/suites/optimizers/reduce_with_aux_sort_column.sql
new file mode 100644
index 0000000000..8cb88e34ff
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/reduce_with_aux_sort_column.sql
@@ -0,0 +1,12 @@
+use plato;
+pragma yt.JoinMergeTablesLimit="10";
+
+$i = select a.key as key, a.subkey as subkey, b.value as value
+ from Input as a
+ inner join Input as b
+ using(key, subkey)
+assume order by key,subkey;
+
+insert into Output
+select AsTuple(key, subkey) as k, value || "a" as v from $i
+assume order by k;
diff --git a/yt/yql/tests/sql/suites/optimizers/simplified_path_constraint.cfg b/yt/yql/tests/sql/suites/optimizers/simplified_path_constraint.cfg
new file mode 100644
index 0000000000..5e9b7f4e38
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/simplified_path_constraint.cfg
@@ -0,0 +1,2 @@
+in Input sorted.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/optimizers/simplified_path_constraint.sql b/yt/yql/tests/sql/suites/optimizers/simplified_path_constraint.sql
new file mode 100644
index 0000000000..f943ecffe0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/simplified_path_constraint.sql
@@ -0,0 +1,11 @@
+USE plato;
+
+$i = select
+ key,
+ AsTuple(key, subkey) as t,
+ "value:" || value as value
+from Input;
+
+select distinct t from $i order by t;
+
+select * from $i where key == "020";
diff --git a/yt/yql/tests/sql/suites/optimizers/sort_by_nonstrict_const.cfg b/yt/yql/tests/sql/suites/optimizers/sort_by_nonstrict_const.cfg
new file mode 100644
index 0000000000..95d7627826
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/sort_by_nonstrict_const.cfg
@@ -0,0 +1,3 @@
+in Input input0.txt
+providers yt
+xfail
diff --git a/yt/yql/tests/sql/suites/optimizers/sort_by_nonstrict_const.sql b/yt/yql/tests/sql/suites/optimizers/sort_by_nonstrict_const.sql
new file mode 100644
index 0000000000..cd682fe33f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/sort_by_nonstrict_const.sql
@@ -0,0 +1,5 @@
+/* yt can not */
+/* custom error:Member not found: date*/
+use plato;
+
+select * from Input order by date, double;
diff --git a/yt/yql/tests/sql/suites/optimizers/sort_constraint_in_left.cfg b/yt/yql/tests/sql/suites/optimizers/sort_constraint_in_left.cfg
new file mode 100644
index 0000000000..3f5bebb5a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/sort_constraint_in_left.cfg
@@ -0,0 +1,2 @@
+in Input sorted.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/sort_constraint_in_left.sql b/yt/yql/tests/sql/suites/optimizers/sort_constraint_in_left.sql
new file mode 100644
index 0000000000..e1262ecbeb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/sort_constraint_in_left.sql
@@ -0,0 +1,19 @@
+/* postgres can not */
+
+USE plato;
+
+$input_table = (SELECT * FROM Input);
+
+SELECT * FROM (
+ SELECT 'total' AS key,
+ COUNT(*) AS count
+ FROM $input_table
+ WHERE key != "1"
+ UNION ALL
+ SELECT key,
+ COUNT(*) AS count
+ FROM $input_table
+ WHERE key != "1"
+ GROUP BY key
+)
+ORDER BY key, count;
diff --git a/yt/yql/tests/sql/suites/optimizers/sort_over_sorted_prefix_keys.sql b/yt/yql/tests/sql/suites/optimizers/sort_over_sorted_prefix_keys.sql
new file mode 100644
index 0000000000..6a1e4d9aab
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/sort_over_sorted_prefix_keys.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+/* kikimr can not - anon tables */
+USE plato;
+
+insert into @a
+SELECT
+ *
+FROM Input0
+ORDER BY key ASC, subkey ASC;
+
+commit;
+
+select * from @a
+ORDER BY key ASC;
diff --git a/yt/yql/tests/sql/suites/optimizers/sort_over_sorted_same_keys.sql b/yt/yql/tests/sql/suites/optimizers/sort_over_sorted_same_keys.sql
new file mode 100644
index 0000000000..d744ef5418
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/sort_over_sorted_same_keys.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+/* kikimr can not - anon tables */
+USE plato;
+
+insert into @a
+SELECT
+ *
+FROM Input0
+ORDER BY key ASC, subkey ASC;
+
+commit;
+
+select * from @a
+ORDER BY key ASC, subkey ASC;
diff --git a/yt/yql/tests/sql/suites/optimizers/sorted.txt.attr b/yt/yql/tests/sql/suites/optimizers/sorted.txt.attr
new file mode 100644
index 0000000000..36f279e4a0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/sorted.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/optimizers/sorted_desc.txt.attr b/yt/yql/tests/sql/suites/optimizers/sorted_desc.txt.attr
new file mode 100644
index 0000000000..5a6ca5761e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/sorted_desc.txt.attr
@@ -0,0 +1,47 @@
+{
+ "_yql_row_spec" = {
+ "SortMembers" = [
+ "key"
+ ];
+ "SortDirections" = [
+ 0
+ ];
+ "UniqueKeys" = %false;
+ "SortedByTypes" = [
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ "StrictSchema" = %true;
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ];
+ "SortedBy" = [
+ "_yql_column_0"
+ ]
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/sorted_scalar_content.cfg b/yt/yql/tests/sql/suites/optimizers/sorted_scalar_content.cfg
new file mode 100644
index 0000000000..ac3bc7d1d3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/sorted_scalar_content.cfg
@@ -0,0 +1,3 @@
+in Input sorted.txt
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/optimizers/sorted_scalar_content.sql b/yt/yql/tests/sql/suites/optimizers/sorted_scalar_content.sql
new file mode 100644
index 0000000000..df6d3131d7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/sorted_scalar_content.sql
@@ -0,0 +1,13 @@
+use plato;
+
+$ou = select * from Input;
+
+$a = select key from $ou where key > '0';
+
+insert into @a
+select * from $a order by key;
+
+select * from $ou
+where subkey > "0"
+ and key != $a
+order by key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/sorted_sql_in.cfg b/yt/yql/tests/sql/suites/optimizers/sorted_sql_in.cfg
new file mode 100644
index 0000000000..ac3bc7d1d3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/sorted_sql_in.cfg
@@ -0,0 +1,3 @@
+in Input sorted.txt
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/optimizers/sorted_sql_in.sql b/yt/yql/tests/sql/suites/optimizers/sorted_sql_in.sql
new file mode 100644
index 0000000000..c0debae4be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/sorted_sql_in.sql
@@ -0,0 +1,13 @@
+use plato;
+
+$ou = select * from Input;
+
+$a = select * from $ou where key > '0';
+
+insert into @a
+select * from $a order by key;
+
+select * from $ou
+where subkey > "0"
+ and key not in compact (select key from $a)
+order by key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/test_fuse_map_predicate_limit.sql b/yt/yql/tests/sql/suites/optimizers/test_fuse_map_predicate_limit.sql
new file mode 100644
index 0000000000..f7a96e9e48
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/test_fuse_map_predicate_limit.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+
+$data = (
+ SELECT key AS Key, YQL::Substring(key, 1, 1) AS Category FROM plato.Input0 WHERE length(key) > 2 LIMIT 20
+);
+
+SELECT
+ Category,
+ COUNT(*)
+FROM $data
+GROUP BY Category
+ORDER BY Category ASC; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/test_fuse_map_take.sql b/yt/yql/tests/sql/suites/optimizers/test_fuse_map_take.sql
new file mode 100644
index 0000000000..eeb0cfcf24
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/test_fuse_map_take.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+$data = (
+ SELECT key AS Name, value AS Value FROM plato.Input0
+);
+
+$filtered = (
+ SELECT * FROM $data WHERE Name != "BadName" LIMIT 10
+);
+
+SELECT Name, Avg(Length(Value)) AS Len FROM $filtered GROUP BY Name ORDER BY Name;
diff --git a/yt/yql/tests/sql/suites/optimizers/test_lmap_opts.cfg b/yt/yql/tests/sql/suites/optimizers/test_lmap_opts.cfg
new file mode 100644
index 0000000000..1aff987614
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/test_lmap_opts.cfg
@@ -0,0 +1,5 @@
+in Input0 input0.txt
+udf streaming_udf
+udf python2_udf
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/optimizers/test_lmap_opts.sql b/yt/yql/tests/sql/suites/optimizers/test_lmap_opts.sql
new file mode 100644
index 0000000000..90c0f8a2a7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/test_lmap_opts.sql
@@ -0,0 +1,47 @@
+/* syntax version 1 */
+-- not supported on windows
+/* postgres can not */
+$udfScript = @@
+
+import collections;
+
+def processRows(prefix, rowList, separator):
+ ResultRow = collections.namedtuple("ResultRow", ["Result"]);
+
+ result = [];
+ for row in rowList:
+ resultValue = prefix + row.Name + separator + row.Value;
+ resultItem = ResultRow(Result=resultValue);
+ result.append(resultItem);
+
+ return result;
+@@;
+
+$udf = Python::processRows(
+ Callable<(String, List<Struct<Name:String, Value:String>>, String)->List<Struct<Result:String>>>,
+ $udfScript
+);
+
+$data = (
+ SELECT key AS Name, value AS Value FROM plato.Input0
+);
+
+$prefix = ">>";
+
+$p1 = (
+ PROCESS $data USING $udf($prefix, TableRows(), "=") WHERE Name != "foo"
+);
+
+$p2 = (
+ SELECT Result AS Data FROM $p1
+);
+
+$p3 = (
+ PROCESS $p2 USING Streaming::Process(TableRows(), "grep", AsList("180"))
+);
+
+$p4 = (
+ SELECT Data AS FinalResult FROM $p3
+);
+
+SELECT Avg(Length(FinalResult)) AS AvgResultLength FROM $p4;
diff --git a/yt/yql/tests/sql/suites/optimizers/test_no_aggregate_split.cfg b/yt/yql/tests/sql/suites/optimizers/test_no_aggregate_split.cfg
new file mode 100644
index 0000000000..8ca23afed0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/test_no_aggregate_split.cfg
@@ -0,0 +1,2 @@
+in Input1 input1.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/test_no_aggregate_split.sql b/yt/yql/tests/sql/suites/optimizers/test_no_aggregate_split.sql
new file mode 100644
index 0000000000..a5baec070e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/test_no_aggregate_split.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+
+$aggregated = (
+ SELECT Group, Name, SUM(Amount) AS TotalAmount
+ FROM plato.Input1
+ GROUP BY Group, Name
+);
+
+SELECT t.Comment, a.TotalAmount
+FROM plato.Input1 AS t
+INNER JOIN $aggregated AS a
+ON t.Group == a.Group AND t.Name == a.Name
+ORDER BY t.Comment, a.TotalAmount;
+
+SELECT TotalAmount FROM $aggregated ORDER BY TotalAmount;
diff --git a/yt/yql/tests/sql/suites/optimizers/unused_columns_group.cfg b/yt/yql/tests/sql/suites/optimizers/unused_columns_group.cfg
new file mode 100644
index 0000000000..93653023e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/unused_columns_group.cfg
@@ -0,0 +1,2 @@
+in Input unused_columns_window.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/unused_columns_group.sql b/yt/yql/tests/sql/suites/optimizers/unused_columns_group.sql
new file mode 100644
index 0000000000..0fb9467dc7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/unused_columns_group.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+select a,bb from (
+select a,count(distinct b) as bb,max(c) as cc,median(c) as cc1,percentile(c,0.8) as cc2 from (
+select a,b,cast(c as int32) as c,d from Input
+)
+group by a
+)
+order by a \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/unused_columns_group_one_of_multi.cfg b/yt/yql/tests/sql/suites/optimizers/unused_columns_group_one_of_multi.cfg
new file mode 100644
index 0000000000..2b2bac89e3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/unused_columns_group_one_of_multi.cfg
@@ -0,0 +1,3 @@
+in Input unused_columns_window.txt
+udf stat_udf
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/unused_columns_group_one_of_multi.sql b/yt/yql/tests/sql/suites/optimizers/unused_columns_group_one_of_multi.sql
new file mode 100644
index 0000000000..eac1ef2643
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/unused_columns_group_one_of_multi.sql
@@ -0,0 +1,8 @@
+USE plato;
+
+select a,cc1 from (
+select a,count(distinct b) as bb,max(c) as cc,median(c) as cc1,percentile(c,0.8) as cc2 from (
+select a,b,cast(c as int32) as c,d from Input
+)
+group by a
+)
diff --git a/yt/yql/tests/sql/suites/optimizers/unused_columns_window.cfg b/yt/yql/tests/sql/suites/optimizers/unused_columns_window.cfg
new file mode 100644
index 0000000000..93653023e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/unused_columns_window.cfg
@@ -0,0 +1,2 @@
+in Input unused_columns_window.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/unused_columns_window.sql b/yt/yql/tests/sql/suites/optimizers/unused_columns_window.sql
new file mode 100644
index 0000000000..ee5e54df18
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/unused_columns_window.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+SELECT
+ a,
+ lag(a) over w as prev_a,
+ min(a) over w as min_a
+FROM Input
+WINDOW w AS (PARTITION BY b ORDER by c)
+ORDER BY a;
diff --git a/yt/yql/tests/sql/suites/optimizers/unused_columns_window.txt.attr b/yt/yql/tests/sql/suites/optimizers/unused_columns_window.txt.attr
new file mode 100644
index 0000000000..2b156c3232
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/unused_columns_window.txt.attr
@@ -0,0 +1,8 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["a";["DataType";"String"]];
+ ["b";["DataType";"String"]];
+ ["c";["DataType";"String"]];
+ ["d";["DataType";"String"]]
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/optimizers/unused_columns_window_no_payloads.cfg b/yt/yql/tests/sql/suites/optimizers/unused_columns_window_no_payloads.cfg
new file mode 100644
index 0000000000..93653023e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/unused_columns_window_no_payloads.cfg
@@ -0,0 +1,2 @@
+in Input unused_columns_window.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/unused_columns_window_no_payloads.sql b/yt/yql/tests/sql/suites/optimizers/unused_columns_window_no_payloads.sql
new file mode 100644
index 0000000000..65c7a1bf64
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/unused_columns_window_no_payloads.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+select b from (
+SELECT
+ b,
+ lag(a) over w as prev_a
+FROM Input
+WINDOW w AS (PARTITION BY b ORDER by c)
+)
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-10042_disable_flow_fuse_depends_on.sql b/yt/yql/tests/sql/suites/optimizers/yql-10042_disable_flow_fuse_depends_on.sql
new file mode 100644
index 0000000000..a828dc1cff
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-10042_disable_flow_fuse_depends_on.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+select RandomNumber(a) as first, RandomNumber(b) as second from (
+ select key as a, key as b from Input0
+) order by first, second;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-10070_extract_members_over_calcoverwindow.sql b/yt/yql/tests/sql/suites/optimizers/yql-10070_extract_members_over_calcoverwindow.sql
new file mode 100644
index 0000000000..9b0e18cc0b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-10070_extract_members_over_calcoverwindow.sql
@@ -0,0 +1,23 @@
+/* postgres can not */
+USE plato;
+
+INSERT INTO @source
+SELECT Date('2019-03-04') AS `Date`,
+ 1l AS `Permalink`,
+ 1l AS `ClusterPermalink`,
+ False AS `IsHead`,
+ False AS `WasHead`,
+ 23 as dummy1;
+COMMIT;
+
+SELECT
+ IF(
+ NOT `WasHead` AND NOT `IsHead`,
+ aggregate_list(AsStruct(`Permalink` AS `Permalink`, `Date` AS `Date`, `ClusterPermalink` AS ClusterPermalink)) OVER `w`
+ ) AS `Occurence`
+FROM
+ @source
+WINDOW `w` AS (
+ PARTITION BY `Permalink`
+ ORDER BY `Date`
+)
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-10737_lost_passthrough.sql b/yt/yql/tests/sql/suites/optimizers/yql-10737_lost_passthrough.sql
new file mode 100644
index 0000000000..92271a89b1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-10737_lost_passthrough.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+/* multirun can not */
+/* syntax version 1 */
+/* kikimr can not - table truncate */
+USE plato;
+
+insert into @a
+select "1" as Text, ["a", "b"] as Attachments;
+
+commit;
+
+SELECT x.*, "" AS Text, ListCreate(TypeOf(Attachments)) AS Attachments
+WITHOUT x.Text, x.Attachments
+FROM @a AS x
+; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-11171_unordered_over_sorted_fill.cfg b/yt/yql/tests/sql/suites/optimizers/yql-11171_unordered_over_sorted_fill.cfg
new file mode 100644
index 0000000000..a3de89f626
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-11171_unordered_over_sorted_fill.cfg
@@ -0,0 +1,4 @@
+in Input sorted.txt
+res result.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-11171_unordered_over_sorted_fill.sql b/yt/yql/tests/sql/suites/optimizers/yql-11171_unordered_over_sorted_fill.sql
new file mode 100644
index 0000000000..d76011161b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-11171_unordered_over_sorted_fill.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+
+USE plato;
+select
+ key,
+ some(value)
+from (
+ select
+ key,
+ TableName() as value
+ from Input with inline
+ union all
+ select
+ key,
+ value
+ from Input
+)
+group compact by key;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-12620_stage_multiuse.cfg b/yt/yql/tests/sql/suites/optimizers/yql-12620_stage_multiuse.cfg
new file mode 100644
index 0000000000..0474ee88ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-12620_stage_multiuse.cfg
@@ -0,0 +1,2 @@
+in Input input3.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-12620_stage_multiuse.sql b/yt/yql/tests/sql/suites/optimizers/yql-12620_stage_multiuse.sql
new file mode 100644
index 0000000000..cae154861d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-12620_stage_multiuse.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+$a=select * from Input;
+select count(*) from $a;
+select count(*) from $a where key != '075';
+select * from $a where key != '075'; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-14279_keyextract_with_world_dep.cfg b/yt/yql/tests/sql/suites/optimizers/yql-14279_keyextract_with_world_dep.cfg
new file mode 100644
index 0000000000..745508f188
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-14279_keyextract_with_world_dep.cfg
@@ -0,0 +1,4 @@
+in Input1 sorted.txt
+in Input2 sorted.txt
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-14279_keyextract_with_world_dep.sql b/yt/yql/tests/sql/suites/optimizers/yql-14279_keyextract_with_world_dep.sql
new file mode 100644
index 0000000000..3cdbaeb766
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-14279_keyextract_with_world_dep.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+use plato;
+
+$input = select * from range("", "Input1", "Input2");
+
+$key = select min(key) from $input;
+
+select key, subkey, value
+from $input
+where subkey > '1' and key > $key
+order by key
+;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-14581_fuseflatmaps_with_external_lambda.cfg b/yt/yql/tests/sql/suites/optimizers/yql-14581_fuseflatmaps_with_external_lambda.cfg
new file mode 100644
index 0000000000..0df3369260
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-14581_fuseflatmaps_with_external_lambda.cfg
@@ -0,0 +1,3 @@
+res result.txt
+providers yt
+udf unicode_udf \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-14581_fuseflatmaps_with_external_lambda.sql b/yt/yql/tests/sql/suites/optimizers/yql-14581_fuseflatmaps_with_external_lambda.sql
new file mode 100644
index 0000000000..1302d6dde0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-14581_fuseflatmaps_with_external_lambda.sql
@@ -0,0 +1,28 @@
+/* postgres can not */
+USE plato;
+
+$improve_low = ($val) -> {
+ RETURN CAST($val AS Utf8);
+};
+
+$names_intersection = ($org_names, $db_names) -> {
+ RETURN ListLength(
+ ListFlatten(
+ ListMap(
+ $org_names,
+ ($org_name) -> {
+ RETURN ListFilter(
+ $db_names,
+ ($db_name) -> {
+ $org_name = $improve_low($org_name);
+ $db_name = $improve_low($db_name);
+ RETURN Unicode::LevensteinDistance($org_name, $db_name) < 0.2 * Unicode::GetLength($org_name);
+ }
+ );
+ }
+ )
+ )
+ ) > 0;
+};
+
+select $names_intersection(['1', '2'], ['nets'])
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-15210_sqlin.cfg b/yt/yql/tests/sql/suites/optimizers/yql-15210_sqlin.cfg
new file mode 100644
index 0000000000..7492954c20
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-15210_sqlin.cfg
@@ -0,0 +1,3 @@
+in Input input3.txt
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-15210_sqlin.sql b/yt/yql/tests/sql/suites/optimizers/yql-15210_sqlin.sql
new file mode 100644
index 0000000000..7054019fb5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-15210_sqlin.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+USE plato;
+
+$max = select max(key) from Input;
+$list = select key from Input where subkey > "1";
+
+select * from (
+ select if(key = $max, "max", key) as key, value from Input
+)
+where key in compact $list \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-17413-topsort.cfg b/yt/yql/tests/sql/suites/optimizers/yql-17413-topsort.cfg
new file mode 100644
index 0000000000..c85115a8e4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-17413-topsort.cfg
@@ -0,0 +1,2 @@
+in Input sorted_desc.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-17413-topsort.sql b/yt/yql/tests/sql/suites/optimizers/yql-17413-topsort.sql
new file mode 100644
index 0000000000..646b84b1dd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-17413-topsort.sql
@@ -0,0 +1,10 @@
+-- ignore runonopt plan diff
+USE plato;
+
+$filtered = select * from Input where value != "xxx";
+
+select distinct(subkey) as subkey
+from (select * from $filtered order by key desc limit 3)
+order by subkey;
+
+select sum(cast(subkey as int32)) as c from $filtered;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-17715_concat_sort_desc.cfg b/yt/yql/tests/sql/suites/optimizers/yql-17715_concat_sort_desc.cfg
new file mode 100644
index 0000000000..bb349dd8ab
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-17715_concat_sort_desc.cfg
@@ -0,0 +1 @@
+providers yt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-17715_concat_sort_desc.sql b/yt/yql/tests/sql/suites/optimizers/yql-17715_concat_sort_desc.sql
new file mode 100644
index 0000000000..10cae73c84
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-17715_concat_sort_desc.sql
@@ -0,0 +1,43 @@
+use plato;
+
+$min_ts_for_stat_calculation = DateTime::ToSeconds(CurrentUtcDate() - Interval("P1D"));
+
+insert into @a
+select * from (
+ select 1ul as puid, CurrentUtcTimestamp() as timestamp, [1, 2] as segments, "a" as dummy1
+)
+assume order by puid, timestamp desc;
+
+insert into @b
+select * from (
+ select 4ul as puid, CurrentUtcTimestamp() as timestamp, [3, 2] as segments, "a" as dummy1
+)
+assume order by puid, timestamp desc;
+
+insert into @c
+select * from (
+ select 2ul as puid, Just(CurrentUtcTimestamp()) as timestamp, [2, 3] as segments, "a" as dummy2
+)
+assume order by puid, timestamp desc;
+
+commit;
+
+$target_events = (
+ SELECT
+ puid,
+ segments
+ FROM CONCAT(@a, @b, @c)
+ where DateTime::ToSeconds(`timestamp`) > $min_ts_for_stat_calculation
+);
+
+$target_events = (
+ SELECT DISTINCT *
+ FROM (
+ SELECT *
+ FROM $target_events
+ FLATTEN LIST BY segments
+ )
+ FLATTEN COLUMNS
+);
+
+SELECT * FROM $target_events ORDER BY puid, segments;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-18300-flatmap-over-extend.sql b/yt/yql/tests/sql/suites/optimizers/yql-18300-flatmap-over-extend.sql
new file mode 100644
index 0000000000..7bd19b7bee
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-18300-flatmap-over-extend.sql
@@ -0,0 +1,19 @@
+USE plato;
+
+insert into @tmp with truncate
+select "dummy" as a, "1" as b, ["b", "s"] as data
+order by a;
+
+commit;
+
+
+SELECT a, id
+FROM (
+ SELECT
+ a,
+ ListExtend(
+ [String::AsciiToLower(b)],
+ ListMap(data, String::AsciiToLower)
+ ) AS joins
+ FROM @tmp
+) FLATTEN LIST BY joins AS id;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-18408_filter_multiusage_pushdown.sql b/yt/yql/tests/sql/suites/optimizers/yql-18408_filter_multiusage_pushdown.sql
new file mode 100644
index 0000000000..ad3afa8596
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-18408_filter_multiusage_pushdown.sql
@@ -0,0 +1,84 @@
+use plato;
+pragma AnsiOptionalAs;
+pragma config.flags("OptimizerFlags",
+ "FieldSubsetEnableMultiusage",
+ "FilterPushdownEnableMultiusage",
+ "EarlyExpandSkipNull");
+
+
+$date_dim = select * from as_table([
+ <|d_year:Just(1999), d_date_sk:Just(10001)|>,
+ <|d_year:Just(1999), d_date_sk:Just(10002)|>,
+ <|d_year:Just(1999), d_date_sk:Just(10003)|>,
+ <|d_year:Just(2000), d_date_sk:Just(10001)|>,
+ <|d_year:Just(2000), d_date_sk:Just(10002)|>,
+ <|d_year:Just(2000), d_date_sk:Just(10003)|>,
+]);
+
+$customer = select * from as_table([
+ <|c_customer_sk:Just(1), c_customer_id:Just(1), c_first_name:Just("Vasya"), c_last_name:Just("Ivanov"), c_preferred_cust_flag:Just("aaa"), c_birth_country:Just("RU"), c_login:Just("ivanov"), c_email_address:Just("foo@bar.com")|>,
+ <|c_customer_sk:Just(2), c_customer_id:Just(2), c_first_name:Just("Petya"), c_last_name:Just("Ivanov"), c_preferred_cust_flag:Just("bbb"), c_birth_country:Just("RU"), c_login:Just("ivanov1"), c_email_address:Just("foo1@bar.com")|>,
+ <|c_customer_sk:Just(3), c_customer_id:null, c_first_name:null, c_last_name:null, c_preferred_cust_flag:null, c_birth_country:null, c_login:Just("ivanov1"), c_email_address:Just("foo2@bar.com")|>,
+]);
+
+$store_sales = select * from as_table([
+ <|ss_sold_date_sk:Just(10001), ss_customer_sk:Just(1), ss_ext_list_price:Just(12345), ss_ext_discount_amt:Just(1234)|>,
+ <|ss_sold_date_sk:Just(10002), ss_customer_sk:Just(2), ss_ext_list_price:Just(12346), ss_ext_discount_amt:Just(123)|>,
+ <|ss_sold_date_sk:Just(10003), ss_customer_sk:Just(3), ss_ext_list_price:Just(12347), ss_ext_discount_amt:Just(1235)|>,
+]);
+
+insert into @date_dim
+select * from $date_dim;
+
+insert into @customer
+select * from $customer;
+
+insert into @store_sales
+select * from $store_sales;
+
+commit;
+
+
+$year_total = (
+ select customer.c_customer_id customer_id
+ ,customer.c_first_name customer_first_name
+ ,customer.c_last_name customer_last_name
+ ,customer.c_preferred_cust_flag customer_preferred_cust_flag
+ ,customer.c_birth_country customer_birth_country
+ ,customer.c_login customer_login
+ ,customer.c_email_address customer_email_address
+ ,date_dim.d_year dyear
+ ,sum(ss_ext_list_price-ss_ext_discount_amt) year_total
+ ,'s' sale_type
+ from @date_dim date_dim
+ cross join @store_sales store_sales
+ cross join @customer customer
+ where ss_sold_date_sk = d_date_sk and c_customer_sk = ss_customer_sk
+ group by customer.c_customer_id
+ ,customer.c_first_name
+ ,customer.c_last_name
+ ,customer.c_preferred_cust_flag
+ ,customer.c_birth_country
+ ,customer.c_login
+ ,customer.c_email_address
+ ,date_dim.d_year
+ );
+
+
+ select
+ t_s_secyear.customer_id
+ ,t_s_secyear.customer_first_name
+ ,t_s_secyear.customer_last_name
+ ,t_s_secyear.customer_birth_country
+ from $year_total t_s_firstyear
+ cross join $year_total t_s_secyear
+ where t_s_secyear.customer_id = t_s_firstyear.customer_id
+ and t_s_firstyear.sale_type = 's'
+ and t_s_secyear.sale_type = 's'
+ and t_s_firstyear.dyear = 1999
+ and t_s_secyear.dyear = 1999+1
+ order by t_s_secyear.customer_id
+ ,t_s_secyear.customer_first_name
+ ,t_s_secyear.customer_last_name
+ ,t_s_secyear.customer_birth_country
+limit 100;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-18733_no_filter_multiusage_pushdown.cfg b/yt/yql/tests/sql/suites/optimizers/yql-18733_no_filter_multiusage_pushdown.cfg
new file mode 100644
index 0000000000..0474ee88ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-18733_no_filter_multiusage_pushdown.cfg
@@ -0,0 +1,2 @@
+in Input input3.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-18733_no_filter_multiusage_pushdown.sql b/yt/yql/tests/sql/suites/optimizers/yql-18733_no_filter_multiusage_pushdown.sql
new file mode 100644
index 0000000000..56f9ddfde9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-18733_no_filter_multiusage_pushdown.sql
@@ -0,0 +1,6 @@
+pragma config.flags("OptimizerFlags", "FilterPushdownEnableMultiusage");
+USE plato;
+
+$src = select distinct key from Input where value = 'ddd';
+
+select * from Input where key = $src;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-2171_aggregate_desc_sort_and_extract.cfg b/yt/yql/tests/sql/suites/optimizers/yql-2171_aggregate_desc_sort_and_extract.cfg
new file mode 100644
index 0000000000..208adc1e38
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-2171_aggregate_desc_sort_and_extract.cfg
@@ -0,0 +1,4 @@
+in Input input_tutorial_users.txt
+res result.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-2171_aggregate_desc_sort_and_extract.sql b/yt/yql/tests/sql/suites/optimizers/yql-2171_aggregate_desc_sort_and_extract.sql
new file mode 100644
index 0000000000..0cce1f9889
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-2171_aggregate_desc_sort_and_extract.sql
@@ -0,0 +1,16 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+
+$data = (select cast(key as uint32) as age, cast(subkey as uint32) as region, value as name from Input);
+
+$top_users_by_age_dec = (SELECT
+ age_dec,
+ COUNT(1) as age_dec_count
+FROM $data
+GROUP BY age / 10 as age_dec
+ORDER BY age_dec_count DESC
+LIMIT 2);
+
+--INSERT INTO Output
+SELECT age_dec, info.* FROM $top_users_by_age_dec AS top JOIN $data AS info ON top.age_dec = info.age / 10 ORDER BY name;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-2582_limit_for_join_input.cfg b/yt/yql/tests/sql/suites/optimizers/yql-2582_limit_for_join_input.cfg
new file mode 100644
index 0000000000..a6e1f32b6e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-2582_limit_for_join_input.cfg
@@ -0,0 +1,3 @@
+in Input1 input3.txt
+in Input2 input3.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-2582_limit_for_join_input.sql b/yt/yql/tests/sql/suites/optimizers/yql-2582_limit_for_join_input.sql
new file mode 100644
index 0000000000..8887d13fcd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-2582_limit_for_join_input.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+USE plato;
+
+$data = (SELECT * FROM Input1 WHERE key < "700" LIMIT 10);
+
+SELECT * FROM $data LIMIT 100;
+
+SELECT a.key AS key, b.subkey AS subkey, b.value AS value
+FROM $data AS a
+INNER JOIN Input2 AS b ON a.key = b.key
+ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-2582_limit_for_join_input_other.cfg b/yt/yql/tests/sql/suites/optimizers/yql-2582_limit_for_join_input_other.cfg
new file mode 100644
index 0000000000..fd0ec5927e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-2582_limit_for_join_input_other.cfg
@@ -0,0 +1,3 @@
+in Input1 input_other.txt
+in Input2 input3.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-2582_limit_for_join_input_other.sql b/yt/yql/tests/sql/suites/optimizers/yql-2582_limit_for_join_input_other.sql
new file mode 100644
index 0000000000..a7c735a9ce
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-2582_limit_for_join_input_other.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$data = (SELECT * FROM Input1 LIMIT 10);
+
+SELECT key, subkey, _other["value"] FROM $data LIMIT 100;
+
+SELECT a.key AS key, b.subkey AS subkey, b.value AS value
+FROM $data AS a
+INNER JOIN Input2 AS b ON a.key = b.key
+ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-3455_filter_sorted.cfg b/yt/yql/tests/sql/suites/optimizers/yql-3455_filter_sorted.cfg
new file mode 100644
index 0000000000..3f5bebb5a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-3455_filter_sorted.cfg
@@ -0,0 +1,2 @@
+in Input sorted.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-3455_filter_sorted.sql b/yt/yql/tests/sql/suites/optimizers/yql-3455_filter_sorted.sql
new file mode 100644
index 0000000000..99d000cfa0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-3455_filter_sorted.sql
@@ -0,0 +1,18 @@
+/* postgres can not */
+USE plato;
+
+SELECT
+ subkey
+FROM Input
+WHERE subkey < "100";
+
+SELECT
+ value
+FROM Input
+LIMIT 3;
+
+SELECT
+ key
+FROM
+ (SELECT * FROM Input ORDER BY -CAST(subkey as Int32) LIMIT 5)
+;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-4240-aggregate_whole_struct.sql b/yt/yql/tests/sql/suites/optimizers/yql-4240-aggregate_whole_struct.sql
new file mode 100644
index 0000000000..bf646532d4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-4240-aggregate_whole_struct.sql
@@ -0,0 +1,16 @@
+/* postgres can not */
+use plato;
+
+$data = (select value as attr, key as urlBase, cast(subkey as int32) as dupsCount from Input0);
+
+ SELECT
+ urlBase,
+ SUM(dupsCount) as allDocs,
+ MAX_BY(AsStruct(dupsCount as dupsCount, attr as attr), dupsCount) as best
+ FROM (
+ SELECT urlBase, attr, count(*) as dupsCount
+ FROM $data
+ GROUP BY urlBase, attr
+ )
+ GROUP BY urlBase
+ ORDER BY urlBase
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-5833-table_content.cfg b/yt/yql/tests/sql/suites/optimizers/yql-5833-table_content.cfg
new file mode 100644
index 0000000000..0474ee88ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-5833-table_content.cfg
@@ -0,0 +1,2 @@
+in Input input3.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-5833-table_content.sql b/yt/yql/tests/sql/suites/optimizers/yql-5833-table_content.sql
new file mode 100644
index 0000000000..4ca893b99b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-5833-table_content.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+use plato;
+
+$max_key = (
+select
+max(key)
+from Input
+);
+
+select
+cast(count(*) as String) || ' (' || cast($max_key as String) ||'/24)'
+from Input
+where key = $max_key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-5978_fill_multi_usage.cfg b/yt/yql/tests/sql/suites/optimizers/yql-5978_fill_multi_usage.cfg
new file mode 100644
index 0000000000..551221cf56
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-5978_fill_multi_usage.cfg
@@ -0,0 +1,3 @@
+in Input input3.txt
+out Output output.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-5978_fill_multi_usage.sql b/yt/yql/tests/sql/suites/optimizers/yql-5978_fill_multi_usage.sql
new file mode 100644
index 0000000000..1671816eec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-5978_fill_multi_usage.sql
@@ -0,0 +1,29 @@
+/* postgres can not */
+USE plato;
+
+$ctl = (
+ SELECT 1 AS join_col
+ , MAX(key) AS max
+ FROM Input
+ );
+
+INSERT INTO Output WITH TRUNCATE
+SELECT * FROM $ctl;
+
+$in = (
+ SELECT 1 AS join_col
+ , key
+ , subkey
+ , value
+ FROM Input
+ );
+
+SELECT
+ a.key AS key
+ , a.subkey AS subkey
+ , a.value AS value
+FROM $in AS a
+LEFT JOIN $ctl AS ctl
+ USING (join_col)
+WHERE key < max
+; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-6008_limit_after_map.cfg b/yt/yql/tests/sql/suites/optimizers/yql-6008_limit_after_map.cfg
new file mode 100644
index 0000000000..66737248b8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-6008_limit_after_map.cfg
@@ -0,0 +1,2 @@
+in Input sorted.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-6008_limit_after_map.sql b/yt/yql/tests/sql/suites/optimizers/yql-6008_limit_after_map.sql
new file mode 100644
index 0000000000..53001bf902
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-6008_limit_after_map.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+/* multirun can not */
+USE plato;
+
+insert into Output
+select * from plato.Input where value != "111" limit 3;
+
+commit;
+
+insert into Output
+select * from plato.Input order by value;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-6038_direct_row.cfg b/yt/yql/tests/sql/suites/optimizers/yql-6038_direct_row.cfg
new file mode 100644
index 0000000000..0474ee88ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-6038_direct_row.cfg
@@ -0,0 +1,2 @@
+in Input input3.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-6038_direct_row.sql b/yt/yql/tests/sql/suites/optimizers/yql-6038_direct_row.sql
new file mode 100644
index 0000000000..05c6779782
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-6038_direct_row.sql
@@ -0,0 +1,25 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$queries_0 = (select distinct key from Input);
+
+$queries = (select TableRecordIndex() as j, key from $queries_0);
+
+$count = (select count(*) from $queries);
+
+$users_0 = (
+ select ListFromRange(0, 3) as lst, TableRecordIndex() as idx, subkey from Input as t
+);
+
+$users = (
+ select
+ cast(Random(idx + x) as Uint64) % $count as j,
+ subkey
+ from $users_0
+ flatten by lst as x
+);
+
+select *
+from $queries as queries join $users as users using(j)
+order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-6133_skip_deps.cfg b/yt/yql/tests/sql/suites/optimizers/yql-6133_skip_deps.cfg
new file mode 100644
index 0000000000..e934bc69c9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-6133_skip_deps.cfg
@@ -0,0 +1,4 @@
+in Input input3.txt
+out Output output.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-6133_skip_deps.sql b/yt/yql/tests/sql/suites/optimizers/yql-6133_skip_deps.sql
new file mode 100644
index 0000000000..6d8c66947a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-6133_skip_deps.sql
@@ -0,0 +1,28 @@
+/* postgres can not */
+/* multirun can not */
+USE plato;
+
+$out = (
+SELECT
+ *
+FROM
+ `Input`
+WHERE
+ value != "111"
+);
+
+$row_count = (
+ SELECT
+ COUNT(*)
+ FROM
+ $out
+);
+
+$needed_row = COALESCE(CAST(CAST($row_count as float) * 0.5 as Uint64), 1);
+
+INSERT INTO Output WITH TRUNCATE
+SELECT
+ *
+FROM $out ORDER BY key DESC
+LIMIT 1 OFFSET $needed_row;
+
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-7324_duplicate_arg.cfg b/yt/yql/tests/sql/suites/optimizers/yql-7324_duplicate_arg.cfg
new file mode 100644
index 0000000000..0781bebbd5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-7324_duplicate_arg.cfg
@@ -0,0 +1,3 @@
+in Input input2.txt
+res result.txt
+udf strings_udf
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-7324_duplicate_arg.sql b/yt/yql/tests/sql/suites/optimizers/yql-7324_duplicate_arg.sql
new file mode 100644
index 0000000000..df26751a74
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-7324_duplicate_arg.sql
@@ -0,0 +1,23 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+
+$to_int = ($x) -> { return cast($x as Int32) };
+$to_in_list = ($col) -> { return ListMap(String::SplitToList($col, ","), $to_int) };
+
+$input = (
+ SELECT
+ $to_in_list(key) AS event_ids,
+ $to_in_list(subkey) AS test_ids
+ FROM
+ Input
+ WHERE
+ value = "aaa"
+);
+
+SELECT
+ event_id,
+ test_ids
+FROM
+ $input
+FLATTEN BY event_ids AS event_id;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-7532_wrong_field_subset_for_calcoverwindow.sql b/yt/yql/tests/sql/suites/optimizers/yql-7532_wrong_field_subset_for_calcoverwindow.sql
new file mode 100644
index 0000000000..5d8a388f94
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-7532_wrong_field_subset_for_calcoverwindow.sql
@@ -0,0 +1,23 @@
+/* postgres can not */
+USE plato;
+
+INSERT INTO @source
+SELECT Date('2019-03-04') AS `Date`,
+ 1l AS `Permalink`,
+ 1l AS `ClusterPermalink`,
+ False AS `IsHead`,
+ False AS `WasHead`;
+COMMIT;
+
+SELECT
+ IF(
+ NOT `WasHead` AND NOT `IsHead`,
+ aggregate_list(AsStruct(`Permalink` AS `Permalink`, `Date` AS `Date`, `ClusterPermalink` AS ClusterPermalink)) OVER `w`
+ ) AS `Occurence`
+FROM
+ @source
+WINDOW `w` AS (
+ PARTITION BY `Permalink`
+ ORDER BY `Date`
+)
+
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-7767_key_filter_with_view.cfg b/yt/yql/tests/sql/suites/optimizers/yql-7767_key_filter_with_view.cfg
new file mode 100644
index 0000000000..7ed2bf2270
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-7767_key_filter_with_view.cfg
@@ -0,0 +1,5 @@
+in ViewSource input4.txt
+in Input1 sorted.txt
+in Input2 input_view.txt
+udf python3_udf
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-7767_key_filter_with_view.sql b/yt/yql/tests/sql/suites/optimizers/yql-7767_key_filter_with_view.sql
new file mode 100644
index 0000000000..56c915118a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-7767_key_filter_with_view.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+select
+ key,
+ value || "_y" ?? "" as value
+from range("", "Input1", "Input2")
+where key > "010"
+order by key, value;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-8041-fuse_with_desc_map.cfg b/yt/yql/tests/sql/suites/optimizers/yql-8041-fuse_with_desc_map.cfg
new file mode 100644
index 0000000000..0474ee88ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-8041-fuse_with_desc_map.cfg
@@ -0,0 +1,2 @@
+in Input input3.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-8041-fuse_with_desc_map.sql b/yt/yql/tests/sql/suites/optimizers/yql-8041-fuse_with_desc_map.sql
new file mode 100644
index 0000000000..2231c46900
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-8041-fuse_with_desc_map.sql
@@ -0,0 +1,17 @@
+/* postgres can not */
+USE plato;
+
+$i = (
+ SELECT
+ cast(key as Double) as key,
+ value
+ FROM Input
+ WHERE key < "100"
+ ORDER BY key DESC
+ LIMIT 1000
+);
+
+select distinct key
+from $i
+where value != ""
+order by key;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-8223_direct_row_and_skipnullmembers.cfg b/yt/yql/tests/sql/suites/optimizers/yql-8223_direct_row_and_skipnullmembers.cfg
new file mode 100644
index 0000000000..676c920ddf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-8223_direct_row_and_skipnullmembers.cfg
@@ -0,0 +1,2 @@
+in Input opt_key.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-8223_direct_row_and_skipnullmembers.sql b/yt/yql/tests/sql/suites/optimizers/yql-8223_direct_row_and_skipnullmembers.sql
new file mode 100644
index 0000000000..aaf5c9187e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-8223_direct_row_and_skipnullmembers.sql
@@ -0,0 +1,25 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma AnsiInForEmptyOrNullableItemsCollections;
+
+$x = (
+ SELECT
+ TableName() AS path,
+ key, subkey, value
+ FROM CONCAT(Input, Input)
+);
+$y = (
+ SELECT
+ t.path AS path,
+ t.key as key,
+ info.value as value
+ FROM $x AS t
+ INNER JOIN (
+ SELECT key, subkey, value FROM Input
+ WHERE key != ""
+ ) AS info
+ USING (key)
+ WHERE t.key in ("023", "150")
+);
+select distinct path from $y;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-8953_logical_fuse_with_table_props.cfg b/yt/yql/tests/sql/suites/optimizers/yql-8953_logical_fuse_with_table_props.cfg
new file mode 100644
index 0000000000..0474ee88ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-8953_logical_fuse_with_table_props.cfg
@@ -0,0 +1,2 @@
+in Input input3.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-8953_logical_fuse_with_table_props.sql b/yt/yql/tests/sql/suites/optimizers/yql-8953_logical_fuse_with_table_props.sql
new file mode 100644
index 0000000000..610f2ef729
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-8953_logical_fuse_with_table_props.sql
@@ -0,0 +1,10 @@
+use plato;
+
+select key, subkey, TableName() as name from Input
+where value == 'q';
+
+select key, count(*) as subkeys from (
+ select distinct key, subkey from Input
+ where value == 'q'
+)
+group by key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-9297_publish_ytcopy.cfg b/yt/yql/tests/sql/suites/optimizers/yql-9297_publish_ytcopy.cfg
new file mode 100644
index 0000000000..551221cf56
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-9297_publish_ytcopy.cfg
@@ -0,0 +1,3 @@
+in Input input3.txt
+out Output output.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql-9297_publish_ytcopy.sql b/yt/yql/tests/sql/suites/optimizers/yql-9297_publish_ytcopy.sql
new file mode 100644
index 0000000000..d0a183b3ff
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql-9297_publish_ytcopy.sql
@@ -0,0 +1,22 @@
+/* postgres can not */
+/* multirun can not */
+/* kikimr can not - table truncate */
+USE plato;
+
+INSERT INTO @a
+SELECT *
+FROM Input
+WHERE key < "100"
+ORDER BY key DESC;
+
+COMMIT;
+
+INSERT INTO Output
+SELECT *
+FROM @a
+ORDER BY key DESC;
+
+COMMIT;
+
+SELECT *
+FROM Output; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/optimizers/yql_5830_fuse_outer_with_extra_deps.cfg b/yt/yql/tests/sql/suites/optimizers/yql_5830_fuse_outer_with_extra_deps.cfg
new file mode 100644
index 0000000000..0474ee88ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql_5830_fuse_outer_with_extra_deps.cfg
@@ -0,0 +1,2 @@
+in Input input3.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql_5830_fuse_outer_with_extra_deps.sql b/yt/yql/tests/sql/suites/optimizers/yql_5830_fuse_outer_with_extra_deps.sql
new file mode 100644
index 0000000000..4ab7aaf95e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql_5830_fuse_outer_with_extra_deps.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+USE plato;
+
+$data = (select max_by(key, subkey)
+from Input where value > "a");
+
+select
+ a.key,
+ $data as max_key,
+ b.value
+from Input as a
+left join (select * from Input where key > "050") as b
+on a.key = b.key
+order by a.key;
diff --git a/yt/yql/tests/sql/suites/optimizers/yql_6179_merge_chunks_of_outputs.cfg b/yt/yql/tests/sql/suites/optimizers/yql_6179_merge_chunks_of_outputs.cfg
new file mode 100644
index 0000000000..1dc9a1e3a7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql_6179_merge_chunks_of_outputs.cfg
@@ -0,0 +1 @@
+in Input input0.txt
diff --git a/yt/yql/tests/sql/suites/optimizers/yql_6179_merge_chunks_of_outputs.sql b/yt/yql/tests/sql/suites/optimizers/yql_6179_merge_chunks_of_outputs.sql
new file mode 100644
index 0000000000..fcf21d7b36
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yql_6179_merge_chunks_of_outputs.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+/* kikimr can not - yt pragma */
+
+PRAGMA yt.MinPublishedAvgChunkSize="0";
+PRAGMA yt.MinTempAvgChunkSize="0";
+
+USE plato;
+
+$i = (select subkey as s from Input where key = "112" limit 1);
+$j = (select subkey as s from Input where key = "113" limit 1);
+
+select * from Input where cast(TableRecordIndex() as String) == $i or
+ cast(TableRecordIndex() as String) == $j;
+
diff --git a/yt/yql/tests/sql/suites/optimizers/yt_shuffle_by_keys.cfg b/yt/yql/tests/sql/suites/optimizers/yt_shuffle_by_keys.cfg
new file mode 100644
index 0000000000..4ba549ce28
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yt_shuffle_by_keys.cfg
@@ -0,0 +1,4 @@
+in Input input0.txt
+providers yt
+
+
diff --git a/yt/yql/tests/sql/suites/optimizers/yt_shuffle_by_keys.sql b/yt/yql/tests/sql/suites/optimizers/yt_shuffle_by_keys.sql
new file mode 100644
index 0000000000..b4bf37fa34
--- /dev/null
+++ b/yt/yql/tests/sql/suites/optimizers/yt_shuffle_by_keys.sql
@@ -0,0 +1,23 @@
+--Test, that YT optimizer can rewrite ShuffleByKeys with PartitionsByKes
+USE plato;
+
+$input = PROCESS Input;
+
+SELECT YQL::ShuffleByKeys(
+ $input,
+ ($_)->("dsdsa"),
+ ($_)->([1]) -- list
+ );
+
+SELECT YQL::ShuffleByKeys(
+ $input,
+ ($_)->(12),
+ ($_)->(Just(2)) -- optional
+ );
+
+SELECT YQL::ShuffleByKeys(
+ $input,
+ ($_)->(true),
+ ($_)->(YQL::ToStream([3])) -- stream
+ );
+
diff --git a/yt/yql/tests/sql/suites/order_by/SortByOneField.cfg b/yt/yql/tests/sql/suites/order_by/SortByOneField.cfg
new file mode 100644
index 0000000000..2dc97b5e95
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/SortByOneField.cfg
@@ -0,0 +1 @@
+in Input columns.txt
diff --git a/yt/yql/tests/sql/suites/order_by/SortByOneField.sql b/yt/yql/tests/sql/suites/order_by/SortByOneField.sql
new file mode 100644
index 0000000000..192b522df4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/SortByOneField.sql
@@ -0,0 +1 @@
+select a from plato.Input order by a;
diff --git a/yt/yql/tests/sql/suites/order_by/SortByOneFieldDesc.cfg b/yt/yql/tests/sql/suites/order_by/SortByOneFieldDesc.cfg
new file mode 100644
index 0000000000..2dc97b5e95
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/SortByOneFieldDesc.cfg
@@ -0,0 +1 @@
+in Input columns.txt
diff --git a/yt/yql/tests/sql/suites/order_by/SortByOneFieldDesc.sql b/yt/yql/tests/sql/suites/order_by/SortByOneFieldDesc.sql
new file mode 100644
index 0000000000..e269f50243
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/SortByOneFieldDesc.sql
@@ -0,0 +1 @@
+select b from plato.Input order by b desc;
diff --git a/yt/yql/tests/sql/suites/order_by/SortByTwoFields.cfg b/yt/yql/tests/sql/suites/order_by/SortByTwoFields.cfg
new file mode 100644
index 0000000000..2dc97b5e95
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/SortByTwoFields.cfg
@@ -0,0 +1 @@
+in Input columns.txt
diff --git a/yt/yql/tests/sql/suites/order_by/SortByTwoFields.sql b/yt/yql/tests/sql/suites/order_by/SortByTwoFields.sql
new file mode 100644
index 0000000000..0a1a137b35
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/SortByTwoFields.sql
@@ -0,0 +1 @@
+select a, b from plato.Input order by a, b;
diff --git a/yt/yql/tests/sql/suites/order_by/SortByTwoFieldsDesc.cfg b/yt/yql/tests/sql/suites/order_by/SortByTwoFieldsDesc.cfg
new file mode 100644
index 0000000000..2dc97b5e95
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/SortByTwoFieldsDesc.cfg
@@ -0,0 +1 @@
+in Input columns.txt
diff --git a/yt/yql/tests/sql/suites/order_by/SortByTwoFieldsDesc.sql b/yt/yql/tests/sql/suites/order_by/SortByTwoFieldsDesc.sql
new file mode 100644
index 0000000000..adc58f1da7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/SortByTwoFieldsDesc.sql
@@ -0,0 +1 @@
+select a, b from plato.Input order by a desc, b desc;
diff --git a/yt/yql/tests/sql/suites/order_by/assume_cut_prefix.cfg b/yt/yql/tests/sql/suites/order_by/assume_cut_prefix.cfg
new file mode 100644
index 0000000000..768acac67b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/assume_cut_prefix.cfg
@@ -0,0 +1,2 @@
+in Input input_sorted.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/order_by/assume_cut_prefix.sql b/yt/yql/tests/sql/suites/order_by/assume_cut_prefix.sql
new file mode 100644
index 0000000000..8e81372d57
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/assume_cut_prefix.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+/* multirun can not */
+/* syntax version 1 */
+USE plato;
+
+insert into Output
+select * from Input
+assume order by key;
diff --git a/yt/yql/tests/sql/suites/order_by/assume_over_input.cfg b/yt/yql/tests/sql/suites/order_by/assume_over_input.cfg
new file mode 100644
index 0000000000..4ef8c714be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/assume_over_input.cfg
@@ -0,0 +1,2 @@
+in Input input2.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/order_by/assume_over_input.sql b/yt/yql/tests/sql/suites/order_by/assume_over_input.sql
new file mode 100644
index 0000000000..f2a2611de7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/assume_over_input.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+/* multirun can not */
+/* syntax version 1 */
+USE plato;
+
+INSERT INTO Output
+SELECT * FROM Input ASSUME ORDER BY key, subkey, value;
diff --git a/yt/yql/tests/sql/suites/order_by/assume_over_input_desc.cfg b/yt/yql/tests/sql/suites/order_by/assume_over_input_desc.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/assume_over_input_desc.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/order_by/assume_over_input_desc.sql b/yt/yql/tests/sql/suites/order_by/assume_over_input_desc.sql
new file mode 100644
index 0000000000..252bd2ae91
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/assume_over_input_desc.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* multirun can not */
+/* syntax version 1 */
+/* hybridfile can not YQL-17743 */
+USE plato;
+
+insert into Output
+select * from concat(`Input[#3]`, `Input[#0]`, `Input[#2]`)
+assume order by key desc;
diff --git a/yt/yql/tests/sql/suites/order_by/assume_with_filter.cfg b/yt/yql/tests/sql/suites/order_by/assume_with_filter.cfg
new file mode 100644
index 0000000000..4ef8c714be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/assume_with_filter.cfg
@@ -0,0 +1,2 @@
+in Input input2.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/order_by/assume_with_filter.sql b/yt/yql/tests/sql/suites/order_by/assume_with_filter.sql
new file mode 100644
index 0000000000..45463f1953
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/assume_with_filter.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+/* multirun can not */
+/* syntax version 1 */
+USE plato;
+
+INSERT INTO Output
+SELECT
+ "3" || key as key,
+ subkey,
+ value
+FROM Input
+WHERE key >= "0"
+ASSUME ORDER BY key, subkey;
diff --git a/yt/yql/tests/sql/suites/order_by/assume_with_transform_desc.cfg b/yt/yql/tests/sql/suites/order_by/assume_with_transform_desc.cfg
new file mode 100644
index 0000000000..4ef8c714be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/assume_with_transform_desc.cfg
@@ -0,0 +1,2 @@
+in Input input2.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/order_by/assume_with_transform_desc.sql b/yt/yql/tests/sql/suites/order_by/assume_with_transform_desc.sql
new file mode 100644
index 0000000000..0c25b703e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/assume_with_transform_desc.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+/* hybridfile can not YQL-17743 */
+/* multirun can not */
+/* syntax version 1 */
+USE plato;
+
+INSERT INTO Output
+SELECT
+ -(CAST(key as Int32) ?? 0) as key,
+ subkey,
+ value
+FROM Input
+ASSUME ORDER BY key DESC;
diff --git a/yt/yql/tests/sql/suites/order_by/changed_sort_with_limit.cfg b/yt/yql/tests/sql/suites/order_by/changed_sort_with_limit.cfg
new file mode 100644
index 0000000000..f9159f698b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/changed_sort_with_limit.cfg
@@ -0,0 +1,3 @@
+in Input input_sorted.txt
+out Output output.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/order_by/changed_sort_with_limit.sql b/yt/yql/tests/sql/suites/order_by/changed_sort_with_limit.sql
new file mode 100644
index 0000000000..e69117f930
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/changed_sort_with_limit.sql
@@ -0,0 +1,11 @@
+USE plato;
+
+INSERT INTO Output
+SELECT
+ key,
+ '1' as subkey,
+ value || "a" as value
+FROM Input
+WHERE key < "100"
+ORDER BY value
+limit 3;
diff --git a/yt/yql/tests/sql/suites/order_by/columns.txt.attr b/yt/yql/tests/sql/suites/order_by/columns.txt.attr
new file mode 100644
index 0000000000..70da6cab1d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/columns.txt.attr
@@ -0,0 +1,3 @@
+{
+ "_read_schema"=[{"type"="string";"name"="a"};{"type"="uint64";"name"="b"};{"type"="int64";"name"="c"};{"type"="int64";"name"="d"}]
+}
diff --git a/yt/yql/tests/sql/suites/order_by/complex_type.txt.attr b/yt/yql/tests/sql/suites/order_by/complex_type.txt.attr
new file mode 100644
index 0000000000..42cec863fb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/complex_type.txt.attr
@@ -0,0 +1,13 @@
+{
+ "_yql_row_spec" = {
+ "StrictSchema"=%true;
+ "Type"=["StructType";[
+ ["value";["ListType";["DataType";"String"]]];
+ ["key";["OptionalType";["DataType";"String"]]];
+ ]];
+ };
+ "schema" = [
+ {"required"=%false; "type"="any"; "name"="value"};
+ {"required"=%false; "type"="string"; "name"="key"};
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/order_by/decimals.txt.attr b/yt/yql/tests/sql/suites/order_by/decimals.txt.attr
new file mode 100644
index 0000000000..1d13a3e179
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/decimals.txt.attr
@@ -0,0 +1,8 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["a";["DataType";"String"]];
+ ["b";["DataType";"Uint8"]];
+ ["c";["DataType";"String"]];
+ ["d";["DataType";"String"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/order_by/default.cfg b/yt/yql/tests/sql/suites/order_by/default.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/default.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/order_by/descending.txt.attr b/yt/yql/tests/sql/suites/order_by/descending.txt.attr
new file mode 100644
index 0000000000..7024a9fc9c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/descending.txt.attr
@@ -0,0 +1,21 @@
+{
+ "schema"=<
+ "strict" = %true;
+ "unique_keys" = %false
+ >[
+ {
+ "name" = "key";
+ "type" = "string";
+ "sort_order" = "descending";
+ };
+ {
+ "name" = "subkey";
+ "type" = "string";
+ "sort_order" = "descending";
+ };
+ {
+ "name" = "value";
+ "type" = "string";
+ };
+ ]
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/order_by/extract_members_over_sort_desc.cfg b/yt/yql/tests/sql/suites/order_by/extract_members_over_sort_desc.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/extract_members_over_sort_desc.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/order_by/extract_members_over_sort_desc.sql b/yt/yql/tests/sql/suites/order_by/extract_members_over_sort_desc.sql
new file mode 100644
index 0000000000..6e5b264216
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/extract_members_over_sort_desc.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+/* multirun can not */
+USE plato;
+
+$top = (select * from Input order by value desc limit 100);
+
+insert into Output
+select key, value
+from $top
+order by value desc;
+
+select * from $top; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/order_by/input_sorted.txt.attr b/yt/yql/tests/sql/suites/order_by/input_sorted.txt.attr
new file mode 100644
index 0000000000..aa00b0ede5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/input_sorted.txt.attr
@@ -0,0 +1,53 @@
+{
+ "_yql_row_spec" = {
+ "SortMembers" = [
+ "key";
+ "subkey";
+ ];
+ "SortDirections" = [
+ 1;
+ 1;
+ ];
+ "UniqueKeys" = %false;
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ];
+ "SortedByTypes" = [
+ [
+ "DataType";
+ "String"
+ ];
+ [
+ "DataType";
+ "String"
+ ];
+ ];
+ "SortedBy" = [
+ "key";
+ "subkey";
+ ]
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/order_by/limit.cfg b/yt/yql/tests/sql/suites/order_by/limit.cfg
new file mode 100644
index 0000000000..86c772ae1c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/limit.cfg
@@ -0,0 +1 @@
+in Input read_schema.txt
diff --git a/yt/yql/tests/sql/suites/order_by/limit.sql b/yt/yql/tests/sql/suites/order_by/limit.sql
new file mode 100644
index 0000000000..eb87ba6968
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/limit.sql
@@ -0,0 +1 @@
+select * from plato.Input order by a desc limit 3;
diff --git a/yt/yql/tests/sql/suites/order_by/literal.cfg b/yt/yql/tests/sql/suites/order_by/literal.cfg
new file mode 100644
index 0000000000..9b85bd0ae8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/literal.cfg
@@ -0,0 +1 @@
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/order_by/literal.sql b/yt/yql/tests/sql/suites/order_by/literal.sql
new file mode 100644
index 0000000000..aac08c3fb8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/literal.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+use plato;
+
+insert into Output
+select x
+from (select ListFromRange(0,100) as x)
+flatten by x
+order by x;
diff --git a/yt/yql/tests/sql/suites/order_by/literal_complex.cfg b/yt/yql/tests/sql/suites/order_by/literal_complex.cfg
new file mode 100644
index 0000000000..9b85bd0ae8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/literal_complex.cfg
@@ -0,0 +1 @@
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/order_by/literal_complex.sql b/yt/yql/tests/sql/suites/order_by/literal_complex.sql
new file mode 100644
index 0000000000..84bee87970
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/literal_complex.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* hybridfile can not YQL-17743 */
+use plato;
+
+$list = AsList(AsStruct(1 as a, "2" as b, "3" as c), AsStruct(4 as a, "5" as b, "6" as c));
+
+insert into Output
+select * from as_table($list)
+order by a desc, b, c desc;
diff --git a/yt/yql/tests/sql/suites/order_by/literal_desc.cfg b/yt/yql/tests/sql/suites/order_by/literal_desc.cfg
new file mode 100644
index 0000000000..9b85bd0ae8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/literal_desc.cfg
@@ -0,0 +1 @@
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/order_by/literal_desc.sql b/yt/yql/tests/sql/suites/order_by/literal_desc.sql
new file mode 100644
index 0000000000..3aec7f5aa7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/literal_desc.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* hybridfile can not YQL-17743 */
+use plato;
+
+insert into Output
+select x
+from (select ListFromRange(0,100) as x)
+flatten by x
+order by x desc;
diff --git a/yt/yql/tests/sql/suites/order_by/literal_empty_list_sort.cfg b/yt/yql/tests/sql/suites/order_by/literal_empty_list_sort.cfg
new file mode 100644
index 0000000000..9b85bd0ae8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/literal_empty_list_sort.cfg
@@ -0,0 +1 @@
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/order_by/literal_empty_list_sort.sql b/yt/yql/tests/sql/suites/order_by/literal_empty_list_sort.sql
new file mode 100644
index 0000000000..ed51a6a4c2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/literal_empty_list_sort.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* multirun can not */
+/* syntax version 1 */
+use plato;
+
+$list = ListCreate(Struct<key:String, subkey:String, value:String>);
+
+insert into Output
+select * from as_table($list) order by key;
diff --git a/yt/yql/tests/sql/suites/order_by/literal_single_item_sort.cfg b/yt/yql/tests/sql/suites/order_by/literal_single_item_sort.cfg
new file mode 100644
index 0000000000..9b85bd0ae8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/literal_single_item_sort.cfg
@@ -0,0 +1 @@
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/order_by/literal_single_item_sort.sql b/yt/yql/tests/sql/suites/order_by/literal_single_item_sort.sql
new file mode 100644
index 0000000000..a928a89fd1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/literal_single_item_sort.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+/* multirun can not */
+/* syntax version 1 */
+use plato;
+
+$t = AsList(
+ AsStruct(1 as key, 101 as value)
+);
+
+insert into Output
+select * from as_table($t) order by key;
diff --git a/yt/yql/tests/sql/suites/order_by/literal_take_zero_sort.cfg b/yt/yql/tests/sql/suites/order_by/literal_take_zero_sort.cfg
new file mode 100644
index 0000000000..9b85bd0ae8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/literal_take_zero_sort.cfg
@@ -0,0 +1 @@
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/order_by/literal_take_zero_sort.sql b/yt/yql/tests/sql/suites/order_by/literal_take_zero_sort.sql
new file mode 100644
index 0000000000..18288547fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/literal_take_zero_sort.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+/* multirun can not */
+/* syntax version 1 */
+use plato;
+
+$t = AsList(
+ AsStruct(1 as key, 101 as value),
+ AsStruct(2 as key, 34 as value),
+ AsStruct(4 as key, 22 as value),
+ AsStruct(6 as key, 256 as value),
+ AsStruct(7 as key, 111 as value)
+);
+
+insert into Output
+select * from as_table($t) order by key limit 0;
diff --git a/yt/yql/tests/sql/suites/order_by/literal_with_assume.cfg b/yt/yql/tests/sql/suites/order_by/literal_with_assume.cfg
new file mode 100644
index 0000000000..9b85bd0ae8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/literal_with_assume.cfg
@@ -0,0 +1 @@
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/order_by/literal_with_assume.sql b/yt/yql/tests/sql/suites/order_by/literal_with_assume.sql
new file mode 100644
index 0000000000..5324313491
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/literal_with_assume.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+/* multirun can not */
+/* syntax version 1 */
+use plato;
+
+$t = AsList(
+ AsStruct(1 as key, 101 as value),
+ AsStruct(2 as key, 34 as value),
+ AsStruct(4 as key, 22 as value),
+ AsStruct(6 as key, 256 as value),
+ AsStruct(7 as key, 111 as value)
+);
+
+insert into Output
+select * from as_table($t) assume order by key;
diff --git a/yt/yql/tests/sql/suites/order_by/literal_with_assume_desc.cfg b/yt/yql/tests/sql/suites/order_by/literal_with_assume_desc.cfg
new file mode 100644
index 0000000000..9b85bd0ae8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/literal_with_assume_desc.cfg
@@ -0,0 +1 @@
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/order_by/literal_with_assume_desc.sql b/yt/yql/tests/sql/suites/order_by/literal_with_assume_desc.sql
new file mode 100644
index 0000000000..dd67c120a1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/literal_with_assume_desc.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+/* multirun can not */
+/* hybridfile can not YQL-17743 */
+/* syntax version 1 */
+use plato;
+
+insert into Output
+select x
+from (select ListFromRange(10,0,-1) as x)
+flatten by x
+assume order by x desc;
diff --git a/yt/yql/tests/sql/suites/order_by/native_desc_assume_with_transform.cfg b/yt/yql/tests/sql/suites/order_by/native_desc_assume_with_transform.cfg
new file mode 100644
index 0000000000..e40a99f9ab
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/native_desc_assume_with_transform.cfg
@@ -0,0 +1,3 @@
+in Input input2.txt
+out Output output.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/order_by/native_desc_assume_with_transform.sql b/yt/yql/tests/sql/suites/order_by/native_desc_assume_with_transform.sql
new file mode 100644
index 0000000000..7f7ea25d54
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/native_desc_assume_with_transform.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+/* multirun can not */
+/* syntax version 1 */
+USE plato;
+pragma yt.UseNativeDescSort;
+
+INSERT INTO Output
+SELECT
+ -(CAST(key as Int32) ?? 0) as key,
+ subkey,
+ value
+FROM Input
+ASSUME ORDER BY key DESC;
diff --git a/yt/yql/tests/sql/suites/order_by/native_desc_publish.cfg b/yt/yql/tests/sql/suites/order_by/native_desc_publish.cfg
new file mode 100644
index 0000000000..fccca71d35
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/native_desc_publish.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output output.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/order_by/native_desc_publish.sql b/yt/yql/tests/sql/suites/order_by/native_desc_publish.sql
new file mode 100644
index 0000000000..18bbffc0d6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/native_desc_publish.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+use plato;
+pragma yt.UseNativeDescSort;
+
+insert into Output
+select * from Input
+order by key desc;
+
+insert into Output
+select * from Input
+order by key desc;
diff --git a/yt/yql/tests/sql/suites/order_by/native_desc_sort-over_sorted.cfg b/yt/yql/tests/sql/suites/order_by/native_desc_sort-over_sorted.cfg
new file mode 100644
index 0000000000..1a2a7d1afc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/native_desc_sort-over_sorted.cfg
@@ -0,0 +1,3 @@
+in Input descending.txt
+out Output output.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/order_by/native_desc_sort.cfg b/yt/yql/tests/sql/suites/order_by/native_desc_sort.cfg
new file mode 100644
index 0000000000..fccca71d35
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/native_desc_sort.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output output.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/order_by/native_desc_sort.sql b/yt/yql/tests/sql/suites/order_by/native_desc_sort.sql
new file mode 100644
index 0000000000..5f8292ae08
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/native_desc_sort.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+use plato;
+pragma yt.UseNativeDescSort;
+
+insert into Output
+select * from Input
+order by key desc;
diff --git a/yt/yql/tests/sql/suites/order_by/native_desc_sort_calc.cfg b/yt/yql/tests/sql/suites/order_by/native_desc_sort_calc.cfg
new file mode 100644
index 0000000000..fccca71d35
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/native_desc_sort_calc.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output output.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/order_by/native_desc_sort_calc.sql b/yt/yql/tests/sql/suites/order_by/native_desc_sort_calc.sql
new file mode 100644
index 0000000000..3501a154d5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/native_desc_sort_calc.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+use plato;
+pragma yt.UseNativeDescSort;
+
+insert into Output
+select * from Input
+order by key || subkey desc, key desc;
diff --git a/yt/yql/tests/sql/suites/order_by/native_desc_sort_with_limit.cfg b/yt/yql/tests/sql/suites/order_by/native_desc_sort_with_limit.cfg
new file mode 100644
index 0000000000..fccca71d35
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/native_desc_sort_with_limit.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Output output.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/order_by/native_desc_sort_with_limit.sql b/yt/yql/tests/sql/suites/order_by/native_desc_sort_with_limit.sql
new file mode 100644
index 0000000000..6d4be0774b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/native_desc_sort_with_limit.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+use plato;
+pragma yt.UseNativeDescSort;
+
+insert into Output
+select * from Input
+order by key, subkey desc limit 3;
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_dot_column.sql b/yt/yql/tests/sql/suites/order_by/order_by_dot_column.sql
new file mode 100644
index 0000000000..b844b33900
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_dot_column.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+PRAGMA DisableSimpleColumns;
+SELECT 100500 as magic, t.* FROM plato.Input as t ORDER BY `t.subkey` DESC
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_dynum.sql b/yt/yql/tests/sql/suites/order_by/order_by_dynum.sql
new file mode 100644
index 0000000000..75b083db2b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_dynum.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* syntax version 1 */
+SELECT * FROM plato.Input ORDER BY CAST(key AS DyNumber);
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_dynum_desc.sql b/yt/yql/tests/sql/suites/order_by/order_by_dynum_desc.sql
new file mode 100644
index 0000000000..4229b9ccf3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_dynum_desc.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+/* syntax version 1 */
+SELECT * FROM plato.Input ORDER BY CAST(key AS DyNumber) DESC;
+
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_expr.cfg b/yt/yql/tests/sql/suites/order_by/order_by_expr.cfg
new file mode 100644
index 0000000000..c7e99df4d3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_expr.cfg
@@ -0,0 +1 @@
+in Input input_expr.txt
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_expr.sql b/yt/yql/tests/sql/suites/order_by/order_by_expr.sql
new file mode 100644
index 0000000000..ec5b1999e3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_expr.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select * from plato.Input as i order by cast(i.key as uint32) * cast(subkey as uint32) LIMIT 3;
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_expr_mul_cols.cfg b/yt/yql/tests/sql/suites/order_by/order_by_expr_mul_cols.cfg
new file mode 100644
index 0000000000..c7e99df4d3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_expr_mul_cols.cfg
@@ -0,0 +1 @@
+in Input input_expr.txt
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_expr_mul_cols.sql b/yt/yql/tests/sql/suites/order_by/order_by_expr_mul_cols.sql
new file mode 100644
index 0000000000..221cd5b9ee
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_expr_mul_cols.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select i.key, i.subkey from plato.Input as i order by cast(subkey as uint32), cast(i.key as uint32) * cast(i.subkey as uint32) desc LIMIT 3 OFFSET 4;
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_expr_over_sorted_table.cfg b/yt/yql/tests/sql/suites/order_by/order_by_expr_over_sorted_table.cfg
new file mode 100644
index 0000000000..fb5b1cca95
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_expr_over_sorted_table.cfg
@@ -0,0 +1,2 @@
+in Input sorted_table1.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_expr_over_sorted_table.sql b/yt/yql/tests/sql/suites/order_by/order_by_expr_over_sorted_table.sql
new file mode 100644
index 0000000000..34d9290737
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_expr_over_sorted_table.sql
@@ -0,0 +1,2 @@
+select key, value from plato.Input
+order by key, String::SplitToList(value, "$", 2 as Limit)[0]
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_expr_simple.cfg b/yt/yql/tests/sql/suites/order_by/order_by_expr_simple.cfg
new file mode 100644
index 0000000000..c7e99df4d3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_expr_simple.cfg
@@ -0,0 +1 @@
+in Input input_expr.txt
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_expr_simple.sql b/yt/yql/tests/sql/suites/order_by/order_by_expr_simple.sql
new file mode 100644
index 0000000000..a4a7d6ba92
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_expr_simple.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select * from plato.Input as i order by (cast(i.key as uint32) / 10) % 10 desc, subkey;
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_expr_with_deps.sql b/yt/yql/tests/sql/suites/order_by/order_by_expr_with_deps.sql
new file mode 100644
index 0000000000..581b50d142
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_expr_with_deps.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+
+$list = select ListSort(aggregate_list(key)) from Input;
+
+SELECT * FROM Input
+ORDER BY ListIndexOf($list ?? [], key);
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_list_of_strings.cfg b/yt/yql/tests/sql/suites/order_by/order_by_list_of_strings.cfg
new file mode 100644
index 0000000000..14e04a5467
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_list_of_strings.cfg
@@ -0,0 +1 @@
+in Input complex_type.txt
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_list_of_strings.sql b/yt/yql/tests/sql/suites/order_by/order_by_list_of_strings.sql
new file mode 100644
index 0000000000..26d888f98a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_list_of_strings.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+use plato;
+select key,value from Input order by value limit 1
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_missing_project_column.sql b/yt/yql/tests/sql/suites/order_by/order_by_missing_project_column.sql
new file mode 100644
index 0000000000..56b49f972f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_missing_project_column.sql
@@ -0,0 +1,11 @@
+use plato;
+
+select subkey from Input order by key, value;
+select subkey from Input order by "x" || key, value;
+select subkey from Input order by key || "x" limit 3;
+
+select subkey from Input as a order by "x" || key, a.value limit 3;
+select subkey from Input as a order by a.key, value limit 1;
+select subkey from Input as a order by key, value limit 2;
+
+select subkey, key from Input order by key, value;
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_mul_columns.sql b/yt/yql/tests/sql/suites/order_by/order_by_mul_columns.sql
new file mode 100644
index 0000000000..223e3f50fe
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_mul_columns.sql
@@ -0,0 +1 @@
+select key, subkey, value from plato.Input order by value, subkey; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_num_key_and_subkey.cfg b/yt/yql/tests/sql/suites/order_by/order_by_num_key_and_subkey.cfg
new file mode 100644
index 0000000000..96f3ef0db7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_num_key_and_subkey.cfg
@@ -0,0 +1 @@
+in Input avg_and_sum_by_value.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_num_key_and_subkey.sql b/yt/yql/tests/sql/suites/order_by/order_by_num_key_and_subkey.sql
new file mode 100644
index 0000000000..6a28c09401
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_num_key_and_subkey.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select cast(key as int) as key, subkey, value from plato.Input order by key, subkey; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_num_key_and_subkey_desc.cfg b/yt/yql/tests/sql/suites/order_by/order_by_num_key_and_subkey_desc.cfg
new file mode 100644
index 0000000000..96f3ef0db7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_num_key_and_subkey_desc.cfg
@@ -0,0 +1 @@
+in Input avg_and_sum_by_value.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_num_key_and_subkey_desc.sql b/yt/yql/tests/sql/suites/order_by/order_by_num_key_and_subkey_desc.sql
new file mode 100644
index 0000000000..0d49cf05d7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_num_key_and_subkey_desc.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select coalesce(cast(key as int), 0) as key, subkey, value from plato.Input order by key desc, subkey; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_tablepath_column.cfg b/yt/yql/tests/sql/suites/order_by/order_by_tablepath_column.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_tablepath_column.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_tablepath_column.sql b/yt/yql/tests/sql/suites/order_by/order_by_tablepath_column.sql
new file mode 100644
index 0000000000..cc9ffeba99
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_tablepath_column.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+use plato;
+select *
+from Input
+order by TablePath(), key;
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_tablerecord_column.cfg b/yt/yql/tests/sql/suites/order_by/order_by_tablerecord_column.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_tablerecord_column.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_tablerecord_column.sql b/yt/yql/tests/sql/suites/order_by/order_by_tablerecord_column.sql
new file mode 100644
index 0000000000..834527a065
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_tablerecord_column.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+select *
+from Input
+order by TableRecordIndex();
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_tablerow_column.cfg b/yt/yql/tests/sql/suites/order_by/order_by_tablerow_column.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_tablerow_column.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_tablerow_column.sql b/yt/yql/tests/sql/suites/order_by/order_by_tablerow_column.sql
new file mode 100644
index 0000000000..950374674c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_tablerow_column.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+use plato;
+select key
+from Input
+order by TableRow().key;
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_tuple.sql b/yt/yql/tests/sql/suites/order_by/order_by_tuple.sql
new file mode 100644
index 0000000000..8e33db8a2c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_tuple.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+USE plato;
+
+select * from (
+ select key, AsTuple(key, subkey) as tpl from Input
+) order by tpl;
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_tuple_and_member.sql b/yt/yql/tests/sql/suites/order_by/order_by_tuple_and_member.sql
new file mode 100644
index 0000000000..fecbcc7de3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_tuple_and_member.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+USE plato;
+
+select * from (
+ select key, AsTuple(key, subkey) as tpl from Input
+) order by key, tpl;
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_tuple_expr.sql b/yt/yql/tests/sql/suites/order_by/order_by_tuple_expr.sql
new file mode 100644
index 0000000000..cb2b0b538b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_tuple_expr.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+/* multirun can not */
+/* syntax version 1 */
+USE plato;
+
+$keys = ($key) -> {
+ return AsTuple($key, $key);
+};
+
+select * from Input order by $keys(value);
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_udf.cfg b/yt/yql/tests/sql/suites/order_by/order_by_udf.cfg
new file mode 100644
index 0000000000..677bf9308b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_udf.cfg
@@ -0,0 +1,2 @@
+in Input input2.txt
+udf math_udf
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_udf.sql b/yt/yql/tests/sql/suites/order_by/order_by_udf.sql
new file mode 100644
index 0000000000..998abf210b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_udf.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+SELECT *
+FROM plato.Input
+ORDER BY Math::Pow(cast(subkey as double), 2);
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_udf_duo.cfg b/yt/yql/tests/sql/suites/order_by/order_by_udf_duo.cfg
new file mode 100644
index 0000000000..677bf9308b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_udf_duo.cfg
@@ -0,0 +1,2 @@
+in Input input2.txt
+udf math_udf
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_udf_duo.sql b/yt/yql/tests/sql/suites/order_by/order_by_udf_duo.sql
new file mode 100644
index 0000000000..17032c0605
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_udf_duo.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+
+SELECT *
+FROM plato.Input
+ORDER BY Math::Pow(cast(subkey as double), 2), Math::Pow(cast(key as double), 2);
diff --git a/yt/yql/tests/sql/suites/order_by/order_by_value_desc.sql b/yt/yql/tests/sql/suites/order_by/order_by_value_desc.sql
new file mode 100644
index 0000000000..df3e4d9be0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_by_value_desc.sql
@@ -0,0 +1 @@
+select key, subkey, value from plato.Input order by value desc; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/order_by/order_with_null.sql b/yt/yql/tests/sql/suites/order_by/order_with_null.sql
new file mode 100644
index 0000000000..27171419c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/order_with_null.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+use plato;
+
+$input = (
+select null as key, "0" as subkey, "kkk" as value
+union all
+select * from Input
+);
+
+select * from $input order by key asc;
+select * from $input order by key desc;
diff --git a/yt/yql/tests/sql/suites/order_by/ordered_fill.cfg b/yt/yql/tests/sql/suites/order_by/ordered_fill.cfg
new file mode 100644
index 0000000000..9b85bd0ae8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/ordered_fill.cfg
@@ -0,0 +1 @@
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/order_by/ordered_fill.sql b/yt/yql/tests/sql/suites/order_by/ordered_fill.sql
new file mode 100644
index 0000000000..97ce0503f3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/ordered_fill.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+/* multirun can not */
+use plato;
+
+insert into Output
+select x from (select ListFromRange(0,100) as x) flatten by x order by x;
+
+commit;
+
+select * from Output where x=50; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/order_by/presort_order_by_table.sql b/yt/yql/tests/sql/suites/order_by/presort_order_by_table.sql
new file mode 100644
index 0000000000..9929a31017
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/presort_order_by_table.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+use plato;
+
+$list = AsList(
+ AsList(3,1),
+ AsList(1,1),
+ AsList(1),
+ );
+
+insert into @foo
+select x from (select $list as x)
+flatten by x;
+commit;
+select * from @foo
+order by x asc
diff --git a/yt/yql/tests/sql/suites/order_by/read_schema.txt.attr b/yt/yql/tests/sql/suites/order_by/read_schema.txt.attr
new file mode 100644
index 0000000000..3176be619e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/read_schema.txt.attr
@@ -0,0 +1,3 @@
+{
+ "_read_schema"=[{"type"="int64";"name"="a"};{"type"="uint64";"name"="b"};{"type"="double";"name"="c"};{"type"="string";"name"="d"};{"type"="boolean";name="e"};{"type"="any";"name"="f"}]
+}
diff --git a/yt/yql/tests/sql/suites/order_by/singular.sql b/yt/yql/tests/sql/suites/order_by/singular.sql
new file mode 100644
index 0000000000..8c22ab69f6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/singular.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+/* syntax version 1 */
+/* hybridfile can not YQL-17743 */
+use plato;
+
+insert into @foo
+select void() as x,null as y,[] as z,{} as w
+order by x,y,z,w;
+
+commit;
+
+select * from @foo;
diff --git a/yt/yql/tests/sql/suites/order_by/sort.cfg b/yt/yql/tests/sql/suites/order_by/sort.cfg
new file mode 100644
index 0000000000..c3d8fbb039
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/sort.cfg
@@ -0,0 +1 @@
+in Input unsorted.txt
diff --git a/yt/yql/tests/sql/suites/order_by/sort.sql b/yt/yql/tests/sql/suites/order_by/sort.sql
new file mode 100644
index 0000000000..37ceaff6de
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/sort.sql
@@ -0,0 +1 @@
+select * from plato.Input order by d, a, b, c;
diff --git a/yt/yql/tests/sql/suites/order_by/sort_decimals.cfg b/yt/yql/tests/sql/suites/order_by/sort_decimals.cfg
new file mode 100644
index 0000000000..1d2a5c3bce
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/sort_decimals.cfg
@@ -0,0 +1 @@
+in Input decimals.txt
diff --git a/yt/yql/tests/sql/suites/order_by/sort_decimals.sql b/yt/yql/tests/sql/suites/order_by/sort_decimals.sql
new file mode 100644
index 0000000000..5c250e1658
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/sort_decimals.sql
@@ -0,0 +1,4 @@
+select * from plato.Input order by Cast(c as Decimal(13,3));
+select * from plato.Input order by Cast(c as Decimal(13,3)) desc;
+select * from plato.Input order by Cast(d as Decimal(5,1));
+select * from plato.Input order by Cast(d as Decimal(5,1)) desc;
diff --git a/yt/yql/tests/sql/suites/order_by/sort_simple.cfg b/yt/yql/tests/sql/suites/order_by/sort_simple.cfg
new file mode 100644
index 0000000000..c3d8fbb039
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/sort_simple.cfg
@@ -0,0 +1 @@
+in Input unsorted.txt
diff --git a/yt/yql/tests/sql/suites/order_by/sort_simple.sql b/yt/yql/tests/sql/suites/order_by/sort_simple.sql
new file mode 100644
index 0000000000..8db149f8f4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/sort_simple.sql
@@ -0,0 +1,6 @@
+select a from plato.Input order by a;
+select b from plato.Input order by b;
+select c from plato.Input order by c;
+select d from plato.Input order by d;
+select e from plato.Input order by e;
+
diff --git a/yt/yql/tests/sql/suites/order_by/sort_with_take.cfg b/yt/yql/tests/sql/suites/order_by/sort_with_take.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/sort_with_take.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/order_by/sort_with_take.sql b/yt/yql/tests/sql/suites/order_by/sort_with_take.sql
new file mode 100644
index 0000000000..f728aecb00
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/sort_with_take.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+USE plato;
+
+insert into Output with truncate
+select * from (select * from Input limit 3)
+order by key;
diff --git a/yt/yql/tests/sql/suites/order_by/sort_with_take_limit.cfg b/yt/yql/tests/sql/suites/order_by/sort_with_take_limit.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/sort_with_take_limit.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/order_by/sort_with_take_limit.sql b/yt/yql/tests/sql/suites/order_by/sort_with_take_limit.sql
new file mode 100644
index 0000000000..a7b4e757e7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/sort_with_take_limit.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+USE plato;
+
+insert into Output with truncate
+select * from (select * from Input limit 3)
+order by key limit 2;
diff --git a/yt/yql/tests/sql/suites/order_by/sorted_table1.txt.attr b/yt/yql/tests/sql/suites/order_by/sorted_table1.txt.attr
new file mode 100644
index 0000000000..ba8118899c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/sorted_table1.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";];
+}}
+
diff --git a/yt/yql/tests/sql/suites/order_by/union_all.cfg b/yt/yql/tests/sql/suites/order_by/union_all.cfg
new file mode 100644
index 0000000000..de341b36d1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/union_all.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/order_by/union_all.sql b/yt/yql/tests/sql/suites/order_by/union_all.sql
new file mode 100644
index 0000000000..fce8866ddf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/union_all.sql
@@ -0,0 +1,21 @@
+USE plato;
+
+pragma DqEngine = "disable";
+
+DEFINE SUBQUERY $sample($product_type) AS
+
+ SELECT *
+ FROM Input
+ WHERE subkey = $product_type
+ ORDER BY key
+ LIMIT 10;
+
+END DEFINE;
+
+$list = ["a", "b"];
+$s = SubqueryUnionAllFor($list, $sample);
+$concated = PROCESS $s();
+
+INSERT INTO Output
+SELECT *
+FROM $concated \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/order_by/unsorted.txt.attr b/yt/yql/tests/sql/suites/order_by/unsorted.txt.attr
new file mode 100644
index 0000000000..3176be619e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/unsorted.txt.attr
@@ -0,0 +1,3 @@
+{
+ "_read_schema"=[{"type"="int64";"name"="a"};{"type"="uint64";"name"="b"};{"type"="double";"name"="c"};{"type"="string";"name"="d"};{"type"="boolean";name="e"};{"type"="any";"name"="f"}]
+}
diff --git a/yt/yql/tests/sql/suites/order_by/warn_offset_wo_sort.cfg b/yt/yql/tests/sql/suites/order_by/warn_offset_wo_sort.cfg
new file mode 100644
index 0000000000..8300ccd161
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/warn_offset_wo_sort.cfg
@@ -0,0 +1 @@
+in Input input_sorted.txt
diff --git a/yt/yql/tests/sql/suites/order_by/warn_offset_wo_sort.sql b/yt/yql/tests/sql/suites/order_by/warn_offset_wo_sort.sql
new file mode 100644
index 0000000000..7e7f146553
--- /dev/null
+++ b/yt/yql/tests/sql/suites/order_by/warn_offset_wo_sort.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+/* multirun can not */
+/* syntax version 1 */
+USE plato;
+
+select * from Input
+limit 5 offset 10;
diff --git a/yt/yql/tests/sql/suites/params/complex_yson.cfg b/yt/yql/tests/sql/suites/params/complex_yson.cfg
new file mode 100644
index 0000000000..bee766d276
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/complex_yson.cfg
@@ -0,0 +1 @@
+param $x p_yson2.json \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/complex_yson.sql b/yt/yql/tests/sql/suites/params/complex_yson.sql
new file mode 100644
index 0000000000..31c65f574e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/complex_yson.sql
@@ -0,0 +1,4 @@
+pragma yson.Strict;
+
+declare $x as Yson;
+select ToBytes(Yson::SerializePretty($x));
diff --git a/yt/yql/tests/sql/suites/params/default.cfg b/yt/yql/tests/sql/suites/params/default.cfg
new file mode 100644
index 0000000000..e68191f82c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/default.cfg
@@ -0,0 +1 @@
+in Input input.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_bool.json b/yt/yql/tests/sql/suites/params/p_bool.json
new file mode 100644
index 0000000000..f32a5804e2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_bool.json
@@ -0,0 +1 @@
+true \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_date.json b/yt/yql/tests/sql/suites/params/p_date.json
new file mode 100644
index 0000000000..00877b0f5d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_date.json
@@ -0,0 +1 @@
+"17563" \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_datetime.json b/yt/yql/tests/sql/suites/params/p_datetime.json
new file mode 100644
index 0000000000..38a1f5ac22
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_datetime.json
@@ -0,0 +1 @@
+"1517498177" \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_decimal.json b/yt/yql/tests/sql/suites/params/p_decimal.json
new file mode 100644
index 0000000000..8640e06c7f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_decimal.json
@@ -0,0 +1 @@
+"-9876.12345" \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_dict.json b/yt/yql/tests/sql/suites/params/p_dict.json
new file mode 100644
index 0000000000..524df1fc93
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_dict.json
@@ -0,0 +1 @@
+[["a1", "765"], ["a2", null]] \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_dict2.json b/yt/yql/tests/sql/suites/params/p_dict2.json
new file mode 100644
index 0000000000..2545ff38f6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_dict2.json
@@ -0,0 +1 @@
+{"a1": "765", "a2": null} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_double.json b/yt/yql/tests/sql/suites/params/p_double.json
new file mode 100644
index 0000000000..d37de39b8f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_double.json
@@ -0,0 +1 @@
+"-567.1234" \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_int64.json b/yt/yql/tests/sql/suites/params/p_int64.json
new file mode 100644
index 0000000000..45239526ac
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_int64.json
@@ -0,0 +1 @@
+"-21" \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_interval.json b/yt/yql/tests/sql/suites/params/p_interval.json
new file mode 100644
index 0000000000..80444e5c5b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_interval.json
@@ -0,0 +1 @@
+"-2509261088556" \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_json.json b/yt/yql/tests/sql/suites/params/p_json.json
new file mode 100644
index 0000000000..b77a55d7d7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_json.json
@@ -0,0 +1 @@
+"{\"b\": 321}" \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_list.json b/yt/yql/tests/sql/suites/params/p_list.json
new file mode 100644
index 0000000000..966d2f232e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_list.json
@@ -0,0 +1 @@
+["a1", null, "a2"] \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_null.json b/yt/yql/tests/sql/suites/params/p_null.json
new file mode 100644
index 0000000000..ec747fa47d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_null.json
@@ -0,0 +1 @@
+null \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_number_list.json b/yt/yql/tests/sql/suites/params/p_number_list.json
new file mode 100644
index 0000000000..fc4de450de
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_number_list.json
@@ -0,0 +1 @@
+["1", "2", "3"]
diff --git a/yt/yql/tests/sql/suites/params/p_string.json b/yt/yql/tests/sql/suites/params/p_string.json
new file mode 100644
index 0000000000..0f53da34fe
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_string.json
@@ -0,0 +1 @@
+"Moscow!" \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_string_bin.json b/yt/yql/tests/sql/suites/params/p_string_bin.json
new file mode 100644
index 0000000000..bcd48de1af
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_string_bin.json
@@ -0,0 +1 @@
+["AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w=="] \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_string_ru.json b/yt/yql/tests/sql/suites/params/p_string_ru.json
new file mode 100644
index 0000000000..4cc3538906
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_string_ru.json
@@ -0,0 +1 @@
+"Moscow Привет!" \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_struct.json b/yt/yql/tests/sql/suites/params/p_struct.json
new file mode 100644
index 0000000000..f4670c9c63
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_struct.json
@@ -0,0 +1 @@
+{"a": "42", "b": "\u043f\u0438\u0443-\u043f\u0438\u0443"} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_timestamp.json b/yt/yql/tests/sql/suites/params/p_timestamp.json
new file mode 100644
index 0000000000..f9655df825
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_timestamp.json
@@ -0,0 +1 @@
+"1517498177034567" \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_tuple1.json b/yt/yql/tests/sql/suites/params/p_tuple1.json
new file mode 100644
index 0000000000..6da1e94df1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_tuple1.json
@@ -0,0 +1 @@
+["a1", "765"] \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_tuple2.json b/yt/yql/tests/sql/suites/params/p_tuple2.json
new file mode 100644
index 0000000000..cbca0f6c6d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_tuple2.json
@@ -0,0 +1 @@
+["a2", null] \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_tzdate.json b/yt/yql/tests/sql/suites/params/p_tzdate.json
new file mode 100644
index 0000000000..2754f54f59
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_tzdate.json
@@ -0,0 +1 @@
+"2018-02-01,America/Los_Angeles" \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_tzdatetime.json b/yt/yql/tests/sql/suites/params/p_tzdatetime.json
new file mode 100644
index 0000000000..cd6da4aab5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_tzdatetime.json
@@ -0,0 +1 @@
+"2018-02-01T15:16:17,Europe/Moscow" \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_tztimestamp.json b/yt/yql/tests/sql/suites/params/p_tztimestamp.json
new file mode 100644
index 0000000000..da2fb8656c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_tztimestamp.json
@@ -0,0 +1 @@
+"2018-02-01T15:16:17.034567,GMT" \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_uint64.json b/yt/yql/tests/sql/suites/params/p_uint64.json
new file mode 100644
index 0000000000..3e71fa1475
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_uint64.json
@@ -0,0 +1 @@
+"21" \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_uuid.json b/yt/yql/tests/sql/suites/params/p_uuid.json
new file mode 100644
index 0000000000..505d02b045
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_uuid.json
@@ -0,0 +1 @@
+["AIQOVZvi1EGnFkRmVUQAAA=="] \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_variant1.json b/yt/yql/tests/sql/suites/params/p_variant1.json
new file mode 100644
index 0000000000..7c32328715
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_variant1.json
@@ -0,0 +1 @@
+["0", "abc"] \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_variant2.json b/yt/yql/tests/sql/suites/params/p_variant2.json
new file mode 100644
index 0000000000..8d709a2855
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_variant2.json
@@ -0,0 +1 @@
+["1", "789"] \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_variant3.json b/yt/yql/tests/sql/suites/params/p_variant3.json
new file mode 100644
index 0000000000..1240fbbeb4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_variant3.json
@@ -0,0 +1 @@
+["0", "hehe"] \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_variant4.json b/yt/yql/tests/sql/suites/params/p_variant4.json
new file mode 100644
index 0000000000..b614005aa3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_variant4.json
@@ -0,0 +1 @@
+["1", "119"] \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_variant5.json b/yt/yql/tests/sql/suites/params/p_variant5.json
new file mode 100644
index 0000000000..73a83a951a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_variant5.json
@@ -0,0 +1 @@
+[["a"], "foo"] \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_yson.json b/yt/yql/tests/sql/suites/params/p_yson.json
new file mode 100644
index 0000000000..2f5ffff984
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_yson.json
@@ -0,0 +1 @@
+{"a": 123} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/params/p_yson2.json b/yt/yql/tests/sql/suites/params/p_yson2.json
new file mode 100644
index 0000000000..fc31230362
--- /dev/null
+++ b/yt/yql/tests/sql/suites/params/p_yson2.json
@@ -0,0 +1,101 @@
+# import yt.yson as yson
+# bin_str = ''.join(map(chr, xrange(0, 255)))
+# s = yson.YsonString(bin_str)
+# s.attributes = yson.YsonMap({
+# 'a1': yson.YsonString('oops'),
+# 'a2': yson.YsonList([yson.YsonUint64(876), yson.YsonString('boom')])
+# })
+#
+# y = yson.YsonMap(
+# {
+# 'a': yson.YsonBoolean(True),
+# 'b': yson.YsonBoolean(False),
+# 'c': yson.YsonString('hello Москва'),
+# 'd': s,
+# 'x': yson.YsonDouble(-1.34),
+# 'y': yson.YsonDouble(float('nan')),
+# 'v': yson.YsonEntity(),
+# '$z': yson.YsonDouble(float('-inf')),
+# '$t': yson.YsonDouble(float('inf')),
+# '$$$e': yson.YsonMap(
+# {
+# '$f': yson.YsonString('hehe'),
+# '$$g': yson.YsonList([yson.YsonEntity(), yson.YsonInt64(-12345), yson.YsonUint64(9876)])
+# }
+# )
+# }
+# )
+#
+# x = YqlParameterValueBuilder.make_yson(y)
+# t = json.dumps(x.to_json(), sort_keys=True, indent=4)
+# import sys
+# sys.stderr.write(t)
+
+{
+ "$$$$e": {
+ "$$$g": [
+ null,
+ {
+ "$type": "int64",
+ "$value": "-12345"
+ },
+ {
+ "$type": "uint64",
+ "$value": "9876"
+ }
+ ],
+ "$$f": {
+ "$type": "string",
+ "$value": "hehe"
+ }
+ },
+ "$$t": {
+ "$type": "double",
+ "$value": "inf"
+ },
+ "$$z": {
+ "$type": "double",
+ "$value": "-inf"
+ },
+ "a": {
+ "$type": "boolean",
+ "$value": "true"
+ },
+ "b": {
+ "$type": "boolean",
+ "$value": "false"
+ },
+ "c": {
+ "$type": "string",
+ "$value": "hello \u00d0\u009c\u00d0\u00be\u00d1\u0081\u00d0\u00ba\u00d0\u00b2\u00d0\u00b0"
+ },
+ "d": {
+ "$attributes": {
+ "a1": {
+ "$type": "string",
+ "$value": "oops"
+ },
+ "a2": [
+ {
+ "$type": "uint64",
+ "$value": "876"
+ },
+ {
+ "$type": "string",
+ "$value": "boom"
+ }
+ ]
+ },
+ "$type": "string",
+ "$value": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u007f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u00de\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u00f0\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u00fe"
+ },
+ "v": null,
+ "x": {
+ "$type": "double",
+ "$value": "-1.34"
+ },
+ "y": {
+ "$type": "double",
+ "$value": "nan"
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/call_center.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/call_center.txt.attr
new file mode 100644
index 0000000000..397a5b6105
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/call_center.txt.attr
@@ -0,0 +1,37 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["cc_call_center_sk";["PgType";"int4";];];
+ ["cc_call_center_id";["PgType";"text";];];
+ ["cc_rec_start_date";["PgType";"date";];];
+ ["cc_rec_end_date";["PgType";"date";];];
+ ["cc_closed_date_sk";["PgType";"int4";];];
+ ["cc_open_date_sk";["PgType";"int4";];];
+ ["cc_name";["PgType";"text";];];
+ ["cc_class";["PgType";"text";];];
+ ["cc_employees";["PgType";"int4";];];
+ ["cc_sq_ft";["PgType";"int4";];];
+ ["cc_hours";["PgType";"text";];];
+ ["cc_manager";["PgType";"text";];];
+ ["cc_mkt_id";["PgType";"int4";];];
+ ["cc_mkt_class";["PgType";"text";];];
+ ["cc_mkt_desc";["PgType";"text";];];
+ ["cc_market_manager";["PgType";"text";];];
+ ["cc_division";["PgType";"int4";];];
+ ["cc_division_name";["PgType";"text";];];
+ ["cc_company";["PgType";"int4";];];
+ ["cc_company_name";["PgType";"text";];];
+ ["cc_street_number";["PgType";"text";];];
+ ["cc_street_name";["PgType";"text";];];
+ ["cc_street_type";["PgType";"text";];];
+ ["cc_suite_number";["PgType";"text";];];
+ ["cc_city";["PgType";"text";];];
+ ["cc_county";["PgType";"text";];];
+ ["cc_state";["PgType";"text";];];
+ ["cc_zip";["PgType";"text";];];
+ ["cc_country";["PgType";"text";];];
+ ["cc_gmt_offset";["PgType";"numeric";];];
+ ["cc_tax_percentage";["PgType";"numeric";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/catalog_page.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/catalog_page.txt.attr
new file mode 100644
index 0000000000..1de2694081
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/catalog_page.txt.attr
@@ -0,0 +1,15 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["cp_catalog_page_sk";["PgType";"int4";];];
+ ["cp_catalog_page_id";["PgType";"text";];];
+ ["cp_start_date_sk";["PgType";"int4";];];
+ ["cp_end_date_sk";["PgType";"int4";];];
+ ["cp_department";["PgType";"text";];];
+ ["cp_catalog_number";["PgType";"int4";];];
+ ["cp_catalog_page_number";["PgType";"int4";];];
+ ["cp_description";["PgType";"text";];];
+ ["cp_type";["PgType";"text";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/catalog_returns.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/catalog_returns.txt.attr
new file mode 100644
index 0000000000..209677594f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/catalog_returns.txt.attr
@@ -0,0 +1,33 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["cr_returned_date_sk";["PgType";"int4";];];
+ ["cr_returned_time_sk";["PgType";"int4";];];
+ ["cr_item_sk";["PgType";"int4";];];
+ ["cr_refunded_customer_sk";["PgType";"int4";];];
+ ["cr_refunded_cdemo_sk";["PgType";"int4";];];
+ ["cr_refunded_hdemo_sk";["PgType";"int4";];];
+ ["cr_refunded_addr_sk";["PgType";"int4";];];
+ ["cr_returning_customer_sk";["PgType";"int4";];];
+ ["cr_returning_cdemo_sk";["PgType";"int4";];];
+ ["cr_returning_hdemo_sk";["PgType";"int4";];];
+ ["cr_returning_addr_sk";["PgType";"int4";];];
+ ["cr_call_center_sk";["PgType";"int4";];];
+ ["cr_catalog_page_sk";["PgType";"int4";];];
+ ["cr_ship_mode_sk";["PgType";"int4";];];
+ ["cr_warehouse_sk";["PgType";"int4";];];
+ ["cr_reason_sk";["PgType";"int4";];];
+ ["cr_order_number";["PgType";"int4";];];
+ ["cr_return_quantity";["PgType";"int4";];];
+ ["cr_return_amount";["PgType";"numeric";];];
+ ["cr_return_tax";["PgType";"numeric";];];
+ ["cr_return_amt_inc_tax";["PgType";"numeric";];];
+ ["cr_fee";["PgType";"numeric";];];
+ ["cr_return_ship_cost";["PgType";"numeric";];];
+ ["cr_refunded_cash";["PgType";"numeric";];];
+ ["cr_reversed_charge";["PgType";"numeric";];];
+ ["cr_store_credit";["PgType";"numeric";];];
+ ["cr_net_loss";["PgType";"numeric";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/catalog_sales.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/catalog_sales.txt.attr
new file mode 100644
index 0000000000..3765f24437
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/catalog_sales.txt.attr
@@ -0,0 +1,40 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["cs_sold_date_sk";["PgType";"int4";];];
+ ["cs_sold_time_sk";["PgType";"int4";];];
+ ["cs_ship_date_sk";["PgType";"int4";];];
+ ["cs_bill_customer_sk";["PgType";"int4";];];
+ ["cs_bill_cdemo_sk";["PgType";"int4";];];
+ ["cs_bill_hdemo_sk";["PgType";"int4";];];
+ ["cs_bill_addr_sk";["PgType";"int4";];];
+ ["cs_ship_customer_sk";["PgType";"int4";];];
+ ["cs_ship_cdemo_sk";["PgType";"int4";];];
+ ["cs_ship_hdemo_sk";["PgType";"int4";];];
+ ["cs_ship_addr_sk";["PgType";"int4";];];
+ ["cs_call_center_sk";["PgType";"int4";];];
+ ["cs_catalog_page_sk";["PgType";"int4";];];
+ ["cs_ship_mode_sk";["PgType";"int4";];];
+ ["cs_warehouse_sk";["PgType";"int4";];];
+ ["cs_item_sk";["PgType";"int4";];];
+ ["cs_promo_sk";["PgType";"int4";];];
+ ["cs_order_number";["PgType";"int4";];];
+ ["cs_quantity";["PgType";"int4";];];
+ ["cs_wholesale_cost";["PgType";"numeric";];];
+ ["cs_list_price";["PgType";"numeric";];];
+ ["cs_sales_price";["PgType";"numeric";];];
+ ["cs_ext_discount_amt";["PgType";"numeric";];];
+ ["cs_ext_sales_price";["PgType";"numeric";];];
+ ["cs_ext_wholesale_cost";["PgType";"numeric";];];
+ ["cs_ext_list_price";["PgType";"numeric";];];
+ ["cs_ext_tax";["PgType";"numeric";];];
+ ["cs_coupon_amt";["PgType";"numeric";];];
+ ["cs_ext_ship_cost";["PgType";"numeric";];];
+ ["cs_net_paid";["PgType";"numeric";];];
+ ["cs_net_paid_inc_tax";["PgType";"numeric";];];
+ ["cs_net_paid_inc_ship";["PgType";"numeric";];];
+ ["cs_net_paid_inc_ship_tax";["PgType";"numeric";];];
+ ["cs_net_profit";["PgType";"numeric";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/customer.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/customer.txt.attr
new file mode 100644
index 0000000000..0994cf7951
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/customer.txt.attr
@@ -0,0 +1,24 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["c_customer_sk";["PgType";"int4";];];
+ ["c_customer_id";["PgType";"text";];];
+ ["c_current_cdemo_sk";["PgType";"int4";];];
+ ["c_current_hdemo_sk";["PgType";"int4";];];
+ ["c_current_addr_sk";["PgType";"int4";];];
+ ["c_first_shipto_date_sk";["PgType";"int4";];];
+ ["c_first_sales_date_sk";["PgType";"int4";];];
+ ["c_salutation";["PgType";"text";];];
+ ["c_first_name";["PgType";"text";];];
+ ["c_last_name";["PgType";"text";];];
+ ["c_preferred_cust_flag";["PgType";"text";];];
+ ["c_birth_day";["PgType";"int4";];];
+ ["c_birth_month";["PgType";"int4";];];
+ ["c_birth_year";["PgType";"int4";];];
+ ["c_birth_country";["PgType";"text";];];
+ ["c_login";["PgType";"text";];];
+ ["c_email_address";["PgType";"text";];];
+ ["c_last_review_date";["PgType";"text";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/customer_address.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/customer_address.txt.attr
new file mode 100644
index 0000000000..6bd1ce06c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/customer_address.txt.attr
@@ -0,0 +1,19 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["ca_address_sk";["PgType";"int4";];];
+ ["ca_address_id";["PgType";"text";];];
+ ["ca_street_number";["PgType";"text";];];
+ ["ca_street_name";["PgType";"text";];];
+ ["ca_street_type";["PgType";"text";];];
+ ["ca_suite_number";["PgType";"text";];];
+ ["ca_city";["PgType";"text";];];
+ ["ca_county";["PgType";"text";];];
+ ["ca_state";["PgType";"text";];];
+ ["ca_zip";["PgType";"text";];];
+ ["ca_country";["PgType";"text";];];
+ ["ca_gmt_offset";["PgType";"numeric";];];
+ ["ca_location_type";["PgType";"text";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/customer_demographics.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/customer_demographics.txt.attr
new file mode 100644
index 0000000000..6f106de2a7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/customer_demographics.txt.attr
@@ -0,0 +1,15 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["cd_demo_sk";["PgType";"int4";];];
+ ["cd_gender";["PgType";"text";];];
+ ["cd_marital_status";["PgType";"text";];];
+ ["cd_education_status";["PgType";"text";];];
+ ["cd_purchase_estimate";["PgType";"int4";];];
+ ["cd_credit_rating";["PgType";"text";];];
+ ["cd_dep_count";["PgType";"int4";];];
+ ["cd_dep_employed_count";["PgType";"int4";];];
+ ["cd_dep_college_count";["PgType";"int4";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/date_dim.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/date_dim.txt.attr
new file mode 100644
index 0000000000..fcead9adcc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/date_dim.txt.attr
@@ -0,0 +1,34 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["d_date_sk";["PgType";"int4";];];
+ ["d_date_id";["PgType";"text";];];
+ ["d_date";["PgType";"date";];];
+ ["d_month_seq";["PgType";"int4";];];
+ ["d_week_seq";["PgType";"int4";];];
+ ["d_quarter_seq";["PgType";"int4";];];
+ ["d_year";["PgType";"int4";];];
+ ["d_dow";["PgType";"int4";];];
+ ["d_moy";["PgType";"int4";];];
+ ["d_dom";["PgType";"int4";];];
+ ["d_qoy";["PgType";"int4";];];
+ ["d_fy_year";["PgType";"int4";];];
+ ["d_fy_quarter_seq";["PgType";"int4";];];
+ ["d_fy_week_seq";["PgType";"int4";];];
+ ["d_day_name";["PgType";"text";];];
+ ["d_quarter_name";["PgType";"text";];];
+ ["d_holiday";["PgType";"text";];];
+ ["d_weekend";["PgType";"text";];];
+ ["d_following_holiday";["PgType";"text";];];
+ ["d_first_dom";["PgType";"int4";];];
+ ["d_last_dom";["PgType";"int4";];];
+ ["d_same_day_ly";["PgType";"int4";];];
+ ["d_same_day_lq";["PgType";"int4";];];
+ ["d_current_day";["PgType";"text";];];
+ ["d_current_week";["PgType";"text";];];
+ ["d_current_month";["PgType";"text";];];
+ ["d_current_quarter";["PgType";"text";];];
+ ["d_current_year";["PgType";"text";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/default.cfg b/yt/yql/tests/sql/suites/pg-tpcds/default.cfg
new file mode 100644
index 0000000000..67c1396cb1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/default.cfg
@@ -0,0 +1,24 @@
+in call_center call_center.txt
+in catalog_page catalog_page.txt
+in catalog_returns catalog_returns.txt
+in catalog_sales catalog_sales.txt
+in customer customer.txt
+in customer_address customer_address.txt
+in customer_demographics customer_demographics.txt
+in date_dim date_dim.txt
+in household_demographics household_demographics.txt
+in income_band income_band.txt
+in inventory inventory.txt
+in item item.txt
+in promotion promotion.txt
+in reason reason.txt
+in ship_mode ship_mode.txt
+in store store.txt
+in store_returns store_returns.txt
+in store_sales store_sales.txt
+in time_dim time_dim.txt
+in warehouse warehouse.txt
+in web_page web_page.txt
+in web_returns web_returns.txt
+in web_sales web_sales.txt
+in web_site web_site.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/household_demographics.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/household_demographics.txt.attr
new file mode 100644
index 0000000000..c8ab25eb6d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/household_demographics.txt.attr
@@ -0,0 +1,11 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["hd_demo_sk";["PgType";"int4";];];
+ ["hd_income_band_sk";["PgType";"int4";];];
+ ["hd_buy_potential";["PgType";"text";];];
+ ["hd_dep_count";["PgType";"int4";];];
+ ["hd_vehicle_count";["PgType";"int4";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/income_band.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/income_band.txt.attr
new file mode 100644
index 0000000000..63310508f7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/income_band.txt.attr
@@ -0,0 +1,9 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["ib_income_band_sk";["PgType";"int4";];];
+ ["ib_lower_bound";["PgType";"int4";];];
+ ["ib_upper_bound";["PgType";"int4";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/inventory.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/inventory.txt.attr
new file mode 100644
index 0000000000..95f22bfd71
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/inventory.txt.attr
@@ -0,0 +1,10 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["inv_date_sk";["PgType";"int4";];];
+ ["inv_item_sk";["PgType";"int4";];];
+ ["inv_warehouse_sk";["PgType";"int4";];];
+ ["inv_quantity_on_hand";["PgType";"int4";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/item.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/item.txt.attr
new file mode 100644
index 0000000000..9d103928f0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/item.txt.attr
@@ -0,0 +1,28 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["i_item_sk";["PgType";"int4";];];
+ ["i_item_id";["PgType";"text";];];
+ ["i_rec_start_date";["PgType";"date";];];
+ ["i_rec_end_date";["PgType";"date";];];
+ ["i_item_desc";["PgType";"text";];];
+ ["i_current_price";["PgType";"numeric";];];
+ ["i_wholesale_cost";["PgType";"numeric";];];
+ ["i_brand_id";["PgType";"int4";];];
+ ["i_brand";["PgType";"text";];];
+ ["i_class_id";["PgType";"int4";];];
+ ["i_class";["PgType";"text";];];
+ ["i_category_id";["PgType";"int4";];];
+ ["i_category";["PgType";"text";];];
+ ["i_manufact_id";["PgType";"int4";];];
+ ["i_manufact";["PgType";"text";];];
+ ["i_size";["PgType";"text";];];
+ ["i_formulation";["PgType";"text";];];
+ ["i_color";["PgType";"text";];];
+ ["i_units";["PgType";"text";];];
+ ["i_container";["PgType";"text";];];
+ ["i_manager_id";["PgType";"int4";];];
+ ["i_product_name";["PgType";"text";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/promotion.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/promotion.txt.attr
new file mode 100644
index 0000000000..7db23f7b1b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/promotion.txt.attr
@@ -0,0 +1,25 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["p_promo_sk";["PgType";"int4";];];
+ ["p_promo_id";["PgType";"text";];];
+ ["p_start_date_sk";["PgType";"int4";];];
+ ["p_end_date_sk";["PgType";"int4";];];
+ ["p_item_sk";["PgType";"int4";];];
+ ["p_cost";["PgType";"numeric";];];
+ ["p_response_target";["PgType";"int4";];];
+ ["p_promo_name";["PgType";"text";];];
+ ["p_channel_dmail";["PgType";"text";];];
+ ["p_channel_email";["PgType";"text";];];
+ ["p_channel_catalog";["PgType";"text";];];
+ ["p_channel_tv";["PgType";"text";];];
+ ["p_channel_radio";["PgType";"text";];];
+ ["p_channel_press";["PgType";"text";];];
+ ["p_channel_event";["PgType";"text";];];
+ ["p_channel_demo";["PgType";"text";];];
+ ["p_channel_details";["PgType";"text";];];
+ ["p_purpose";["PgType";"text";];];
+ ["p_discount_active";["PgType";"text";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q01.sql b/yt/yql/tests/sql/suites/pg-tpcds/q01.sql
new file mode 100644
index 0000000000..7e40034da4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q01.sql
@@ -0,0 +1,28 @@
+--!syntax_pg
+--TPC-DS Q1
+
+-- start query 1 in stream 0 using template ../query_templates/query1.tpl
+with customer_total_return as
+(select sr_customer_sk as ctr_customer_sk
+,sr_store_sk as ctr_store_sk
+,sum(sr_fee) as ctr_total_return
+from plato.store_returns
+,plato.date_dim
+where sr_returned_date_sk = d_date_sk
+and d_year =2000
+group by sr_customer_sk
+,sr_store_sk)
+ select c_customer_id
+from customer_total_return ctr1
+,plato.store
+,plato.customer
+where ctr1.ctr_total_return > (select avg(ctr_total_return)*1.2::numeric
+from customer_total_return ctr2
+where ctr1.ctr_store_sk = ctr2.ctr_store_sk)
+and s_store_sk = ctr1.ctr_store_sk
+and s_state = 'TN'
+and ctr1.ctr_customer_sk = c_customer_sk
+order by c_customer_id
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query1.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q02.sql b/yt/yql/tests/sql/suites/pg-tpcds/q02.sql
new file mode 100644
index 0000000000..0b1e03a631
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q02.sql
@@ -0,0 +1,63 @@
+--!syntax_pg
+--TPC-DS Q2
+
+-- start query 1 in stream 0 using template ../query_templates/query2.tpl
+with wscs as
+ (select sold_date_sk
+ ,sales_price
+ from (select ws_sold_date_sk sold_date_sk
+ ,ws_ext_sales_price sales_price
+ from plato.web_sales
+ union all
+ select cs_sold_date_sk sold_date_sk
+ ,cs_ext_sales_price sales_price
+ from plato.catalog_sales) a),
+ wswscs as
+ (select d_week_seq,
+ sum(case when (d_day_name='Sunday') then sales_price else null::numeric end) sun_sales,
+ sum(case when (d_day_name='Monday') then sales_price else null::numeric end) mon_sales,
+ sum(case when (d_day_name='Tuesday') then sales_price else null::numeric end) tue_sales,
+ sum(case when (d_day_name='Wednesday') then sales_price else null::numeric end) wed_sales,
+ sum(case when (d_day_name='Thursday') then sales_price else null::numeric end) thu_sales,
+ sum(case when (d_day_name='Friday') then sales_price else null::numeric end) fri_sales,
+ sum(case when (d_day_name='Saturday') then sales_price else null::numeric end) sat_sales
+ from wscs
+ ,plato.date_dim
+ where d_date_sk = sold_date_sk
+ group by d_week_seq)
+ select d_week_seq1
+ ,round(sun_sales1/sun_sales2,2) r1
+ ,round(mon_sales1/mon_sales2,2) r2
+ ,round(tue_sales1/tue_sales2,2) r3
+ ,round(wed_sales1/wed_sales2,2) r4
+ ,round(thu_sales1/thu_sales2,2) r5
+ ,round(fri_sales1/fri_sales2,2) r6
+ ,round(sat_sales1/sat_sales2,2) r7
+ from
+ (select wswscs.d_week_seq d_week_seq1
+ ,sun_sales sun_sales1
+ ,mon_sales mon_sales1
+ ,tue_sales tue_sales1
+ ,wed_sales wed_sales1
+ ,thu_sales thu_sales1
+ ,fri_sales fri_sales1
+ ,sat_sales sat_sales1
+ from wswscs,plato.date_dim
+ where date_dim.d_week_seq = wswscs.d_week_seq and
+ d_year = 2001) y,
+ (select wswscs.d_week_seq d_week_seq2
+ ,sun_sales sun_sales2
+ ,mon_sales mon_sales2
+ ,tue_sales tue_sales2
+ ,wed_sales wed_sales2
+ ,thu_sales thu_sales2
+ ,fri_sales fri_sales2
+ ,sat_sales sat_sales2
+ from wswscs
+ ,plato.date_dim
+ where date_dim.d_week_seq = wswscs.d_week_seq and
+ d_year = 2001+1) z
+ where d_week_seq1=d_week_seq2-53
+ order by d_week_seq1;
+
+-- end query 1 in stream 0 using template ../query_templates/query2.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q03.sql b/yt/yql/tests/sql/suites/pg-tpcds/q03.sql
new file mode 100644
index 0000000000..58a82aad56
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q03.sql
@@ -0,0 +1,24 @@
+--!syntax_pg
+--TPC-DS Q3
+
+-- start query 1 in stream 0 using template ../query_templates/query3.tpl
+select dt.d_year
+ ,item.i_brand_id brand_id
+ ,item.i_brand brand
+ ,sum(ss_ext_sales_price) sum_agg
+ from plato.date_dim dt
+ ,plato.store_sales
+ ,plato.item
+ where dt.d_date_sk = store_sales.ss_sold_date_sk
+ and store_sales.ss_item_sk = item.i_item_sk
+ and item.i_manufact_id = 436
+ and dt.d_moy=12
+ group by dt.d_year
+ ,item.i_brand
+ ,item.i_brand_id
+ order by dt.d_year
+ ,sum_agg desc
+ ,brand_id
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query3.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q04.sql b/yt/yql/tests/sql/suites/pg-tpcds/q04.sql
new file mode 100644
index 0000000000..88e5ffdb32
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q04.sql
@@ -0,0 +1,119 @@
+--!syntax_pg
+--TPC-DS Q4
+
+-- start query 1 in stream 0 using template ../query_templates/query4.tpl
+with year_total as (
+ select c_customer_id customer_id
+ ,c_first_name customer_first_name
+ ,c_last_name customer_last_name
+ ,c_preferred_cust_flag customer_preferred_cust_flag
+ ,c_birth_country customer_birth_country
+ ,c_login customer_login
+ ,c_email_address customer_email_address
+ ,d_year dyear
+ ,sum(((ss_ext_list_price-ss_ext_wholesale_cost-ss_ext_discount_amt)+ss_ext_sales_price)/2::numeric) year_total
+ ,'s' sale_type
+ from plato.customer
+ ,plato.store_sales
+ ,plato.date_dim
+ where c_customer_sk = ss_customer_sk
+ and ss_sold_date_sk = d_date_sk
+ group by c_customer_id
+ ,c_first_name
+ ,c_last_name
+ ,c_preferred_cust_flag
+ ,c_birth_country
+ ,c_login
+ ,c_email_address
+ ,d_year
+ union all
+ select c_customer_id customer_id
+ ,c_first_name customer_first_name
+ ,c_last_name customer_last_name
+ ,c_preferred_cust_flag customer_preferred_cust_flag
+ ,c_birth_country customer_birth_country
+ ,c_login customer_login
+ ,c_email_address customer_email_address
+ ,d_year dyear
+ ,sum((((cs_ext_list_price-cs_ext_wholesale_cost-cs_ext_discount_amt)+cs_ext_sales_price)/2::numeric) ) year_total
+ ,'c' sale_type
+ from plato.customer
+ ,plato.catalog_sales
+ ,plato.date_dim
+ where c_customer_sk = cs_bill_customer_sk
+ and cs_sold_date_sk = d_date_sk
+ group by c_customer_id
+ ,c_first_name
+ ,c_last_name
+ ,c_preferred_cust_flag
+ ,c_birth_country
+ ,c_login
+ ,c_email_address
+ ,d_year
+union all
+ select c_customer_id customer_id
+ ,c_first_name customer_first_name
+ ,c_last_name customer_last_name
+ ,c_preferred_cust_flag customer_preferred_cust_flag
+ ,c_birth_country customer_birth_country
+ ,c_login customer_login
+ ,c_email_address customer_email_address
+ ,d_year dyear
+ ,sum((((ws_ext_list_price-ws_ext_wholesale_cost-ws_ext_discount_amt)+ws_ext_sales_price)/2::numeric) ) year_total
+ ,'w' sale_type
+ from plato.customer
+ ,plato.web_sales
+ ,plato.date_dim
+ where c_customer_sk = ws_bill_customer_sk
+ and ws_sold_date_sk = d_date_sk
+ group by c_customer_id
+ ,c_first_name
+ ,c_last_name
+ ,c_preferred_cust_flag
+ ,c_birth_country
+ ,c_login
+ ,c_email_address
+ ,d_year
+ )
+ select
+ t_s_secyear.customer_id
+ ,t_s_secyear.customer_first_name
+ ,t_s_secyear.customer_last_name
+ ,t_s_secyear.customer_email_address
+ from year_total t_s_firstyear
+ ,year_total t_s_secyear
+ ,year_total t_c_firstyear
+ ,year_total t_c_secyear
+ ,year_total t_w_firstyear
+ ,year_total t_w_secyear
+ where t_s_secyear.customer_id = t_s_firstyear.customer_id
+ and t_s_firstyear.customer_id = t_c_secyear.customer_id
+ and t_s_firstyear.customer_id = t_c_firstyear.customer_id
+ and t_s_firstyear.customer_id = t_w_firstyear.customer_id
+ and t_s_firstyear.customer_id = t_w_secyear.customer_id
+ and t_s_firstyear.sale_type = 's'
+ and t_c_firstyear.sale_type = 'c'
+ and t_w_firstyear.sale_type = 'w'
+ and t_s_secyear.sale_type = 's'
+ and t_c_secyear.sale_type = 'c'
+ and t_w_secyear.sale_type = 'w'
+ and t_s_firstyear.dyear = 2001
+ and t_s_secyear.dyear = 2001+1
+ and t_c_firstyear.dyear = 2001
+ and t_c_secyear.dyear = 2001+1
+ and t_w_firstyear.dyear = 2001
+ and t_w_secyear.dyear = 2001+1
+ and t_s_firstyear.year_total > 0::numeric
+ and t_c_firstyear.year_total > 0::numeric
+ and t_w_firstyear.year_total > 0::numeric
+ and case when t_c_firstyear.year_total > 0::numeric then t_c_secyear.year_total / t_c_firstyear.year_total else null::numeric end
+ > case when t_s_firstyear.year_total > 0::numeric then t_s_secyear.year_total / t_s_firstyear.year_total else null::numeric end
+ and case when t_c_firstyear.year_total > 0::numeric then t_c_secyear.year_total / t_c_firstyear.year_total else null::numeric end
+ > case when t_w_firstyear.year_total > 0::numeric then t_w_secyear.year_total / t_w_firstyear.year_total else null::numeric end
+ order by t_s_secyear.customer_id
+ ,t_s_secyear.customer_first_name
+ ,t_s_secyear.customer_last_name
+ ,t_s_secyear.customer_email_address
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query4.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q05.sql b/yt/yql/tests/sql/suites/pg-tpcds/q05.sql
new file mode 100644
index 0000000000..9601785498
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q05.sql
@@ -0,0 +1,131 @@
+--!syntax_pg
+--TPC-DS Q5
+
+-- start query 1 in stream 0 using template ../query_templates/query5.tpl
+with ssr as
+ (select s_store_id,
+ sum(sales_price) as sales,
+ sum(profit) as profit,
+ sum(return_amt) as returns,
+ sum(net_loss) as profit_loss
+ from
+ ( select ss_store_sk as store_sk,
+ ss_sold_date_sk as date_sk,
+ ss_ext_sales_price as sales_price,
+ ss_net_profit as profit,
+ cast(0 as decimal(7,2)) as return_amt,
+ cast(0 as decimal(7,2)) as net_loss
+ from plato.store_sales
+ union all
+ select sr_store_sk as store_sk,
+ sr_returned_date_sk as date_sk,
+ cast(0 as decimal(7,2)) as sales_price,
+ cast(0 as decimal(7,2)) as profit,
+ sr_return_amt as return_amt,
+ sr_net_loss as net_loss
+ from plato.store_returns
+ ) salesreturns,
+ plato.date_dim,
+ plato.store
+ where date_sk = d_date_sk
+ and d_date between cast('1998-08-04' as date)
+ and (cast('1998-08-04' as date) + interval '14' day)::date
+ and store_sk = s_store_sk
+ group by s_store_id)
+ ,
+ csr as
+ (select cp_catalog_page_id,
+ sum(sales_price) as sales,
+ sum(profit) as profit,
+ sum(return_amt) as returns,
+ sum(net_loss) as profit_loss
+ from
+ ( select cs_catalog_page_sk as page_sk,
+ cs_sold_date_sk as date_sk,
+ cs_ext_sales_price as sales_price,
+ cs_net_profit as profit,
+ cast(0 as decimal(7,2)) as return_amt,
+ cast(0 as decimal(7,2)) as net_loss
+ from plato.catalog_sales
+ union all
+ select cr_catalog_page_sk as page_sk,
+ cr_returned_date_sk as date_sk,
+ cast(0 as decimal(7,2)) as sales_price,
+ cast(0 as decimal(7,2)) as profit,
+ cr_return_amount as return_amt,
+ cr_net_loss as net_loss
+ from plato.catalog_returns
+ ) salesreturns,
+ plato.date_dim,
+ plato.catalog_page
+ where date_sk = d_date_sk
+ and d_date between cast('1998-08-04' as date)
+ and (cast('1998-08-04' as date) + interval '14' day)::date
+ and page_sk = cp_catalog_page_sk
+ group by cp_catalog_page_id)
+ ,
+ wsr as
+ (select web_site_id,
+ sum(sales_price) as sales,
+ sum(profit) as profit,
+ sum(return_amt) as returns,
+ sum(net_loss) as profit_loss
+ from
+ ( select ws_web_site_sk as wsr_web_site_sk,
+ ws_sold_date_sk as date_sk,
+ ws_ext_sales_price as sales_price,
+ ws_net_profit as profit,
+ cast(0 as decimal(7,2)) as return_amt,
+ cast(0 as decimal(7,2)) as net_loss
+ from plato.web_sales
+ union all
+ select ws_web_site_sk as wsr_web_site_sk,
+ wr_returned_date_sk as date_sk,
+ cast(0 as decimal(7,2)) as sales_price,
+ cast(0 as decimal(7,2)) as profit,
+ wr_return_amt as return_amt,
+ wr_net_loss as net_loss
+ from plato.web_returns left outer join plato.web_sales on
+ ( wr_item_sk = ws_item_sk
+ and wr_order_number = ws_order_number)
+ ) salesreturns,
+ plato.date_dim,
+ plato.web_site
+ where date_sk = d_date_sk
+ and d_date between cast('1998-08-04' as date)
+ and (cast('1998-08-04' as date) + interval '14' day)::date
+ and wsr_web_site_sk = web_site_sk
+ group by web_site_id)
+ select channel
+ , id
+ , sum(sales) as sales
+ , sum(returns) as returns
+ , sum(profit) as profit
+ from
+ (select 'store channel' as channel
+ , 'store' || s_store_id as id
+ , sales
+ , returns
+ , (profit - profit_loss) as profit
+ from ssr
+ union all
+ select 'catalog channel' as channel
+ , 'catalog_page' || cp_catalog_page_id as id
+ , sales
+ , returns
+ , (profit - profit_loss) as profit
+ from csr
+ union all
+ select 'web channel' as channel
+ , 'web_site' || web_site_id as id
+ , sales
+ , returns
+ , (profit - profit_loss) as profit
+ from wsr
+ ) x
+ group by rollup (channel, id)
+ order by channel
+ ,id
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query5.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q06.sql b/yt/yql/tests/sql/suites/pg-tpcds/q06.sql
new file mode 100644
index 0000000000..045e74df82
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q06.sql
@@ -0,0 +1,29 @@
+--!syntax_pg
+--TPC-DS Q6
+
+-- start query 1 in stream 0 using template ../query_templates/query6.tpl
+select a.ca_state state, count(*) cnt
+ from plato.customer_address a
+ ,plato.customer c
+ ,plato.store_sales s
+ ,plato.date_dim d
+ ,plato.item i
+ where a.ca_address_sk = c.c_current_addr_sk
+ and c.c_customer_sk = s.ss_customer_sk
+ and s.ss_sold_date_sk = d.d_date_sk
+ and s.ss_item_sk = i.i_item_sk
+ and d.d_month_seq =
+ (select distinct (d_month_seq)
+ from plato.date_dim
+ where d_year = 2000
+ and d_moy = 2 )
+ and i.i_current_price > 1.2::numeric *
+ (select avg(j.i_current_price)
+ from plato.item j
+ where j.i_category = i.i_category)
+ group by a.ca_state
+ having count(*) >= 10
+ order by cnt, a.ca_state
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query6.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q07.sql b/yt/yql/tests/sql/suites/pg-tpcds/q07.sql
new file mode 100644
index 0000000000..909507305f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q07.sql
@@ -0,0 +1,24 @@
+--!syntax_pg
+--TPC-DS Q7
+
+-- start query 1 in stream 0 using template ../query_templates/query7.tpl
+select i_item_id,
+ avg(ss_quantity) agg1,
+ avg(ss_list_price) agg2,
+ avg(ss_coupon_amt) agg3,
+ avg(ss_sales_price) agg4
+ from plato.store_sales, plato.customer_demographics, plato.date_dim, plato.item, plato.promotion
+ where ss_sold_date_sk = d_date_sk and
+ ss_item_sk = i_item_sk and
+ ss_cdemo_sk = cd_demo_sk and
+ ss_promo_sk = p_promo_sk and
+ cd_gender = 'F' and
+ cd_marital_status = 'W' and
+ cd_education_status = 'Primary' and
+ (p_channel_email = 'N' or p_channel_event = 'N') and
+ d_year = 1998
+ group by i_item_id
+ order by i_item_id
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query7.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q08.sql b/yt/yql/tests/sql/suites/pg-tpcds/q08.sql
new file mode 100644
index 0000000000..7041a81acc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q08.sql
@@ -0,0 +1,111 @@
+--!syntax_pg
+--TPC-DS Q8
+
+-- start query 1 in stream 0 using template ../query_templates/query8.tpl
+select s_store_name
+ ,sum(ss_net_profit)
+ from plato.store_sales
+ ,plato.date_dim
+ ,plato.store,
+ (select ca_zip
+ from (
+ SELECT substr(ca_zip,1,5) ca_zip
+ FROM plato.customer_address
+ WHERE substr(ca_zip,1,5) IN (
+ '89436','30868','65085','22977','83927','77557',
+ '58429','40697','80614','10502','32779',
+ '91137','61265','98294','17921','18427',
+ '21203','59362','87291','84093','21505',
+ '17184','10866','67898','25797','28055',
+ '18377','80332','74535','21757','29742',
+ '90885','29898','17819','40811','25990',
+ '47513','89531','91068','10391','18846',
+ '99223','82637','41368','83658','86199',
+ '81625','26696','89338','88425','32200',
+ '81427','19053','77471','36610','99823',
+ '43276','41249','48584','83550','82276',
+ '18842','78890','14090','38123','40936',
+ '34425','19850','43286','80072','79188',
+ '54191','11395','50497','84861','90733',
+ '21068','57666','37119','25004','57835',
+ '70067','62878','95806','19303','18840',
+ '19124','29785','16737','16022','49613',
+ '89977','68310','60069','98360','48649',
+ '39050','41793','25002','27413','39736',
+ '47208','16515','94808','57648','15009',
+ '80015','42961','63982','21744','71853',
+ '81087','67468','34175','64008','20261',
+ '11201','51799','48043','45645','61163',
+ '48375','36447','57042','21218','41100',
+ '89951','22745','35851','83326','61125',
+ '78298','80752','49858','52940','96976',
+ '63792','11376','53582','18717','90226',
+ '50530','94203','99447','27670','96577',
+ '57856','56372','16165','23427','54561',
+ '28806','44439','22926','30123','61451',
+ '92397','56979','92309','70873','13355',
+ '21801','46346','37562','56458','28286',
+ '47306','99555','69399','26234','47546',
+ '49661','88601','35943','39936','25632',
+ '24611','44166','56648','30379','59785',
+ '11110','14329','93815','52226','71381',
+ '13842','25612','63294','14664','21077',
+ '82626','18799','60915','81020','56447',
+ '76619','11433','13414','42548','92713',
+ '70467','30884','47484','16072','38936',
+ '13036','88376','45539','35901','19506',
+ '65690','73957','71850','49231','14276',
+ '20005','18384','76615','11635','38177',
+ '55607','41369','95447','58581','58149',
+ '91946','33790','76232','75692','95464',
+ '22246','51061','56692','53121','77209',
+ '15482','10688','14868','45907','73520',
+ '72666','25734','17959','24677','66446',
+ '94627','53535','15560','41967','69297',
+ '11929','59403','33283','52232','57350',
+ '43933','40921','36635','10827','71286',
+ '19736','80619','25251','95042','15526',
+ '36496','55854','49124','81980','35375',
+ '49157','63512','28944','14946','36503',
+ '54010','18767','23969','43905','66979',
+ '33113','21286','58471','59080','13395',
+ '79144','70373','67031','38360','26705',
+ '50906','52406','26066','73146','15884',
+ '31897','30045','61068','45550','92454',
+ '13376','14354','19770','22928','97790',
+ '50723','46081','30202','14410','20223',
+ '88500','67298','13261','14172','81410',
+ '93578','83583','46047','94167','82564',
+ '21156','15799','86709','37931','74703',
+ '83103','23054','70470','72008','49247',
+ '91911','69998','20961','70070','63197',
+ '54853','88191','91830','49521','19454',
+ '81450','89091','62378','25683','61869',
+ '51744','36580','85778','36871','48121',
+ '28810','83712','45486','67393','26935',
+ '42393','20132','55349','86057','21309',
+ '80218','10094','11357','48819','39734',
+ '40758','30432','21204','29467','30214',
+ '61024','55307','74621','11622','68908',
+ '33032','52868','99194','99900','84936',
+ '69036','99149','45013','32895','59004',
+ '32322','14933','32936','33562','72550',
+ '27385','58049','58200','16808','21360',
+ '32961','18586','79307','15492')
+ intersect
+ select ca_zip
+ from (SELECT substr(ca_zip,1,5) ca_zip,count(*) cnt
+ FROM plato.customer_address, plato.customer
+ WHERE ca_address_sk = c_current_addr_sk and
+ c_preferred_cust_flag='Y'
+ group by ca_zip
+ having count(*) > 10)A1)A2) V1
+ where ss_store_sk = s_store_sk
+ and ss_sold_date_sk = d_date_sk
+ and d_qoy = 1 and d_year = 2002
+ and (substr(s_zip,1,2) = substr(V1.ca_zip,1,2))
+ group by s_store_name
+ order by s_store_name
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query8.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q09.sql b/yt/yql/tests/sql/suites/pg-tpcds/q09.sql
new file mode 100644
index 0000000000..11b75aa231
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q09.sql
@@ -0,0 +1,54 @@
+--!syntax_pg
+--TPC-DS Q9
+
+-- start query 1 in stream 0 using template ../query_templates/query9.tpl
+select case when (select count(*)
+ from plato.store_sales
+ where ss_quantity between 1 and 20) > 25437
+ then (select avg(ss_ext_discount_amt)
+ from plato.store_sales
+ where ss_quantity between 1 and 20)
+ else (select avg(ss_net_profit)
+ from plato.store_sales
+ where ss_quantity between 1 and 20) end bucket1 ,
+ case when (select count(*)
+ from plato.store_sales
+ where ss_quantity between 21 and 40) > 22746
+ then (select avg(ss_ext_discount_amt)
+ from plato.store_sales
+ where ss_quantity between 21 and 40)
+ else (select avg(ss_net_profit)
+ from plato.store_sales
+ where ss_quantity between 21 and 40) end bucket2,
+ case when (select count(*)
+ from plato.store_sales
+ where ss_quantity between 41 and 60) > 9387
+ then (select avg(ss_ext_discount_amt)
+ from plato.store_sales
+ where ss_quantity between 41 and 60)
+ else (select avg(ss_net_profit)
+ from plato.store_sales
+ where ss_quantity between 41 and 60) end bucket3,
+ case when (select count(*)
+ from plato.store_sales
+ where ss_quantity between 61 and 80) > 10098
+ then (select avg(ss_ext_discount_amt)
+ from plato.store_sales
+ where ss_quantity between 61 and 80)
+ else (select avg(ss_net_profit)
+ from plato.store_sales
+ where ss_quantity between 61 and 80) end bucket4,
+ case when (select count(*)
+ from plato.store_sales
+ where ss_quantity between 81 and 100) > 18213
+ then (select avg(ss_ext_discount_amt)
+ from plato.store_sales
+ where ss_quantity between 81 and 100)
+ else (select avg(ss_net_profit)
+ from plato.store_sales
+ where ss_quantity between 81 and 100) end bucket5
+from plato.reason
+where r_reason_sk = 1
+;
+
+-- end query 1 in stream 0 using template ../query_templates/query9.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q10.sql b/yt/yql/tests/sql/suites/pg-tpcds/q10.sql
new file mode 100644
index 0000000000..4295edb76e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q10.sql
@@ -0,0 +1,62 @@
+--!syntax_pg
+--TPC-DS Q10
+
+-- start query 1 in stream 0 using template ../query_templates/query10.tpl
+select
+ cd_gender,
+ cd_marital_status,
+ cd_education_status,
+ count(*) cnt1,
+ cd_purchase_estimate,
+ count(*) cnt2,
+ cd_credit_rating,
+ count(*) cnt3,
+ cd_dep_count,
+ count(*) cnt4,
+ cd_dep_employed_count,
+ count(*) cnt5,
+ cd_dep_college_count,
+ count(*) cnt6
+ from
+ plato.customer c,plato.customer_address ca,plato.customer_demographics
+ where
+ c.c_current_addr_sk = ca.ca_address_sk and
+ ca_county in ('Walker County','Richland County','Gaines County','Douglas County','Dona Ana County') and
+ cd_demo_sk = c.c_current_cdemo_sk and
+ exists (select *
+ from plato.store_sales,plato.date_dim
+ where c.c_customer_sk = ss_customer_sk and
+ ss_sold_date_sk = d_date_sk and
+ d_year = 2002 and
+ d_moy between 4 and 4+3) and
+ (exists (select *
+ from plato.web_sales,plato.date_dim
+ where c.c_customer_sk = ws_bill_customer_sk and
+ ws_sold_date_sk = d_date_sk and
+ d_year = 2002 and
+ d_moy between 4 ANd 4+3) or
+ exists (select *
+ from plato.catalog_sales,plato.date_dim
+ where c.c_customer_sk = cs_ship_customer_sk and
+ cs_sold_date_sk = d_date_sk and
+ d_year = 2002 and
+ d_moy between 4 and 4+3))
+ group by cd_gender,
+ cd_marital_status,
+ cd_education_status,
+ cd_purchase_estimate,
+ cd_credit_rating,
+ cd_dep_count,
+ cd_dep_employed_count,
+ cd_dep_college_count
+ order by cd_gender,
+ cd_marital_status,
+ cd_education_status,
+ cd_purchase_estimate,
+ cd_credit_rating,
+ cd_dep_count,
+ cd_dep_employed_count,
+ cd_dep_college_count
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query10.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q11.sql b/yt/yql/tests/sql/suites/pg-tpcds/q11.sql
new file mode 100644
index 0000000000..3befe397a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q11.sql
@@ -0,0 +1,84 @@
+--!syntax_pg
+--TPC-DS Q11
+
+-- start query 1 in stream 0 using template ../query_templates/query11.tpl
+with year_total as (
+ select c_customer_id customer_id
+ ,c_first_name customer_first_name
+ ,c_last_name customer_last_name
+ ,c_preferred_cust_flag customer_preferred_cust_flag
+ ,c_birth_country customer_birth_country
+ ,c_login customer_login
+ ,c_email_address customer_email_address
+ ,d_year dyear
+ ,sum(ss_ext_list_price-ss_ext_discount_amt) year_total
+ ,'s' sale_type
+ from plato.customer
+ ,plato.store_sales
+ ,plato.date_dim
+ where c_customer_sk = ss_customer_sk
+ and ss_sold_date_sk = d_date_sk
+ group by c_customer_id
+ ,c_first_name
+ ,c_last_name
+ ,c_preferred_cust_flag
+ ,c_birth_country
+ ,c_login
+ ,c_email_address
+ ,d_year
+ union all
+ select c_customer_id customer_id
+ ,c_first_name customer_first_name
+ ,c_last_name customer_last_name
+ ,c_preferred_cust_flag customer_preferred_cust_flag
+ ,c_birth_country customer_birth_country
+ ,c_login customer_login
+ ,c_email_address customer_email_address
+ ,d_year dyear
+ ,sum(ws_ext_list_price-ws_ext_discount_amt) year_total
+ ,'w' sale_type
+ from plato.customer
+ ,plato.web_sales
+ ,plato.date_dim
+ where c_customer_sk = ws_bill_customer_sk
+ and ws_sold_date_sk = d_date_sk
+ group by c_customer_id
+ ,c_first_name
+ ,c_last_name
+ ,c_preferred_cust_flag
+ ,c_birth_country
+ ,c_login
+ ,c_email_address
+ ,d_year
+ )
+ select
+ t_s_secyear.customer_id
+ ,t_s_secyear.customer_first_name
+ ,t_s_secyear.customer_last_name
+ ,t_s_secyear.customer_email_address
+ from year_total t_s_firstyear
+ ,year_total t_s_secyear
+ ,year_total t_w_firstyear
+ ,year_total t_w_secyear
+ where t_s_secyear.customer_id = t_s_firstyear.customer_id
+ and t_s_firstyear.customer_id = t_w_secyear.customer_id
+ and t_s_firstyear.customer_id = t_w_firstyear.customer_id
+ and t_s_firstyear.sale_type = 's'
+ and t_w_firstyear.sale_type = 'w'
+ and t_s_secyear.sale_type = 's'
+ and t_w_secyear.sale_type = 'w'
+ and t_s_firstyear.dyear = 2001
+ and t_s_secyear.dyear = 2001+1
+ and t_w_firstyear.dyear = 2001
+ and t_w_secyear.dyear = 2001+1
+ and t_s_firstyear.year_total > 0::numeric
+ and t_w_firstyear.year_total > 0::numeric
+ and case when t_w_firstyear.year_total > 0::numeric then t_w_secyear.year_total / t_w_firstyear.year_total else 0.0::numeric end
+ > case when t_s_firstyear.year_total > 0::numeric then t_s_secyear.year_total / t_s_firstyear.year_total else 0.0::numeric end
+ order by t_s_secyear.customer_id
+ ,t_s_secyear.customer_first_name
+ ,t_s_secyear.customer_last_name
+ ,t_s_secyear.customer_email_address
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query11.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q12.sql b/yt/yql/tests/sql/suites/pg-tpcds/q12.sql
new file mode 100644
index 0000000000..1523125711
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q12.sql
@@ -0,0 +1,37 @@
+--!syntax_pg
+--TPC-DS Q12
+
+-- start query 1 in stream 0 using template ../query_templates/query12.tpl
+select i_item_id
+ ,i_item_desc
+ ,i_category
+ ,i_class
+ ,i_current_price
+ ,sum(ws_ext_sales_price) as itemrevenue
+ ,sum(ws_ext_sales_price)*100::numeric/sum(sum(ws_ext_sales_price)) over
+ (partition by i_class) as revenueratio
+from
+ plato.web_sales
+ ,plato.item
+ ,plato.date_dim
+where
+ ws_item_sk = i_item_sk
+ and i_category in ('Jewelry', 'Sports', 'Books')
+ and ws_sold_date_sk = d_date_sk
+ and d_date between cast('2001-01-12' as date)
+ and (cast('2001-01-12' as date) + interval '30' day)::date
+group by
+ i_item_id
+ ,i_item_desc
+ ,i_category
+ ,i_class
+ ,i_current_price
+order by
+ i_category
+ ,i_class
+ ,i_item_id
+ ,i_item_desc
+ ,revenueratio
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query12.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q13.sql b/yt/yql/tests/sql/suites/pg-tpcds/q13.sql
new file mode 100644
index 0000000000..c8e8a60cc8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q13.sql
@@ -0,0 +1,55 @@
+--!syntax_pg
+--TPC-DS Q13
+
+-- start query 1 in stream 0 using template ../query_templates/query13.tpl
+select avg(ss_quantity) avg_ss_q
+ ,avg(ss_ext_sales_price) avg_ss_s
+ ,avg(ss_ext_wholesale_cost) avg_ss_w
+ ,sum(ss_ext_wholesale_cost) sum_ss_w
+ from plato.store_sales
+ ,plato.store
+ ,plato.customer_demographics
+ ,plato.household_demographics
+ ,plato.customer_address
+ ,plato.date_dim
+ where s_store_sk = ss_store_sk
+ and ss_sold_date_sk = d_date_sk and d_year = 2001
+ and((ss_hdemo_sk=hd_demo_sk
+ and cd_demo_sk = ss_cdemo_sk
+ and cd_marital_status = 'D'
+ and cd_education_status = '2 yr Degree'
+ and ss_sales_price between 100.00::numeric and 150.00::numeric
+ and hd_dep_count = 3
+ )or
+ (ss_hdemo_sk=hd_demo_sk
+ and cd_demo_sk = ss_cdemo_sk
+ and cd_marital_status = 'S'
+ and cd_education_status = 'Secondary'
+ and ss_sales_price between 50.00::numeric and 100.00::numeric
+ and hd_dep_count = 1
+ ) or
+ (ss_hdemo_sk=hd_demo_sk
+ and cd_demo_sk = ss_cdemo_sk
+ and cd_marital_status = 'W'
+ and cd_education_status = 'Advanced Degree'
+ and ss_sales_price between 150.00::numeric and 200.00::numeric
+ and hd_dep_count = 1
+ ))
+ and((ss_addr_sk = ca_address_sk
+ and ca_country = 'United States'
+ and ca_state in ('CO', 'IL', 'MN')
+ and ss_net_profit between 100::numeric and 200::numeric
+ ) or
+ (ss_addr_sk = ca_address_sk
+ and ca_country = 'United States'
+ and ca_state in ('OH', 'MT', 'NM')
+ and ss_net_profit between 150::numeric and 300::numeric
+ ) or
+ (ss_addr_sk = ca_address_sk
+ and ca_country = 'United States'
+ and ca_state in ('TX', 'MO', 'MI')
+ and ss_net_profit between 50::numeric and 250::numeric
+ ))
+;
+
+-- end query 1 in stream 0 using template ../query_templates/query13.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q14.sql b/yt/yql/tests/sql/suites/pg-tpcds/q14.sql
new file mode 100644
index 0000000000..00cc9da131
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q14.sql
@@ -0,0 +1,213 @@
+--!syntax_pg
+--TPC-DS Q14
+
+-- start query 1 in stream 0 using template ../query_templates/query14.tpl
+with cross_items as
+ (select i_item_sk ss_item_sk
+ from plato.item,
+ (select iss.i_brand_id brand_id
+ ,iss.i_class_id class_id
+ ,iss.i_category_id category_id
+ from plato.store_sales
+ ,plato.item iss
+ ,plato.date_dim d1
+ where ss_item_sk = iss.i_item_sk
+ and ss_sold_date_sk = d1.d_date_sk
+ and d1.d_year between 1998 AND 1998 + 2
+ intersect
+ select ics.i_brand_id
+ ,ics.i_class_id
+ ,ics.i_category_id
+ from plato.catalog_sales
+ ,plato.item ics
+ ,plato.date_dim d2
+ where cs_item_sk = ics.i_item_sk
+ and cs_sold_date_sk = d2.d_date_sk
+ and d2.d_year between 1998 AND 1998 + 2
+ intersect
+ select iws.i_brand_id
+ ,iws.i_class_id
+ ,iws.i_category_id
+ from plato.web_sales
+ ,plato.item iws
+ ,plato.date_dim d3
+ where ws_item_sk = iws.i_item_sk
+ and ws_sold_date_sk = d3.d_date_sk
+ and d3.d_year between 1998 AND 1998 + 2) a
+ where i_brand_id = brand_id
+ and i_class_id = class_id
+ and i_category_id = category_id
+),
+ avg_sales as
+ (select avg(quantity::numeric*list_price) average_sales
+ from (select ss_quantity quantity
+ ,ss_list_price list_price
+ from plato.store_sales
+ ,plato.date_dim
+ where ss_sold_date_sk = d_date_sk
+ and d_year between 1998 and 1998 + 2
+ union all
+ select cs_quantity quantity
+ ,cs_list_price list_price
+ from plato.catalog_sales
+ ,plato.date_dim
+ where cs_sold_date_sk = d_date_sk
+ and d_year between 1998 and 1998 + 2
+ union all
+ select ws_quantity quantity
+ ,ws_list_price list_price
+ from plato.web_sales
+ ,plato.date_dim
+ where ws_sold_date_sk = d_date_sk
+ and d_year between 1998 and 1998 + 2) x)
+ select channel, i_brand_id,i_class_id,i_category_id,sum(sales) sum_sales, sum(number_sales) sum_num_sales
+ from(
+ select 'store' channel, i_brand_id,i_class_id
+ ,i_category_id,sum(ss_quantity::numeric*ss_list_price) sales
+ , count(*) number_sales
+ from plato.store_sales
+ ,plato.item
+ ,plato.date_dim
+ where ss_item_sk in (select ss_item_sk from cross_items)
+ and ss_item_sk = i_item_sk
+ and ss_sold_date_sk = d_date_sk
+ and d_year = 1998+2
+ and d_moy = 11
+ group by i_brand_id,i_class_id,i_category_id
+ having sum(ss_quantity::numeric*ss_list_price) > (select average_sales from avg_sales)
+ union all
+ select 'catalog' channel, i_brand_id,i_class_id,i_category_id, sum(cs_quantity::numeric*cs_list_price) sales, count(*) number_sales
+ from plato.catalog_sales
+ ,plato.item
+ ,plato.date_dim
+ where cs_item_sk in (select ss_item_sk from cross_items)
+ and cs_item_sk = i_item_sk
+ and cs_sold_date_sk = d_date_sk
+ and d_year = 1998+2
+ and d_moy = 11
+ group by i_brand_id,i_class_id,i_category_id
+ having sum(cs_quantity::numeric*cs_list_price) > (select average_sales from avg_sales)
+ union all
+ select 'web' channel, i_brand_id,i_class_id,i_category_id, sum(ws_quantity::numeric*ws_list_price) sales , count(*) number_sales
+ from plato.web_sales
+ ,plato.item
+ ,plato.date_dim
+ where ws_item_sk in (select ss_item_sk from cross_items)
+ and ws_item_sk = i_item_sk
+ and ws_sold_date_sk = d_date_sk
+ and d_year = 1998+2
+ and d_moy = 11
+ group by i_brand_id,i_class_id,i_category_id
+ having sum(ws_quantity::numeric*ws_list_price) > (select average_sales from avg_sales)
+ ) y
+ group by rollup (channel, i_brand_id,i_class_id,i_category_id)
+ order by channel,i_brand_id,i_class_id,i_category_id
+ limit 100;
+with cross_items as
+ (select i_item_sk ss_item_sk
+ from plato.item,
+ (select iss.i_brand_id brand_id
+ ,iss.i_class_id class_id
+ ,iss.i_category_id category_id
+ from plato.store_sales
+ ,plato.item iss
+ ,plato.date_dim d1
+ where ss_item_sk = iss.i_item_sk
+ and ss_sold_date_sk = d1.d_date_sk
+ and d1.d_year between 1998 AND 1998 + 2
+ intersect
+ select ics.i_brand_id
+ ,ics.i_class_id
+ ,ics.i_category_id
+ from plato.catalog_sales
+ ,plato.item ics
+ ,plato.date_dim d2
+ where cs_item_sk = ics.i_item_sk
+ and cs_sold_date_sk = d2.d_date_sk
+ and d2.d_year between 1998 AND 1998 + 2
+ intersect
+ select iws.i_brand_id
+ ,iws.i_class_id
+ ,iws.i_category_id
+ from plato.web_sales
+ ,plato.item iws
+ ,plato.date_dim d3
+ where ws_item_sk = iws.i_item_sk
+ and ws_sold_date_sk = d3.d_date_sk
+ and d3.d_year between 1998 AND 1998 + 2) x
+ where i_brand_id = brand_id
+ and i_class_id = class_id
+ and i_category_id = category_id
+),
+ avg_sales as
+(select avg(quantity::numeric*list_price) average_sales
+ from (select ss_quantity quantity
+ ,ss_list_price list_price
+ from plato.store_sales
+ ,plato.date_dim
+ where ss_sold_date_sk = d_date_sk
+ and d_year between 1998 and 1998 + 2
+ union all
+ select cs_quantity quantity
+ ,cs_list_price list_price
+ from plato.catalog_sales
+ ,plato.date_dim
+ where cs_sold_date_sk = d_date_sk
+ and d_year between 1998 and 1998 + 2
+ union all
+ select ws_quantity quantity
+ ,ws_list_price list_price
+ from plato.web_sales
+ ,plato.date_dim
+ where ws_sold_date_sk = d_date_sk
+ and d_year between 1998 and 1998 + 2) x)
+ select this_year.channel ty_channel
+ ,this_year.i_brand_id ty_brand
+ ,this_year.i_class_id ty_class
+ ,this_year.i_category_id ty_category
+ ,this_year.sales ty_sales
+ ,this_year.number_sales ty_number_sales
+ ,last_year.channel ly_channel
+ ,last_year.i_brand_id ly_brand
+ ,last_year.i_class_id ly_class
+ ,last_year.i_category_id ly_category
+ ,last_year.sales ly_sales
+ ,last_year.number_sales ly_number_sales
+ from
+ (select 'store' channel, i_brand_id,i_class_id,i_category_id
+ ,sum(ss_quantity::numeric*ss_list_price) sales, count(*) number_sales
+ from plato.store_sales
+ ,plato.item
+ ,plato.date_dim
+ where ss_item_sk in (select ss_item_sk from cross_items)
+ and ss_item_sk = i_item_sk
+ and ss_sold_date_sk = d_date_sk
+ and d_week_seq = (select d_week_seq
+ from plato.date_dim
+ where d_year = 1998 + 1
+ and d_moy = 12
+ and d_dom = 16)
+ group by i_brand_id,i_class_id,i_category_id
+ having sum(ss_quantity::numeric*ss_list_price) > (select average_sales from avg_sales)) this_year,
+ (select 'store' channel, i_brand_id,i_class_id
+ ,i_category_id, sum(ss_quantity::numeric*ss_list_price) sales, count(*) number_sales
+ from plato.store_sales
+ ,plato.item
+ ,plato.date_dim
+ where ss_item_sk in (select ss_item_sk from cross_items)
+ and ss_item_sk = i_item_sk
+ and ss_sold_date_sk = d_date_sk
+ and d_week_seq = (select d_week_seq
+ from plato.date_dim
+ where d_year = 1998
+ and d_moy = 12
+ and d_dom = 16)
+ group by i_brand_id,i_class_id,i_category_id
+ having sum(ss_quantity::numeric*ss_list_price) > (select average_sales from avg_sales)) last_year
+ where this_year.i_brand_id= last_year.i_brand_id
+ and this_year.i_class_id = last_year.i_class_id
+ and this_year.i_category_id = last_year.i_category_id
+ order by this_year.channel, this_year.i_brand_id, this_year.i_class_id, this_year.i_category_id
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query14.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q15.sql b/yt/yql/tests/sql/suites/pg-tpcds/q15.sql
new file mode 100644
index 0000000000..1ceca68e03
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q15.sql
@@ -0,0 +1,23 @@
+--!syntax_pg
+--TPC-DS Q15
+
+-- start query 1 in stream 0 using template ../query_templates/query15.tpl
+select ca_zip
+ ,sum(cs_sales_price)
+ from plato.catalog_sales
+ ,plato.customer
+ ,plato.customer_address
+ ,plato.date_dim
+ where cs_bill_customer_sk = c_customer_sk
+ and c_current_addr_sk = ca_address_sk
+ and ( substr(ca_zip,1,5) in ('85669', '86197','88274','83405','86475',
+ '85392', '85460', '80348', '81792')
+ or ca_state in ('CA','WA','GA')
+ or cs_sales_price > 500::numeric)
+ and cs_sold_date_sk = d_date_sk
+ and d_qoy = 2 and d_year = 2000
+ group by ca_zip
+ order by ca_zip
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query15.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q16.sql b/yt/yql/tests/sql/suites/pg-tpcds/q16.sql
new file mode 100644
index 0000000000..04ad619f13
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q16.sql
@@ -0,0 +1,34 @@
+--!syntax_pg
+--TPC-DS Q16
+
+-- start query 1 in stream 0 using template ../query_templates/query16.tpl
+select
+ count(distinct cs_order_number) as "order count"
+ ,sum(cs_ext_ship_cost) as "total shipping cost"
+ ,sum(cs_net_profit) as "total net profit"
+from
+ plato.catalog_sales cs1
+ ,plato.date_dim
+ ,plato.customer_address
+ ,plato.call_center
+where
+ d_date between '1999-2-01'::date and
+ (cast('1999-2-01' as date) + interval '60' day)::date
+and cs1.cs_ship_date_sk = d_date_sk
+and cs1.cs_ship_addr_sk = ca_address_sk
+and ca_state = 'IL'
+and cs1.cs_call_center_sk = cc_call_center_sk
+and cc_county in ('Williamson County','Williamson County','Williamson County','Williamson County',
+ 'Williamson County'
+)
+and exists (select *
+ from plato.catalog_sales cs2
+ where cs1.cs_order_number = cs2.cs_order_number
+ and cs1.cs_warehouse_sk <> cs2.cs_warehouse_sk)
+and not exists(select *
+ from plato.catalog_returns cr1
+ where cs1.cs_order_number = cr1.cr_order_number)
+order by count(distinct cs_order_number)
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query16.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q17.sql b/yt/yql/tests/sql/suites/pg-tpcds/q17.sql
new file mode 100644
index 0000000000..2b0a6cf476
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q17.sql
@@ -0,0 +1,48 @@
+--!syntax_pg
+--TPC-DS Q17
+
+-- start query 1 in stream 0 using template ../query_templates/query17.tpl
+select i_item_id
+ ,i_item_desc
+ ,s_state
+ ,count(ss_quantity) as store_sales_quantitycount
+ ,avg(ss_quantity) as store_sales_quantityave
+ ,stddev_samp(ss_quantity) as store_sales_quantitystdev
+ ,stddev_samp(ss_quantity)/avg(ss_quantity) as store_sales_quantitycov
+ ,count(sr_return_quantity) as store_returns_quantitycount
+ ,avg(sr_return_quantity) as store_returns_quantityave
+ ,stddev_samp(sr_return_quantity) as store_returns_quantitystdev
+ ,stddev_samp(sr_return_quantity)/avg(sr_return_quantity) as store_returns_quantitycov
+ ,count(cs_quantity) as catalog_sales_quantitycount ,avg(cs_quantity) as catalog_sales_quantityave
+ ,stddev_samp(cs_quantity) as catalog_sales_quantitystdev
+ ,stddev_samp(cs_quantity)/avg(cs_quantity) as catalog_sales_quantitycov
+ from plato.store_sales
+ ,plato.store_returns
+ ,plato.catalog_sales
+ ,plato.date_dim d1
+ ,plato.date_dim d2
+ ,plato.date_dim d3
+ ,plato.store
+ ,plato.item
+ where d1.d_quarter_name = '1998Q1'
+ and d1.d_date_sk = ss_sold_date_sk
+ and i_item_sk = ss_item_sk
+ and s_store_sk = ss_store_sk
+ and ss_customer_sk = sr_customer_sk
+ and ss_item_sk = sr_item_sk
+ and ss_ticket_number = sr_ticket_number
+ and sr_returned_date_sk = d2.d_date_sk
+ and d2.d_quarter_name in ('1998Q1','1998Q2','1998Q3')
+ and sr_customer_sk = cs_bill_customer_sk
+ and sr_item_sk = cs_item_sk
+ and cs_sold_date_sk = d3.d_date_sk
+ and d3.d_quarter_name in ('1998Q1','1998Q2','1998Q3')
+ group by i_item_id
+ ,i_item_desc
+ ,s_state
+ order by i_item_id
+ ,i_item_desc
+ ,s_state
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query17.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q18.sql b/yt/yql/tests/sql/suites/pg-tpcds/q18.sql
new file mode 100644
index 0000000000..11b5a79cfb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q18.sql
@@ -0,0 +1,37 @@
+--!syntax_pg
+--TPC-DS Q18
+
+-- start query 1 in stream 0 using template ../query_templates/query18.tpl
+select i_item_id,
+ ca_country,
+ ca_state,
+ ca_county,
+ avg( cast(cs_quantity as decimal(12,2))) agg1,
+ avg( cast(cs_list_price as decimal(12,2))) agg2,
+ avg( cast(cs_coupon_amt as decimal(12,2))) agg3,
+ avg( cast(cs_sales_price as decimal(12,2))) agg4,
+ avg( cast(cs_net_profit as decimal(12,2))) agg5,
+ avg( cast(c_birth_year as decimal(12,2))) agg6,
+ avg( cast(cd1.cd_dep_count as decimal(12,2))) agg7
+ from plato.catalog_sales, plato.customer_demographics cd1,
+ plato.customer_demographics cd2, plato.customer, plato.customer_address, plato.date_dim, plato.item
+ where cs_sold_date_sk = d_date_sk and
+ cs_item_sk = i_item_sk and
+ cs_bill_cdemo_sk = cd1.cd_demo_sk and
+ cs_bill_customer_sk = c_customer_sk and
+ cd1.cd_gender = 'M' and
+ cd1.cd_education_status = 'College' and
+ c_current_cdemo_sk = cd2.cd_demo_sk and
+ c_current_addr_sk = ca_address_sk and
+ c_birth_month in (9,5,12,4,1,10) and
+ d_year = 2001 and
+ ca_state in ('ND','WI','AL'
+ ,'NC','OK','MS','TN')
+ group by rollup (i_item_id, ca_country, ca_state, ca_county)
+ order by ca_country,
+ ca_state,
+ ca_county,
+ i_item_id
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query18.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q19.sql b/yt/yql/tests/sql/suites/pg-tpcds/q19.sql
new file mode 100644
index 0000000000..ff2d9315c8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q19.sql
@@ -0,0 +1,28 @@
+--!syntax_pg
+--TPC-DS Q19
+
+-- start query 1 in stream 0 using template ../query_templates/query19.tpl
+select i_brand_id brand_id, i_brand brand, i_manufact_id, i_manufact,
+ sum(ss_ext_sales_price) ext_price
+ from plato.date_dim, plato.store_sales, plato.item,plato.customer,plato.customer_address,plato.store
+ where d_date_sk = ss_sold_date_sk
+ and ss_item_sk = i_item_sk
+ and i_manager_id=7
+ and d_moy=11
+ and d_year=1999
+ and ss_customer_sk = c_customer_sk
+ and c_current_addr_sk = ca_address_sk
+ and substr(ca_zip,1,5) <> substr(s_zip,1,5)
+ and ss_store_sk = s_store_sk
+ group by i_brand
+ ,i_brand_id
+ ,i_manufact_id
+ ,i_manufact
+ order by ext_price desc
+ ,i_brand
+ ,i_brand_id
+ ,i_manufact_id
+ ,i_manufact
+limit 100 ;
+
+-- end query 1 in stream 0 using template ../query_templates/query19.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q20.sql b/yt/yql/tests/sql/suites/pg-tpcds/q20.sql
new file mode 100644
index 0000000000..8e1e02682f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q20.sql
@@ -0,0 +1,33 @@
+--!syntax_pg
+--TPC-DS Q20
+
+-- start query 1 in stream 0 using template ../query_templates/query20.tpl
+select i_item_id
+ ,i_item_desc
+ ,i_category
+ ,i_class
+ ,i_current_price
+ ,sum(cs_ext_sales_price) as itemrevenue
+ ,sum(cs_ext_sales_price)*100::numeric/sum(sum(cs_ext_sales_price)) over
+ (partition by i_class) as revenueratio
+ from plato.catalog_sales
+ ,plato.item
+ ,plato.date_dim
+ where cs_item_sk = i_item_sk
+ and i_category in ('Jewelry', 'Sports', 'Books')
+ and cs_sold_date_sk = d_date_sk
+ and d_date between cast('2001-01-12' as date)
+ and (cast('2001-01-12' as date) + interval '30' day)::date
+ group by i_item_id
+ ,i_item_desc
+ ,i_category
+ ,i_class
+ ,i_current_price
+ order by i_category
+ ,i_class
+ ,i_item_id
+ ,i_item_desc
+ ,revenueratio
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query20.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q21.sql b/yt/yql/tests/sql/suites/pg-tpcds/q21.sql
new file mode 100644
index 0000000000..c5eca101b9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q21.sql
@@ -0,0 +1,33 @@
+--!syntax_pg
+--TPC-DS Q21
+
+-- start query 1 in stream 0 using template ../query_templates/query21.tpl
+select *
+ from(select w_warehouse_name
+ ,i_item_id
+ ,sum(case when (cast(d_date as date) < cast ('1998-04-08' as date))
+ then inv_quantity_on_hand
+ else 0 end) as inv_before
+ ,sum(case when (cast(d_date as date) >= cast ('1998-04-08' as date))
+ then inv_quantity_on_hand
+ else 0 end) as inv_after
+ from plato.inventory
+ ,plato.warehouse
+ ,plato.item
+ ,plato.date_dim
+ where i_current_price between 0.99::numeric and 1.49::numeric
+ and i_item_sk = inv_item_sk
+ and inv_warehouse_sk = w_warehouse_sk
+ and inv_date_sk = d_date_sk
+ and d_date between (cast ('1998-04-08' as date) - interval '30' day)::date
+ and (cast ('1998-04-08' as date) + interval '30' day)::date
+ group by w_warehouse_name, i_item_id) x
+ where (case when inv_before > 0
+ then inv_after / inv_before
+ else null::int8
+ end) between (2.0/3.0)::int8 and (3.0/2.0)::int8
+ order by w_warehouse_name
+ ,i_item_id
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query21.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q22.sql b/yt/yql/tests/sql/suites/pg-tpcds/q22.sql
new file mode 100644
index 0000000000..889168511b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q22.sql
@@ -0,0 +1,23 @@
+--!syntax_pg
+--TPC-DS Q22
+
+-- start query 1 in stream 0 using template ../query_templates/query22.tpl
+select i_product_name
+ ,i_brand
+ ,i_class
+ ,i_category
+ ,avg(inv_quantity_on_hand) qoh
+ from plato.inventory
+ ,plato.date_dim
+ ,plato.item
+ where inv_date_sk=d_date_sk
+ and inv_item_sk=i_item_sk
+ and d_month_seq between 1212 and 1212 + 11
+ group by rollup(i_product_name
+ ,i_brand
+ ,i_class
+ ,i_category)
+order by qoh, i_product_name, i_brand, i_class, i_category
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query22.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q23.sql b/yt/yql/tests/sql/suites/pg-tpcds/q23.sql
new file mode 100644
index 0000000000..7dfc9f03ee
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q23.sql
@@ -0,0 +1,110 @@
+--!syntax_pg
+--TPC-DS Q23
+
+-- start query 1 in stream 0 using template ../query_templates/query23.tpl
+with frequent_ss_items as
+ (select substr(i_item_desc,1,30) itemdesc,i_item_sk item_sk,d_date solddate,count(*) cnt
+ from plato.store_sales
+ ,plato.date_dim
+ ,plato.item
+ where ss_sold_date_sk = d_date_sk
+ and ss_item_sk = i_item_sk
+ and d_year in (1999,1999+1,1999+2,1999+3)
+ group by substr(i_item_desc,1,30),i_item_sk,d_date
+ having count(*) >4),
+ max_store_sales as
+ (select max(csales) tpcds_cmax
+ from (select c_customer_sk,sum(ss_quantity::numeric*ss_sales_price) csales
+ from plato.store_sales
+ ,plato.customer
+ ,plato.date_dim
+ where ss_customer_sk = c_customer_sk
+ and ss_sold_date_sk = d_date_sk
+ and d_year in (1999,1999+1,1999+2,1999+3)
+ group by c_customer_sk) a),
+ best_ss_customer as
+ (select c_customer_sk,sum(ss_quantity::numeric*ss_sales_price) ssales
+ from plato.store_sales
+ ,plato.customer
+ where ss_customer_sk = c_customer_sk
+ group by c_customer_sk
+ having sum(ss_quantity::numeric*ss_sales_price) > (95.0/100.0)::numeric * (select
+ *
+from
+ max_store_sales)::numeric)
+ select sum(sales)
+ from (select cs_quantity::numeric*cs_list_price sales
+ from plato.catalog_sales
+ ,plato.date_dim
+ where d_year = 1999
+ and d_moy = 1
+ and cs_sold_date_sk = d_date_sk
+ and cs_item_sk in (select item_sk from frequent_ss_items)
+ and cs_bill_customer_sk in (select c_customer_sk from best_ss_customer)
+ union all
+ select ws_quantity::numeric*ws_list_price sales
+ from plato.web_sales
+ ,plato.date_dim
+ where d_year = 1999
+ and d_moy = 1
+ and ws_sold_date_sk = d_date_sk
+ and ws_item_sk in (select item_sk from frequent_ss_items)
+ and ws_bill_customer_sk in (select c_customer_sk from best_ss_customer)) a
+ limit 100;
+with frequent_ss_items as
+ (select substr(i_item_desc,1,30) itemdesc,i_item_sk item_sk,d_date solddate,count(*) cnt
+ from plato.store_sales
+ ,plato.date_dim
+ ,plato.item
+ where ss_sold_date_sk = d_date_sk
+ and ss_item_sk = i_item_sk
+ and d_year in (1999,1999 + 1,1999 + 2,1999 + 3)
+ group by substr(i_item_desc,1,30),i_item_sk,d_date
+ having count(*) >4),
+ max_store_sales as
+ (select max(csales) tpcds_cmax
+ from (select c_customer_sk,sum(ss_quantity::numeric*ss_sales_price) csales
+ from plato.store_sales
+ ,plato.customer
+ ,plato.date_dim
+ where ss_customer_sk = c_customer_sk
+ and ss_sold_date_sk = d_date_sk
+ and d_year in (1999,1999+1,1999+2,1999+3)
+ group by c_customer_sk) a),
+ best_ss_customer as
+ (select c_customer_sk,sum(ss_quantity::numeric*ss_sales_price) ssales
+ from plato.store_sales
+ ,plato.customer
+ where ss_customer_sk = c_customer_sk
+ group by c_customer_sk
+ having sum(ss_quantity::numeric*ss_sales_price) > (95.0/100.0)::numeric * (select
+ *
+ from max_store_sales)::numeric)
+ select c_last_name,c_first_name,sales
+ from (select c_last_name,c_first_name,sum(cs_quantity::numeric*cs_list_price) sales
+ from plato.catalog_sales
+ ,plato.customer
+ ,plato.date_dim
+ where d_year = 1999
+ and d_moy = 1
+ and cs_sold_date_sk = d_date_sk
+ and cs_item_sk in (select item_sk from frequent_ss_items)
+ and cs_bill_customer_sk in (select c_customer_sk from best_ss_customer)
+ and cs_bill_customer_sk = c_customer_sk
+ group by c_last_name,c_first_name
+ union all
+ select c_last_name,c_first_name,sum(ws_quantity::numeric*ws_list_price) sales
+ from plato.web_sales
+ ,plato.customer
+ ,plato.date_dim
+ where d_year = 1999
+ and d_moy = 1
+ and ws_sold_date_sk = d_date_sk
+ and ws_item_sk in (select item_sk from frequent_ss_items)
+ and ws_bill_customer_sk in (select c_customer_sk from best_ss_customer)
+ and ws_bill_customer_sk = c_customer_sk
+ group by c_last_name,c_first_name) a
+ order by c_last_name,c_first_name,sales
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query23.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q24.sql b/yt/yql/tests/sql/suites/pg-tpcds/q24.sql
new file mode 100644
index 0000000000..320888452d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q24.sql
@@ -0,0 +1,110 @@
+--!syntax_pg
+--TPC-DS Q24
+
+-- start query 1 in stream 0 using template ../query_templates/query24.tpl
+with ssales as
+(select c_last_name
+ ,c_first_name
+ ,s_store_name
+ ,ca_state
+ ,s_state
+ ,i_color
+ ,i_current_price
+ ,i_manager_id
+ ,i_units
+ ,i_size
+ ,sum(ss_sales_price) netpaid
+from plato.store_sales
+ ,plato.store_returns
+ ,plato.store
+ ,plato.item
+ ,plato.customer
+ ,plato.customer_address
+where ss_ticket_number = sr_ticket_number
+ and ss_item_sk = sr_item_sk
+ and ss_customer_sk = c_customer_sk
+ and ss_item_sk = i_item_sk
+ and ss_store_sk = s_store_sk
+ and c_current_addr_sk = ca_address_sk
+ and c_birth_country <> upper(ca_country)
+ and s_zip = ca_zip
+and s_market_id=7
+group by c_last_name
+ ,c_first_name
+ ,s_store_name
+ ,ca_state
+ ,s_state
+ ,i_color
+ ,i_current_price
+ ,i_manager_id
+ ,i_units
+ ,i_size)
+select c_last_name
+ ,c_first_name
+ ,s_store_name
+ ,sum(netpaid) paid
+from ssales
+where i_color = 'orchid'
+group by c_last_name
+ ,c_first_name
+ ,s_store_name
+having sum(netpaid) > (select 0.05::numeric*avg(netpaid)
+ from ssales)
+order by c_last_name
+ ,c_first_name
+ ,s_store_name
+;
+with ssales as
+(select c_last_name
+ ,c_first_name
+ ,s_store_name
+ ,ca_state
+ ,s_state
+ ,i_color
+ ,i_current_price
+ ,i_manager_id
+ ,i_units
+ ,i_size
+ ,sum(ss_sales_price) netpaid
+from plato.store_sales
+ ,plato.store_returns
+ ,plato.store
+ ,plato.item
+ ,plato.customer
+ ,plato.customer_address
+where ss_ticket_number = sr_ticket_number
+ and ss_item_sk = sr_item_sk
+ and ss_customer_sk = c_customer_sk
+ and ss_item_sk = i_item_sk
+ and ss_store_sk = s_store_sk
+ and c_current_addr_sk = ca_address_sk
+ and c_birth_country <> upper(ca_country)
+ and s_zip = ca_zip
+ and s_market_id = 7
+group by c_last_name
+ ,c_first_name
+ ,s_store_name
+ ,ca_state
+ ,s_state
+ ,i_color
+ ,i_current_price
+ ,i_manager_id
+ ,i_units
+ ,i_size)
+select c_last_name
+ ,c_first_name
+ ,s_store_name
+ ,sum(netpaid) paid
+from ssales
+where i_color = 'chiffon'
+group by c_last_name
+ ,c_first_name
+ ,s_store_name
+having sum(netpaid) > (select 0.05::numeric*avg(netpaid)
+ from ssales)
+order by c_last_name
+ ,c_first_name
+ ,s_store_name
+;
+
+-- end query 1 in stream 0 using template ../query_templates/query24.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q25.sql b/yt/yql/tests/sql/suites/pg-tpcds/q25.sql
new file mode 100644
index 0000000000..764be84db6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q25.sql
@@ -0,0 +1,51 @@
+--!syntax_pg
+--TPC-DS Q25
+
+-- start query 1 in stream 0 using template ../query_templates/query25.tpl
+select
+ i_item_id
+ ,i_item_desc
+ ,s_store_id
+ ,s_store_name
+ ,sum(ss_net_profit) as store_sales_profit
+ ,sum(sr_net_loss) as store_returns_loss
+ ,sum(cs_net_profit) as catalog_sales_profit
+ from
+ plato.store_sales
+ ,plato.store_returns
+ ,plato.catalog_sales
+ ,plato.date_dim d1
+ ,plato.date_dim d2
+ ,plato.date_dim d3
+ ,plato.store
+ ,plato.item
+ where
+ d1.d_moy = 4
+ and d1.d_year = 2000
+ and d1.d_date_sk = ss_sold_date_sk
+ and i_item_sk = ss_item_sk
+ and s_store_sk = ss_store_sk
+ and ss_customer_sk = sr_customer_sk
+ and ss_item_sk = sr_item_sk
+ and ss_ticket_number = sr_ticket_number
+ and sr_returned_date_sk = d2.d_date_sk
+ and d2.d_moy between 4 and 10
+ and d2.d_year = 2000
+ and sr_customer_sk = cs_bill_customer_sk
+ and sr_item_sk = cs_item_sk
+ and cs_sold_date_sk = d3.d_date_sk
+ and d3.d_moy between 4 and 10
+ and d3.d_year = 2000
+ group by
+ i_item_id
+ ,i_item_desc
+ ,s_store_id
+ ,s_store_name
+ order by
+ i_item_id
+ ,i_item_desc
+ ,s_store_id
+ ,s_store_name
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query25.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q26.sql b/yt/yql/tests/sql/suites/pg-tpcds/q26.sql
new file mode 100644
index 0000000000..9d3e5f6200
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q26.sql
@@ -0,0 +1,24 @@
+--!syntax_pg
+--TPC-DS Q26
+
+-- start query 1 in stream 0 using template ../query_templates/query26.tpl
+select i_item_id,
+ avg(cs_quantity) agg1,
+ avg(cs_list_price) agg2,
+ avg(cs_coupon_amt) agg3,
+ avg(cs_sales_price) agg4
+ from plato.catalog_sales, plato.customer_demographics, plato.date_dim, plato.item, plato.promotion
+ where cs_sold_date_sk = d_date_sk and
+ cs_item_sk = i_item_sk and
+ cs_bill_cdemo_sk = cd_demo_sk and
+ cs_promo_sk = p_promo_sk and
+ cd_gender = 'F' and
+ cd_marital_status = 'W' and
+ cd_education_status = 'Primary' and
+ (p_channel_email = 'N' or p_channel_event = 'N') and
+ d_year = 1998
+ group by i_item_id
+ order by i_item_id
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query26.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q27.sql b/yt/yql/tests/sql/suites/pg-tpcds/q27.sql
new file mode 100644
index 0000000000..a83e9a6e19
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q27.sql
@@ -0,0 +1,26 @@
+--!syntax_pg
+--TPC-DS Q27
+
+-- start query 1 in stream 0 using template ../query_templates/query27.tpl
+select i_item_id,
+ s_state, grouping(s_state) g_state,
+ avg(ss_quantity) agg1,
+ avg(ss_list_price) agg2,
+ avg(ss_coupon_amt) agg3,
+ avg(ss_sales_price) agg4
+ from plato.store_sales, plato.customer_demographics, plato.date_dim, plato.store, plato.item
+ where ss_sold_date_sk = d_date_sk and
+ ss_item_sk = i_item_sk and
+ ss_store_sk = s_store_sk and
+ ss_cdemo_sk = cd_demo_sk and
+ cd_gender = 'F' and
+ cd_marital_status = 'W' and
+ cd_education_status = 'Primary' and
+ d_year = 1998 and
+ s_state in ('TN','TN', 'TN', 'TN', 'TN', 'TN')
+ group by rollup (i_item_id, s_state)
+ order by i_item_id
+ ,s_state
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query27.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q28.sql b/yt/yql/tests/sql/suites/pg-tpcds/q28.sql
new file mode 100644
index 0000000000..c20841d8b8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q28.sql
@@ -0,0 +1,56 @@
+--!syntax_pg
+--TPC-DS Q28
+
+-- start query 1 in stream 0 using template ../query_templates/query28.tpl
+select *
+from (select avg(ss_list_price) B1_LP
+ ,count(ss_list_price) B1_CNT
+ ,count(distinct ss_list_price) B1_CNTD
+ from plato.store_sales
+ where ss_quantity between 0 and 5
+ and (ss_list_price between 11::numeric and (11+10)::numeric
+ or ss_coupon_amt between 460::numeric and (460+1000)::numeric
+ or ss_wholesale_cost between 14::numeric and (14+20)::numeric)) B1,
+ (select avg(ss_list_price) B2_LP
+ ,count(ss_list_price) B2_CNT
+ ,count(distinct ss_list_price) B2_CNTD
+ from plato.store_sales
+ where ss_quantity between 6 and 10
+ and (ss_list_price between 91::numeric and (91+10)::numeric
+ or ss_coupon_amt between 1430::numeric and (1430+1000)::numeric
+ or ss_wholesale_cost between 32::numeric and (32+20)::numeric)) B2,
+ (select avg(ss_list_price) B3_LP
+ ,count(ss_list_price) B3_CNT
+ ,count(distinct ss_list_price) B3_CNTD
+ from plato.store_sales
+ where ss_quantity between 11 and 15
+ and (ss_list_price between 66::numeric and (66+10)::numeric
+ or ss_coupon_amt between 920::numeric and (920+1000)::numeric
+ or ss_wholesale_cost between 4::numeric and (4+20)::numeric)) B3,
+ (select avg(ss_list_price) B4_LP
+ ,count(ss_list_price) B4_CNT
+ ,count(distinct ss_list_price) B4_CNTD
+ from plato.store_sales
+ where ss_quantity between 16 and 20
+ and (ss_list_price between 142::numeric and (142+10)::numeric
+ or ss_coupon_amt between 3054::numeric and (3054+1000)::numeric
+ or ss_wholesale_cost between 80::numeric and (80+20)::numeric)) B4,
+ (select avg(ss_list_price) B5_LP
+ ,count(ss_list_price) B5_CNT
+ ,count(distinct ss_list_price) B5_CNTD
+ from plato.store_sales
+ where ss_quantity between 21 and 25
+ and (ss_list_price between 135::numeric and (135+10)::numeric
+ or ss_coupon_amt between 14180::numeric and (14180+1000)::numeric
+ or ss_wholesale_cost between 38::numeric and (38+20)::numeric)) B5,
+ (select avg(ss_list_price) B6_LP
+ ,count(ss_list_price) B6_CNT
+ ,count(distinct ss_list_price) B6_CNTD
+ from plato.store_sales
+ where ss_quantity between 26 and 30
+ and (ss_list_price between 28::numeric and (28+10)::numeric
+ or ss_coupon_amt between 2513::numeric and (2513+1000)::numeric
+ or ss_wholesale_cost between 42::numeric and (42+20)::numeric)) B6
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query28.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q29.sql b/yt/yql/tests/sql/suites/pg-tpcds/q29.sql
new file mode 100644
index 0000000000..0b2bf6556b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q29.sql
@@ -0,0 +1,50 @@
+--!syntax_pg
+--TPC-DS Q29
+
+-- start query 1 in stream 0 using template ../query_templates/query29.tpl
+select
+ i_item_id
+ ,i_item_desc
+ ,s_store_id
+ ,s_store_name
+ ,sum(ss_quantity) as store_sales_quantity
+ ,sum(sr_return_quantity) as store_returns_quantity
+ ,sum(cs_quantity) as catalog_sales_quantity
+ from
+ plato.store_sales
+ ,plato.store_returns
+ ,plato.catalog_sales
+ ,plato.date_dim d1
+ ,plato.date_dim d2
+ ,plato.date_dim d3
+ ,plato.store
+ ,plato.item
+ where
+ d1.d_moy = 4
+ and d1.d_year = 1999
+ and d1.d_date_sk = ss_sold_date_sk
+ and i_item_sk = ss_item_sk
+ and s_store_sk = ss_store_sk
+ and ss_customer_sk = sr_customer_sk
+ and ss_item_sk = sr_item_sk
+ and ss_ticket_number = sr_ticket_number
+ and sr_returned_date_sk = d2.d_date_sk
+ and d2.d_moy between 4 and 4 + 3
+ and d2.d_year = 1999
+ and sr_customer_sk = cs_bill_customer_sk
+ and sr_item_sk = cs_item_sk
+ and cs_sold_date_sk = d3.d_date_sk
+ and d3.d_year in (1999,1999+1,1999+2)
+ group by
+ i_item_id
+ ,i_item_desc
+ ,s_store_id
+ ,s_store_name
+ order by
+ i_item_id
+ ,i_item_desc
+ ,s_store_id
+ ,s_store_name
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query29.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q30.sql b/yt/yql/tests/sql/suites/pg-tpcds/q30.sql
new file mode 100644
index 0000000000..a1d3319069
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q30.sql
@@ -0,0 +1,34 @@
+--!syntax_pg
+--TPC-DS Q30
+
+-- start query 1 in stream 0 using template ../query_templates/query30.tpl
+with customer_total_return as
+ (select wr_returning_customer_sk as ctr_customer_sk
+ ,ca_state as ctr_state,
+ sum(wr_return_amt) as ctr_total_return
+ from plato.web_returns
+ ,plato.date_dim
+ ,plato.customer_address
+ where wr_returned_date_sk = d_date_sk
+ and d_year =2002
+ and wr_returning_addr_sk = ca_address_sk
+ group by wr_returning_customer_sk
+ ,ca_state)
+ select c_customer_id,c_salutation,c_first_name,c_last_name,c_preferred_cust_flag
+ ,c_birth_day,c_birth_month,c_birth_year,c_birth_country,c_login,c_email_address
+ ,c_last_review_date,ctr_total_return
+ from customer_total_return ctr1
+ ,plato.customer_address
+ ,plato.customer
+ where ctr1.ctr_total_return > (select avg(ctr_total_return)*1.2::numeric
+ from customer_total_return ctr2
+ where ctr1.ctr_state = ctr2.ctr_state)
+ and ca_address_sk = c_current_addr_sk
+ and ca_state = 'IL'
+ and ctr1.ctr_customer_sk = c_customer_sk
+ order by c_customer_id,c_salutation,c_first_name,c_last_name,c_preferred_cust_flag
+ ,c_birth_day,c_birth_month,c_birth_year,c_birth_country,c_login,c_email_address
+ ,c_last_review_date,ctr_total_return
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query30.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q31.sql b/yt/yql/tests/sql/suites/pg-tpcds/q31.sql
new file mode 100644
index 0000000000..7cc0cc6542
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q31.sql
@@ -0,0 +1,55 @@
+--!syntax_pg
+--TPC-DS Q31
+
+-- start query 1 in stream 0 using template ../query_templates/query31.tpl
+with ss as
+ (select ca_county,d_qoy, d_year,sum(ss_ext_sales_price) as store_sales
+ from plato.store_sales,plato.date_dim,plato.customer_address
+ where ss_sold_date_sk = d_date_sk
+ and ss_addr_sk=ca_address_sk
+ group by ca_county,d_qoy, d_year),
+ ws as
+ (select ca_county,d_qoy, d_year,sum(ws_ext_sales_price) as web_sales
+ from plato.web_sales,plato.date_dim,plato.customer_address
+ where ws_sold_date_sk = d_date_sk
+ and ws_bill_addr_sk=ca_address_sk
+ group by ca_county,d_qoy, d_year)
+ select
+ ss1.ca_county
+ ,ss1.d_year
+ ,ws2.web_sales/ws1.web_sales web_q1_q2_increase
+ ,ss2.store_sales/ss1.store_sales store_q1_q2_increase
+ ,ws3.web_sales/ws2.web_sales web_q2_q3_increase
+ ,ss3.store_sales/ss2.store_sales store_q2_q3_increase
+ from
+ ss ss1
+ ,ss ss2
+ ,ss ss3
+ ,ws ws1
+ ,ws ws2
+ ,ws ws3
+ where
+ ss1.d_qoy = 1
+ and ss1.d_year = 2000
+ and ss1.ca_county = ss2.ca_county
+ and ss2.d_qoy = 2
+ and ss2.d_year = 2000
+ and ss2.ca_county = ss3.ca_county
+ and ss3.d_qoy = 3
+ and ss3.d_year = 2000
+ and ss1.ca_county = ws1.ca_county
+ and ws1.d_qoy = 1
+ and ws1.d_year = 2000
+ and ws1.ca_county = ws2.ca_county
+ and ws2.d_qoy = 2
+ and ws2.d_year = 2000
+ and ws1.ca_county = ws3.ca_county
+ and ws3.d_qoy = 3
+ and ws3.d_year =2000
+ and case when ws1.web_sales > 0::numeric then ws2.web_sales/ws1.web_sales else null::numeric end
+ > case when ss1.store_sales > 0::numeric then ss2.store_sales/ss1.store_sales else null::numeric end
+ and case when ws2.web_sales > 0::numeric then ws3.web_sales/ws2.web_sales else null::numeric end
+ > case when ss2.store_sales > 0::numeric then ss3.store_sales/ss2.store_sales else null::numeric end
+ order by ss1.d_year;
+
+-- end query 1 in stream 0 using template ../query_templates/query31.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q32.sql b/yt/yql/tests/sql/suites/pg-tpcds/q32.sql
new file mode 100644
index 0000000000..babfacba04
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q32.sql
@@ -0,0 +1,31 @@
+--!syntax_pg
+--TPC-DS Q32
+
+-- start query 1 in stream 0 using template ../query_templates/query32.tpl
+select sum(cs_ext_discount_amt) as "excess discount amount"
+from
+ plato.catalog_sales
+ ,plato.item
+ ,plato.date_dim
+where
+i_manufact_id = 269
+and i_item_sk = cs_item_sk
+and d_date between '1998-03-18'::date and
+ (cast('1998-03-18' as date) + interval '90' day)::date
+and d_date_sk = cs_sold_date_sk
+and cs_ext_discount_amt
+ > (
+ select
+ 1.3::numeric * avg(cs_ext_discount_amt)
+ from
+ plato.catalog_sales
+ ,plato.date_dim
+ where
+ cs_item_sk = i_item_sk
+ and d_date between '1998-03-18'::date and
+ (cast('1998-03-18' as date) + interval '90' day)::date
+ and d_date_sk = cs_sold_date_sk
+ )
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query32.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q33.sql b/yt/yql/tests/sql/suites/pg-tpcds/q33.sql
new file mode 100644
index 0000000000..1fa71e6f9e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q33.sql
@@ -0,0 +1,78 @@
+--!syntax_pg
+--TPC-DS Q33
+
+-- start query 1 in stream 0 using template ../query_templates/query33.tpl
+with ss as (
+ select
+ i_manufact_id,sum(ss_ext_sales_price) total_sales
+ from
+ plato.store_sales,
+ plato.date_dim,
+ plato.customer_address,
+ plato.item
+ where
+ i_manufact_id in (select
+ i_manufact_id
+from
+ plato.item
+where i_category in ('Books'))
+ and ss_item_sk = i_item_sk
+ and ss_sold_date_sk = d_date_sk
+ and d_year = 1999
+ and d_moy = 3
+ and ss_addr_sk = ca_address_sk
+ and ca_gmt_offset = -5::numeric
+ group by i_manufact_id),
+ cs as (
+ select
+ i_manufact_id,sum(cs_ext_sales_price) total_sales
+ from
+ plato.catalog_sales,
+ plato.date_dim,
+ plato.customer_address,
+ plato.item
+ where
+ i_manufact_id in (select
+ i_manufact_id
+from
+ plato.item
+where i_category in ('Books'))
+ and cs_item_sk = i_item_sk
+ and cs_sold_date_sk = d_date_sk
+ and d_year = 1999
+ and d_moy = 3
+ and cs_bill_addr_sk = ca_address_sk
+ and ca_gmt_offset = -5::numeric
+ group by i_manufact_id),
+ ws as (
+ select
+ i_manufact_id,sum(ws_ext_sales_price) total_sales
+ from
+ plato.web_sales,
+ plato.date_dim,
+ plato.customer_address,
+ plato.item
+ where
+ i_manufact_id in (select
+ i_manufact_id
+from
+ plato.item
+where i_category in ('Books'))
+ and ws_item_sk = i_item_sk
+ and ws_sold_date_sk = d_date_sk
+ and d_year = 1999
+ and d_moy = 3
+ and ws_bill_addr_sk = ca_address_sk
+ and ca_gmt_offset = -5::numeric
+ group by i_manufact_id)
+ select i_manufact_id ,sum(total_sales) total_sales
+ from (select * from ss
+ union all
+ select * from cs
+ union all
+ select * from ws) tmp1
+ group by i_manufact_id
+ order by total_sales
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query33.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q34.sql b/yt/yql/tests/sql/suites/pg-tpcds/q34.sql
new file mode 100644
index 0000000000..c00f60c79f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q34.sql
@@ -0,0 +1,34 @@
+--!syntax_pg
+--TPC-DS Q34
+
+-- start query 1 in stream 0 using template ../query_templates/query34.tpl
+select c_last_name
+ ,c_first_name
+ ,c_salutation
+ ,c_preferred_cust_flag
+ ,ss_ticket_number
+ ,cnt from
+ (select ss_ticket_number
+ ,ss_customer_sk
+ ,count(*) cnt
+ from plato.store_sales,plato.date_dim,plato.store,plato.household_demographics
+ where store_sales.ss_sold_date_sk = date_dim.d_date_sk
+ and store_sales.ss_store_sk = store.s_store_sk
+ and store_sales.ss_hdemo_sk = household_demographics.hd_demo_sk
+ and (date_dim.d_dom between 1 and 3 or date_dim.d_dom between 25 and 28)
+ and (household_demographics.hd_buy_potential = '>10000' or
+ household_demographics.hd_buy_potential = 'Unknown')
+ and household_demographics.hd_vehicle_count > 0
+ and (case when household_demographics.hd_vehicle_count > 0
+ then household_demographics.hd_dep_count/ household_demographics.hd_vehicle_count
+ else null::int4
+ end)::float8 > 1.2::float8
+ and date_dim.d_year in (1998,1998+1,1998+2)
+ and store.s_county in ('Williamson County','Williamson County','Williamson County','Williamson County',
+ 'Williamson County','Williamson County','Williamson County','Williamson County')
+ group by ss_ticket_number,ss_customer_sk) dn,plato.customer
+ where ss_customer_sk = c_customer_sk
+ and cnt between 15::int8 and 20::int8
+ order by c_last_name,c_first_name,c_salutation,c_preferred_cust_flag desc, ss_ticket_number;
+
+-- end query 1 in stream 0 using template ../query_templates/query34.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q35.sql b/yt/yql/tests/sql/suites/pg-tpcds/q35.sql
new file mode 100644
index 0000000000..4177175164
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q35.sql
@@ -0,0 +1,61 @@
+--!syntax_pg
+--TPC-DS Q35
+
+-- start query 1 in stream 0 using template ../query_templates/query35.tpl
+select
+ ca_state,
+ cd_gender,
+ cd_marital_status,
+ cd_dep_count,
+ count(*) cnt1,
+ avg(cd_dep_count) a1,
+ max(cd_dep_count) x1,
+ sum(cd_dep_count) s1,
+ cd_dep_employed_count,
+ count(*) cnt2,
+ avg(cd_dep_employed_count) a2,
+ max(cd_dep_employed_count) x2,
+ sum(cd_dep_employed_count) s2,
+ cd_dep_college_count,
+ count(*) cnt3,
+ avg(cd_dep_college_count) a3,
+ max(cd_dep_college_count) x3,
+ sum(cd_dep_college_count) s3
+ from
+ plato.customer c,plato.customer_address ca,plato.customer_demographics
+ where
+ c.c_current_addr_sk = ca.ca_address_sk and
+ cd_demo_sk = c.c_current_cdemo_sk and
+ exists (select *
+ from plato.store_sales,plato.date_dim
+ where c.c_customer_sk = ss_customer_sk and
+ ss_sold_date_sk = d_date_sk and
+ d_year = 1999 and
+ d_qoy < 4) and
+ (exists (select *
+ from plato.web_sales,plato.date_dim
+ where c.c_customer_sk = ws_bill_customer_sk and
+ ws_sold_date_sk = d_date_sk and
+ d_year = 1999 and
+ d_qoy < 4) or
+ exists (select *
+ from plato.catalog_sales,plato.date_dim
+ where c.c_customer_sk = cs_ship_customer_sk and
+ cs_sold_date_sk = d_date_sk and
+ d_year = 1999 and
+ d_qoy < 4))
+ group by ca_state,
+ cd_gender,
+ cd_marital_status,
+ cd_dep_count,
+ cd_dep_employed_count,
+ cd_dep_college_count
+ order by ca_state,
+ cd_gender,
+ cd_marital_status,
+ cd_dep_count,
+ cd_dep_employed_count,
+ cd_dep_college_count
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query35.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q36.sql b/yt/yql/tests/sql/suites/pg-tpcds/q36.sql
new file mode 100644
index 0000000000..fe38dc7e86
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q36.sql
@@ -0,0 +1,33 @@
+--!syntax_pg
+--TPC-DS Q36
+
+-- start query 1 in stream 0 using template ../query_templates/query36.tpl
+select
+ sum(ss_net_profit)/sum(ss_ext_sales_price) as gross_margin
+ ,i_category
+ ,i_class
+ ,grouping(i_category)+grouping(i_class) as lochierarchy
+ ,rank() over (
+ partition by grouping(i_category)+grouping(i_class),
+ case when grouping(i_class) = 0 then i_category end
+ order by sum(ss_net_profit)/sum(ss_ext_sales_price) asc) as rank_within_parent
+ from
+ plato.store_sales
+ ,plato.date_dim d1
+ ,plato.item
+ ,plato.store
+ where
+ d1.d_year = 2000
+ and d1.d_date_sk = ss_sold_date_sk
+ and i_item_sk = ss_item_sk
+ and s_store_sk = ss_store_sk
+ and s_state in ('TN','TN','TN','TN',
+ 'TN','TN','TN','TN')
+ group by rollup(i_category,i_class)
+ order by
+ lochierarchy desc
+ ,case when lochierarchy = 0 then i_category end
+ ,rank_within_parent
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query36.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q37.sql b/yt/yql/tests/sql/suites/pg-tpcds/q37.sql
new file mode 100644
index 0000000000..285325bfae
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q37.sql
@@ -0,0 +1,20 @@
+--!syntax_pg
+--TPC-DS Q37
+
+-- start query 1 in stream 0 using template ../query_templates/query37.tpl
+select i_item_id
+ ,i_item_desc
+ ,i_current_price
+ from plato.item, plato.inventory, plato.date_dim, plato.catalog_sales
+ where i_current_price between 22::numeric and (22 + 30)::numeric
+ and inv_item_sk = i_item_sk
+ and d_date_sk=inv_date_sk
+ and d_date between cast('2001-06-02' as date) and (cast('2001-06-02' as date) + interval '60' day)::date
+ and i_manufact_id in (678,964,918,849)
+ and inv_quantity_on_hand between 100 and 500
+ and cs_item_sk = i_item_sk
+ group by i_item_id,i_item_desc,i_current_price
+ order by i_item_id
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query37.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q38.sql b/yt/yql/tests/sql/suites/pg-tpcds/q38.sql
new file mode 100644
index 0000000000..f27da36e41
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q38.sql
@@ -0,0 +1,26 @@
+--!syntax_pg
+--TPC-DS Q38
+
+-- start query 1 in stream 0 using template ../query_templates/query38.tpl
+select count(*) from (
+ select distinct c_last_name, c_first_name, d_date
+ from plato.store_sales, plato.date_dim, plato.customer
+ where store_sales.ss_sold_date_sk = date_dim.d_date_sk
+ and store_sales.ss_customer_sk = customer.c_customer_sk
+ and d_month_seq between 1212 and 1212 + 11
+ intersect
+ select distinct c_last_name, c_first_name, d_date
+ from plato.catalog_sales, plato.date_dim, plato.customer
+ where catalog_sales.cs_sold_date_sk = date_dim.d_date_sk
+ and catalog_sales.cs_bill_customer_sk = customer.c_customer_sk
+ and d_month_seq between 1212 and 1212 + 11
+ intersect
+ select distinct c_last_name, c_first_name, d_date
+ from plato.web_sales, plato.date_dim, plato.customer
+ where web_sales.ws_sold_date_sk = date_dim.d_date_sk
+ and web_sales.ws_bill_customer_sk = customer.c_customer_sk
+ and d_month_seq between 1212 and 1212 + 11
+) hot_cust
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query38.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q39.sql b/yt/yql/tests/sql/suites/pg-tpcds/q39.sql
new file mode 100644
index 0000000000..c877082142
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q39.sql
@@ -0,0 +1,57 @@
+--!syntax_pg
+--TPC-DS Q39
+
+-- start query 1 in stream 0 using template ../query_templates/query39.tpl
+with inv as
+(select w_warehouse_name,w_warehouse_sk,i_item_sk,d_moy
+ ,stdev,mean, case mean when 0::numeric then null::numeric else stdev/mean end cov
+ from(select w_warehouse_name,w_warehouse_sk,i_item_sk,d_moy
+ ,stddev_samp(inv_quantity_on_hand) stdev,avg(inv_quantity_on_hand) mean
+ from plato.inventory
+ ,plato.item
+ ,plato.warehouse
+ ,plato.date_dim
+ where inv_item_sk = i_item_sk
+ and inv_warehouse_sk = w_warehouse_sk
+ and inv_date_sk = d_date_sk
+ and d_year =1998
+ group by w_warehouse_name,w_warehouse_sk,i_item_sk,d_moy) foo
+ where case mean when 0::numeric then 0::numeric else stdev/mean end > 1::numeric)
+select inv1.w_warehouse_sk as inv1_w_warehouse_sk,inv1.i_item_sk as inv1_i_item_sk,inv1.d_moy as inv1_d_moy,inv1.mean as inv1_mean, inv1.cov as inv1_cov
+ ,inv2.w_warehouse_sk as inv2_w_warehouse_sk,inv2.i_item_sk as inv2_i_item_sk,inv2.d_moy as inv2_d_moy,inv2.mean as inv2_mean, inv2.cov as inv2_cov
+from inv inv1,inv inv2
+where inv1.i_item_sk = inv2.i_item_sk
+ and inv1.w_warehouse_sk = inv2.w_warehouse_sk
+ and inv1.d_moy=4
+ and inv2.d_moy=4+1
+order by inv1_w_warehouse_sk,inv1_i_item_sk,inv1_d_moy,inv1_mean,inv1_cov
+ ,inv2_d_moy,inv2_mean, inv2_cov
+;
+with inv as
+(select w_warehouse_name,w_warehouse_sk,i_item_sk,d_moy
+ ,stdev,mean, case mean when 0::numeric then null::numeric else stdev/mean end cov
+ from(select w_warehouse_name,w_warehouse_sk,i_item_sk,d_moy
+ ,stddev_samp(inv_quantity_on_hand) stdev,avg(inv_quantity_on_hand) mean
+ from plato.inventory
+ ,plato.item
+ ,plato.warehouse
+ ,plato.date_dim
+ where inv_item_sk = i_item_sk
+ and inv_warehouse_sk = w_warehouse_sk
+ and inv_date_sk = d_date_sk
+ and d_year =1998
+ group by w_warehouse_name,w_warehouse_sk,i_item_sk,d_moy) foo
+ where case mean when 0::numeric then 0::numeric else stdev/mean end > 1::numeric)
+select inv1.w_warehouse_sk as inv1_w_warehouse_sk,inv1.i_item_sk as inv1_i_item_sk,inv1.d_moy as inv1_d_moy,inv1.mean as inv1_mean, inv1.cov as inv1_cov
+ ,inv2.w_warehouse_sk as inv2_w_warehouse_sk,inv2.i_item_sk as inv2_i_item_sk,inv2.d_moy as inv2_d_moy,inv2.mean as inv2_mean, inv2.cov as inv2_cov
+from inv inv1,inv inv2
+where inv1.i_item_sk = inv2.i_item_sk
+ and inv1.w_warehouse_sk = inv2.w_warehouse_sk
+ and inv1.d_moy=4
+ and inv2.d_moy=4+1
+ and inv1.cov > 1.5::numeric
+order by inv1_w_warehouse_sk,inv1_i_item_sk,inv1_d_moy,inv1_mean,inv1_cov
+ ,inv2_d_moy,inv2_mean, inv2_cov
+;
+
+-- end query 1 in stream 0 using template ../query_templates/query39.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q40.sql b/yt/yql/tests/sql/suites/pg-tpcds/q40.sql
new file mode 100644
index 0000000000..f7249d21c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q40.sql
@@ -0,0 +1,31 @@
+--!syntax_pg
+--TPC-DS Q40
+
+-- start query 1 in stream 0 using template ../query_templates/query40.tpl
+select
+ w_state
+ ,i_item_id
+ ,sum(case when (cast(d_date as date) < cast ('1998-04-08' as date))
+ then cs_sales_price - coalesce(cr_refunded_cash,0::numeric) else 0::numeric end) as sales_before
+ ,sum(case when (cast(d_date as date) >= cast ('1998-04-08' as date))
+ then cs_sales_price - coalesce(cr_refunded_cash,0::numeric) else 0::numeric end) as sales_after
+ from
+ plato.catalog_sales left outer join plato.catalog_returns on
+ (cs_order_number = cr_order_number
+ and cs_item_sk = cr_item_sk)
+ ,plato.warehouse
+ ,plato.item
+ ,plato.date_dim
+ where
+ i_current_price between 0.99::numeric and 1.49::numeric
+ and i_item_sk = cs_item_sk
+ and cs_warehouse_sk = w_warehouse_sk
+ and cs_sold_date_sk = d_date_sk
+ and d_date between (cast ('1998-04-08' as date) - interval '30' day)::date
+ and (cast ('1998-04-08' as date) + interval '30' day)::date
+ group by
+ w_state,i_item_id
+ order by w_state,i_item_id
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query40.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q41.sql b/yt/yql/tests/sql/suites/pg-tpcds/q41.sql
new file mode 100644
index 0000000000..6b79d610f1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q41.sql
@@ -0,0 +1,55 @@
+--!syntax_pg
+--TPC-DS Q41
+
+-- start query 1 in stream 0 using template ../query_templates/query41.tpl
+select distinct(i_product_name)
+ from plato.item i1
+ where i_manufact_id between 742 and 742+40
+ and (select count(*) as item_cnt
+ from plato.item
+ where (i_manufact = i1.i_manufact and
+ ((i_category = 'Women' and
+ (i_color = 'orchid' or i_color = 'papaya') and
+ (i_units = 'Pound' or i_units = 'Lb') and
+ (i_size = 'petite' or i_size = 'medium')
+ ) or
+ (i_category = 'Women' and
+ (i_color = 'burlywood' or i_color = 'navy') and
+ (i_units = 'Bundle' or i_units = 'Each') and
+ (i_size = 'N/A' or i_size = 'extra large')
+ ) or
+ (i_category = 'Men' and
+ (i_color = 'bisque' or i_color = 'azure') and
+ (i_units = 'N/A' or i_units = 'Tsp') and
+ (i_size = 'small' or i_size = 'large')
+ ) or
+ (i_category = 'Men' and
+ (i_color = 'chocolate' or i_color = 'cornflower') and
+ (i_units = 'Bunch' or i_units = 'Gross') and
+ (i_size = 'petite' or i_size = 'medium')
+ ))) or
+ (i_manufact = i1.i_manufact and
+ ((i_category = 'Women' and
+ (i_color = 'salmon' or i_color = 'midnight') and
+ (i_units = 'Oz' or i_units = 'Box') and
+ (i_size = 'petite' or i_size = 'medium')
+ ) or
+ (i_category = 'Women' and
+ (i_color = 'snow' or i_color = 'steel') and
+ (i_units = 'Carton' or i_units = 'Tbl') and
+ (i_size = 'N/A' or i_size = 'extra large')
+ ) or
+ (i_category = 'Men' and
+ (i_color = 'purple' or i_color = 'gainsboro') and
+ (i_units = 'Dram' or i_units = 'Unknown') and
+ (i_size = 'small' or i_size = 'large')
+ ) or
+ (i_category = 'Men' and
+ (i_color = 'metallic' or i_color = 'forest') and
+ (i_units = 'Gram' or i_units = 'Ounce') and
+ (i_size = 'petite' or i_size = 'medium')
+ )))) > 0
+ order by i_product_name
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query41.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q42.sql b/yt/yql/tests/sql/suites/pg-tpcds/q42.sql
new file mode 100644
index 0000000000..a8fed2fb3a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q42.sql
@@ -0,0 +1,25 @@
+--!syntax_pg
+--TPC-DS Q42
+
+-- start query 1 in stream 0 using template ../query_templates/query42.tpl
+select dt.d_year
+ ,item.i_category_id
+ ,item.i_category
+ ,sum(ss_ext_sales_price)
+ from plato.date_dim dt
+ ,plato.store_sales
+ ,plato.item
+ where dt.d_date_sk = store_sales.ss_sold_date_sk
+ and store_sales.ss_item_sk = item.i_item_sk
+ and item.i_manager_id = 1
+ and dt.d_moy=12
+ and dt.d_year=1998
+ group by dt.d_year
+ ,item.i_category_id
+ ,item.i_category
+ order by sum(ss_ext_sales_price) desc,dt.d_year
+ ,item.i_category_id
+ ,item.i_category
+limit 100 ;
+
+-- end query 1 in stream 0 using template ../query_templates/query42.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q43.sql b/yt/yql/tests/sql/suites/pg-tpcds/q43.sql
new file mode 100644
index 0000000000..a2adaad63a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q43.sql
@@ -0,0 +1,22 @@
+--!syntax_pg
+--TPC-DS Q43
+
+-- start query 1 in stream 0 using template ../query_templates/query43.tpl
+select s_store_name, s_store_id,
+ sum(case when (d_day_name='Sunday') then ss_sales_price else null::numeric end) sun_sales,
+ sum(case when (d_day_name='Monday') then ss_sales_price else null::numeric end) mon_sales,
+ sum(case when (d_day_name='Tuesday') then ss_sales_price else null::numeric end) tue_sales,
+ sum(case when (d_day_name='Wednesday') then ss_sales_price else null::numeric end) wed_sales,
+ sum(case when (d_day_name='Thursday') then ss_sales_price else null::numeric end) thu_sales,
+ sum(case when (d_day_name='Friday') then ss_sales_price else null::numeric end) fri_sales,
+ sum(case when (d_day_name='Saturday') then ss_sales_price else null::numeric end) sat_sales
+ from plato.date_dim, plato.store_sales, plato.store
+ where d_date_sk = ss_sold_date_sk and
+ s_store_sk = ss_store_sk and
+ s_gmt_offset = -5::numeric and
+ d_year = 1998
+ group by s_store_name, s_store_id
+ order by s_store_name, s_store_id,sun_sales,mon_sales,tue_sales,wed_sales,thu_sales,fri_sales,sat_sales
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query43.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q44.sql b/yt/yql/tests/sql/suites/pg-tpcds/q44.sql
new file mode 100644
index 0000000000..cf5a5fd9fb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q44.sql
@@ -0,0 +1,38 @@
+--!syntax_pg
+--TPC-DS Q44
+
+-- start query 1 in stream 0 using template ../query_templates/query44.tpl
+select asceding.rnk, i1.i_product_name best_performing, i2.i_product_name worst_performing
+from(select *
+ from (select item_sk,rank() over (order by rank_col asc) rnk
+ from (select ss_item_sk item_sk,avg(ss_net_profit) rank_col
+ from plato.store_sales ss1
+ where ss_store_sk = 2
+ group by ss_item_sk
+ having avg(ss_net_profit) > 0.9::numeric*(select avg(ss_net_profit) rank_col
+ from plato.store_sales
+ where ss_store_sk = 2
+ and ss_hdemo_sk is null
+ group by ss_store_sk))V1)V11
+ where rnk < 11) asceding,
+ (select *
+ from (select item_sk,rank() over (order by rank_col desc) rnk
+ from (select ss_item_sk item_sk,avg(ss_net_profit) rank_col
+ from plato.store_sales ss1
+ where ss_store_sk = 2
+ group by ss_item_sk
+ having avg(ss_net_profit) > 0.9::numeric*(select avg(ss_net_profit) rank_col
+ from plato.store_sales
+ where ss_store_sk = 2
+ and ss_hdemo_sk is null
+ group by ss_store_sk))V2)V21
+ where rnk < 11) descending,
+plato.item i1,
+plato.item i2
+where asceding.rnk = descending.rnk
+ and i1.i_item_sk=asceding.item_sk
+ and i2.i_item_sk=descending.item_sk
+order by asceding.rnk
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query44.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q45.sql b/yt/yql/tests/sql/suites/pg-tpcds/q45.sql
new file mode 100644
index 0000000000..0e8df9be19
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q45.sql
@@ -0,0 +1,23 @@
+--!syntax_pg
+--TPC-DS Q45
+
+-- start query 1 in stream 0 using template ../query_templates/query45.tpl
+select ca_zip, ca_county, sum(ws_sales_price)
+ from plato.web_sales, plato.customer, plato.customer_address, plato.date_dim, plato.item
+ where ws_bill_customer_sk = c_customer_sk
+ and c_current_addr_sk = ca_address_sk
+ and ws_item_sk = i_item_sk
+ and ( substr(ca_zip,1,5) in ('85669', '86197','88274','83405','86475', '85392', '85460', '80348', '81792')
+ or
+ i_item_id in (select i_item_id
+ from plato.item
+ where i_item_sk in (2, 3, 5, 7, 11, 13, 17, 19, 23, 29)
+ )
+ )
+ and ws_sold_date_sk = d_date_sk
+ and d_qoy = 2 and d_year = 2000
+ group by ca_zip, ca_county
+ order by ca_zip, ca_county
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query45.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q46.sql b/yt/yql/tests/sql/suites/pg-tpcds/q46.sql
new file mode 100644
index 0000000000..27c2b14727
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q46.sql
@@ -0,0 +1,38 @@
+--!syntax_pg
+--TPC-DS Q46
+
+-- start query 1 in stream 0 using template ../query_templates/query46.tpl
+select c_last_name
+ ,c_first_name
+ ,ca_city
+ ,bought_city
+ ,ss_ticket_number
+ ,amt,profit
+ from
+ (select ss_ticket_number
+ ,ss_customer_sk
+ ,ca_city bought_city
+ ,sum(ss_coupon_amt) amt
+ ,sum(ss_net_profit) profit
+ from plato.store_sales,plato.date_dim,plato.store,plato.household_demographics,plato.customer_address
+ where store_sales.ss_sold_date_sk = date_dim.d_date_sk
+ and store_sales.ss_store_sk = store.s_store_sk
+ and store_sales.ss_hdemo_sk = household_demographics.hd_demo_sk
+ and store_sales.ss_addr_sk = customer_address.ca_address_sk
+ and (household_demographics.hd_dep_count = 5 or
+ household_demographics.hd_vehicle_count= 3)
+ and date_dim.d_dow in (6,0)
+ and date_dim.d_year in (1999,1999+1,1999+2)
+ and store.s_city in ('Midway','Fairview','Fairview','Midway','Fairview')
+ group by ss_ticket_number,ss_customer_sk,ss_addr_sk,ca_city) dn,plato.customer,plato.customer_address current_addr
+ where ss_customer_sk = c_customer_sk
+ and customer.c_current_addr_sk = current_addr.ca_address_sk
+ and current_addr.ca_city <> bought_city
+ order by c_last_name
+ ,c_first_name
+ ,ca_city
+ ,bought_city
+ ,ss_ticket_number
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query46.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q47.sql b/yt/yql/tests/sql/suites/pg-tpcds/q47.sql
new file mode 100644
index 0000000000..126f80e1eb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q47.sql
@@ -0,0 +1,54 @@
+--!syntax_pg
+--TPC-DS Q47
+
+-- start query 1 in stream 0 using template ../query_templates/query47.tpl
+with v1 as(
+ select i_category, i_brand,
+ s_store_name, s_company_name,
+ d_year, d_moy,
+ sum(ss_sales_price) sum_sales,
+ avg(sum(ss_sales_price)) over
+ (partition by i_category, i_brand,
+ s_store_name, s_company_name, d_year)
+ avg_monthly_sales,
+ rank() over
+ (partition by i_category, i_brand,
+ s_store_name, s_company_name
+ order by d_year, d_moy) rn
+ from plato.item, plato.store_sales, plato.date_dim, plato.store
+ where ss_item_sk = i_item_sk and
+ ss_sold_date_sk = d_date_sk and
+ ss_store_sk = s_store_sk and
+ (
+ d_year = 2000 or
+ ( d_year = 2000-1 and d_moy =12) or
+ ( d_year = 2000+1 and d_moy =1)
+ )
+ group by i_category, i_brand,
+ s_store_name, s_company_name,
+ d_year, d_moy),
+ v2 as(
+ select v1.i_category, v1.i_brand
+ ,v1.d_year, v1.d_moy
+ ,v1.avg_monthly_sales
+ ,v1.sum_sales, v1_lag.sum_sales psum, v1_lead.sum_sales nsum
+ from v1, v1 v1_lag, v1 v1_lead
+ where v1.i_category = v1_lag.i_category and
+ v1.i_category = v1_lead.i_category and
+ v1.i_brand = v1_lag.i_brand and
+ v1.i_brand = v1_lead.i_brand and
+ v1.s_store_name = v1_lag.s_store_name and
+ v1.s_store_name = v1_lead.s_store_name and
+ v1.s_company_name = v1_lag.s_company_name and
+ v1.s_company_name = v1_lead.s_company_name and
+ v1.rn = v1_lag.rn + 1 and
+ v1.rn = v1_lead.rn - 1)
+ select *
+ from v2
+ where d_year = 2000 and
+ avg_monthly_sales > 0::numeric and
+ case when avg_monthly_sales > 0::numeric then abs(sum_sales - avg_monthly_sales) / avg_monthly_sales else null::numeric end > 0.1::numeric
+ order by sum_sales - avg_monthly_sales, nsum
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query47.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q48.sql b/yt/yql/tests/sql/suites/pg-tpcds/q48.sql
new file mode 100644
index 0000000000..43155a852e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q48.sql
@@ -0,0 +1,70 @@
+--!syntax_pg
+--TPC-DS Q48
+
+-- start query 1 in stream 0 using template ../query_templates/query48.tpl
+select sum (ss_quantity)
+ from plato.store_sales, plato.store, plato.customer_demographics, plato.customer_address, plato.date_dim
+ where s_store_sk = ss_store_sk
+ and ss_sold_date_sk = d_date_sk and d_year = 1998
+ and
+ (
+ (
+ cd_demo_sk = ss_cdemo_sk
+ and
+ cd_marital_status = 'M'
+ and
+ cd_education_status = '4 yr Degree'
+ and
+ ss_sales_price between 100.00::numeric and 150.00::numeric
+ )
+ or
+ (
+ cd_demo_sk = ss_cdemo_sk
+ and
+ cd_marital_status = 'D'
+ and
+ cd_education_status = 'Primary'
+ and
+ ss_sales_price between 50.00::numeric and 100.00::numeric
+ )
+ or
+ (
+ cd_demo_sk = ss_cdemo_sk
+ and
+ cd_marital_status = 'U'
+ and
+ cd_education_status = 'Advanced Degree'
+ and
+ ss_sales_price between 150.00::numeric and 200.00::numeric
+ )
+ )
+ and
+ (
+ (
+ ss_addr_sk = ca_address_sk
+ and
+ ca_country = 'United States'
+ and
+ ca_state in ('KY', 'GA', 'NM')
+ and ss_net_profit between 0::numeric and 2000::numeric
+ )
+ or
+ (ss_addr_sk = ca_address_sk
+ and
+ ca_country = 'United States'
+ and
+ ca_state in ('MT', 'OR', 'IN')
+ and ss_net_profit between 150::numeric and 3000::numeric
+ )
+ or
+ (ss_addr_sk = ca_address_sk
+ and
+ ca_country = 'United States'
+ and
+ ca_state in ('WI', 'MO', 'WV')
+ and ss_net_profit between 50::numeric and 25000::numeric
+ )
+ )
+;
+
+-- end query 1 in stream 0 using template ../query_templates/query48.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q49.sql b/yt/yql/tests/sql/suites/pg-tpcds/q49.sql
new file mode 100644
index 0000000000..62fa592b2b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q49.sql
@@ -0,0 +1,132 @@
+--!syntax_pg
+--TPC-DS Q49
+
+-- start query 1 in stream 0 using template ../query_templates/query49.tpl
+select channel, item, return_ratio, return_rank, currency_rank from
+ (select
+ 'web' as channel
+ ,web.item
+ ,web.return_ratio
+ ,web.return_rank
+ ,web.currency_rank
+ from (
+ select
+ item
+ ,return_ratio
+ ,currency_ratio
+ ,rank() over (order by return_ratio) as return_rank
+ ,rank() over (order by currency_ratio) as currency_rank
+ from
+ ( select ws.ws_item_sk as item
+ ,(cast(sum(coalesce(wr.wr_return_quantity,0)) as decimal(15,4))/
+ cast(sum(coalesce(ws.ws_quantity,0)) as decimal(15,4) )) as return_ratio
+ ,(cast(sum(coalesce(wr.wr_return_amt,0::numeric)) as decimal(15,4))/
+ cast(sum(coalesce(ws.ws_net_paid,0::numeric)) as decimal(15,4) )) as currency_ratio
+ from
+ plato.web_sales ws left outer join plato.web_returns wr
+ on (ws.ws_order_number = wr.wr_order_number and
+ ws.ws_item_sk = wr.wr_item_sk)
+ ,plato.date_dim
+ where
+ wr.wr_return_amt > 10000::numeric
+ and ws.ws_net_profit > 1::numeric
+ and ws.ws_net_paid > 0::numeric
+ and ws.ws_quantity > 0
+ and ws_sold_date_sk = d_date_sk
+ and d_year = 2000
+ and d_moy = 12
+ group by ws.ws_item_sk
+ ) in_web
+ ) web
+ where
+ (
+ web.return_rank <= 10
+ or
+ web.currency_rank <= 10
+ )
+ union
+ select
+ 'catalog' as channel
+ ,catalog.item
+ ,catalog.return_ratio
+ ,catalog.return_rank
+ ,catalog.currency_rank
+ from (
+ select
+ item
+ ,return_ratio
+ ,currency_ratio
+ ,rank() over (order by return_ratio) as return_rank
+ ,rank() over (order by currency_ratio) as currency_rank
+ from
+ ( select
+ cs.cs_item_sk as item
+ ,(cast(sum(coalesce(cr.cr_return_quantity,0)) as decimal(15,4))/
+ cast(sum(coalesce(cs.cs_quantity,0)) as decimal(15,4) )) as return_ratio
+ ,(cast(sum(coalesce(cr.cr_return_amount,0::numeric)) as decimal(15,4))/
+ cast(sum(coalesce(cs.cs_net_paid,0::numeric)) as decimal(15,4) )) as currency_ratio
+ from
+ plato.catalog_sales cs left outer join plato.catalog_returns cr
+ on (cs.cs_order_number = cr.cr_order_number and
+ cs.cs_item_sk = cr.cr_item_sk)
+ ,plato.date_dim
+ where
+ cr.cr_return_amount > 10000::numeric
+ and cs.cs_net_profit > 1::numeric
+ and cs.cs_net_paid > 0::numeric
+ and cs.cs_quantity > 0
+ and cs_sold_date_sk = d_date_sk
+ and d_year = 2000
+ and d_moy = 12
+ group by cs.cs_item_sk
+ ) in_cat
+ ) catalog
+ where
+ (
+ catalog.return_rank <= 10
+ or
+ catalog.currency_rank <=10
+ )
+ union
+ select
+ 'store' as channel
+ ,store.item
+ ,store.return_ratio
+ ,store.return_rank
+ ,store.currency_rank
+ from (
+ select
+ item
+ ,return_ratio
+ ,currency_ratio
+ ,rank() over (order by return_ratio) as return_rank
+ ,rank() over (order by currency_ratio) as currency_rank
+ from
+ ( select sts.ss_item_sk as item
+ ,(cast(sum(coalesce(sr.sr_return_quantity,0)) as decimal(15,4))/cast(sum(coalesce(sts.ss_quantity,0)) as decimal(15,4) )) as return_ratio
+ ,(cast(sum(coalesce(sr.sr_return_amt,0::numeric)) as decimal(15,4))/cast(sum(coalesce(sts.ss_net_paid,0::numeric)) as decimal(15,4) )) as currency_ratio
+ from
+ plato.store_sales sts left outer join plato.store_returns sr
+ on (sts.ss_ticket_number = sr.sr_ticket_number and sts.ss_item_sk = sr.sr_item_sk)
+ ,plato.date_dim
+ where
+ sr.sr_return_amt > 10000::numeric
+ and sts.ss_net_profit > 1::numeric
+ and sts.ss_net_paid > 0::numeric
+ and sts.ss_quantity > 0
+ and ss_sold_date_sk = d_date_sk
+ and d_year = 2000
+ and d_moy = 12
+ group by sts.ss_item_sk
+ ) in_store
+ ) store
+ where (
+ store.return_rank <= 10
+ or
+ store.currency_rank <= 10
+ )
+ ) a
+ order by 1,4,5,2
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query49.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q50.sql b/yt/yql/tests/sql/suites/pg-tpcds/q50.sql
new file mode 100644
index 0000000000..967a684157
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q50.sql
@@ -0,0 +1,62 @@
+--!syntax_pg
+--TPC-DS Q50
+
+-- start query 1 in stream 0 using template ../query_templates/query50.tpl
+select
+ s_store_name
+ ,s_company_id
+ ,s_street_number
+ ,s_street_name
+ ,s_street_type
+ ,s_suite_number
+ ,s_city
+ ,s_county
+ ,s_state
+ ,s_zip
+ ,sum(case when (sr_returned_date_sk - ss_sold_date_sk <= 30 ) then 1 else 0 end) as "30 days"
+ ,sum(case when (sr_returned_date_sk - ss_sold_date_sk > 30) and
+ (sr_returned_date_sk - ss_sold_date_sk <= 60) then 1 else 0 end ) as "31-60 days"
+ ,sum(case when (sr_returned_date_sk - ss_sold_date_sk > 60) and
+ (sr_returned_date_sk - ss_sold_date_sk <= 90) then 1 else 0 end) as "61-90 days"
+ ,sum(case when (sr_returned_date_sk - ss_sold_date_sk > 90) and
+ (sr_returned_date_sk - ss_sold_date_sk <= 120) then 1 else 0 end) as "91-120 days"
+ ,sum(case when (sr_returned_date_sk - ss_sold_date_sk > 120) then 1 else 0 end) as ">120 days"
+from
+ plato.store_sales
+ ,plato.store_returns
+ ,plato.store
+ ,plato.date_dim d1
+ ,plato.date_dim d2
+where
+ d2.d_year = 2000
+and d2.d_moy = 9
+and ss_ticket_number = sr_ticket_number
+and ss_item_sk = sr_item_sk
+and ss_sold_date_sk = d1.d_date_sk
+and sr_returned_date_sk = d2.d_date_sk
+and ss_customer_sk = sr_customer_sk
+and ss_store_sk = s_store_sk
+group by
+ s_store_name
+ ,s_company_id
+ ,s_street_number
+ ,s_street_name
+ ,s_street_type
+ ,s_suite_number
+ ,s_city
+ ,s_county
+ ,s_state
+ ,s_zip
+order by s_store_name
+ ,s_company_id
+ ,s_street_number
+ ,s_street_name
+ ,s_street_type
+ ,s_suite_number
+ ,s_city
+ ,s_county
+ ,s_state
+ ,s_zip
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query50.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q51.sql b/yt/yql/tests/sql/suites/pg-tpcds/q51.sql
new file mode 100644
index 0000000000..07e822bb3a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q51.sql
@@ -0,0 +1,48 @@
+--!syntax_pg
+--TPC-DS Q51
+
+-- start query 1 in stream 0 using template ../query_templates/query51.tpl
+WITH web_v1 as (
+select
+ ws_item_sk item_sk, d_date,
+ sum(sum(ws_sales_price))
+ over (partition by ws_item_sk order by d_date rows between unbounded preceding and current row) cume_sales
+from plato.web_sales
+ ,plato.date_dim
+where ws_sold_date_sk=d_date_sk
+ and d_month_seq between 1212 and 1212+11
+ and ws_item_sk is not NULL
+group by ws_item_sk, d_date),
+store_v1 as (
+select
+ ss_item_sk item_sk, d_date,
+ sum(sum(ss_sales_price))
+ over (partition by ss_item_sk order by d_date rows between unbounded preceding and current row) cume_sales
+from plato.store_sales
+ ,plato.date_dim
+where ss_sold_date_sk=d_date_sk
+ and d_month_seq between 1212 and 1212+11
+ and ss_item_sk is not NULL
+group by ss_item_sk, d_date)
+ select *
+from (select item_sk
+ ,d_date
+ ,web_sales
+ ,store_sales
+ ,max(web_sales)
+ over (partition by item_sk order by d_date rows between unbounded preceding and current row) web_cumulative
+ ,max(store_sales)
+ over (partition by item_sk order by d_date rows between unbounded preceding and current row) store_cumulative
+ from (select case when web.item_sk is not null then web.item_sk else store.item_sk end item_sk
+ ,case when web.d_date is not null then web.d_date else store.d_date end d_date
+ ,web.cume_sales web_sales
+ ,store.cume_sales store_sales
+ from web_v1 web full outer join store_v1 store on (web.item_sk = store.item_sk
+ and web.d_date = store.d_date)
+ )x )y
+where web_cumulative > store_cumulative
+order by item_sk
+ ,d_date
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query51.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q52.sql b/yt/yql/tests/sql/suites/pg-tpcds/q52.sql
new file mode 100644
index 0000000000..e49b9b8142
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q52.sql
@@ -0,0 +1,25 @@
+--!syntax_pg
+--TPC-DS Q52
+
+-- start query 1 in stream 0 using template ../query_templates/query52.tpl
+select dt.d_year
+ ,item.i_brand_id brand_id
+ ,item.i_brand brand
+ ,sum(ss_ext_sales_price) ext_price
+ from plato.date_dim dt
+ ,plato.store_sales
+ ,plato.item
+ where dt.d_date_sk = store_sales.ss_sold_date_sk
+ and store_sales.ss_item_sk = item.i_item_sk
+ and item.i_manager_id = 1
+ and dt.d_moy=12
+ and dt.d_year=1998
+ group by dt.d_year
+ ,item.i_brand
+ ,item.i_brand_id
+ order by dt.d_year
+ ,ext_price desc
+ ,brand_id
+limit 100 ;
+
+-- end query 1 in stream 0 using template ../query_templates/query52.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q53.sql b/yt/yql/tests/sql/suites/pg-tpcds/q53.sql
new file mode 100644
index 0000000000..bb9c25ce72
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q53.sql
@@ -0,0 +1,31 @@
+--!syntax_pg
+--TPC-DS Q53
+
+-- start query 1 in stream 0 using template ../query_templates/query53.tpl
+select * from
+(select i_manufact_id,
+sum(ss_sales_price) sum_sales,
+avg(sum(ss_sales_price)) over (partition by i_manufact_id) avg_quarterly_sales
+from plato.item, plato.store_sales, plato.date_dim, plato.store
+where ss_item_sk = i_item_sk and
+ss_sold_date_sk = d_date_sk and
+ss_store_sk = s_store_sk and
+d_month_seq in (1212,1212+1,1212+2,1212+3,1212+4,1212+5,1212+6,1212+7,1212+8,1212+9,1212+10,1212+11) and
+((i_category in ('Books','Children','Electronics') and
+i_class in ('personal','portable','reference','self-help') and
+i_brand in ('scholaramalgamalg #14','scholaramalgamalg #7',
+ 'exportiunivamalg #9','scholaramalgamalg #9'))
+or(i_category in ('Women','Music','Men') and
+i_class in ('accessories','classical','fragrances','pants') and
+i_brand in ('amalgimporto #1','edu packscholar #1','exportiimporto #1',
+ 'importoamalg #1')))
+group by i_manufact_id, d_qoy ) tmp1
+where case when avg_quarterly_sales > 0::numeric
+ then abs (sum_sales - avg_quarterly_sales)/ avg_quarterly_sales
+ else null::numeric end > 0.1::numeric
+order by avg_quarterly_sales,
+ sum_sales,
+ i_manufact_id
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query53.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q54.sql b/yt/yql/tests/sql/suites/pg-tpcds/q54.sql
new file mode 100644
index 0000000000..2396c50fe9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q54.sql
@@ -0,0 +1,59 @@
+--!syntax_pg
+--TPC-DS Q54
+
+-- start query 1 in stream 0 using template ../query_templates/query54.tpl
+with my_customers as (
+ select distinct c_customer_sk
+ , c_current_addr_sk
+ from
+ ( select cs_sold_date_sk sold_date_sk,
+ cs_bill_customer_sk customer_sk,
+ cs_item_sk item_sk
+ from plato.catalog_sales
+ union all
+ select ws_sold_date_sk sold_date_sk,
+ ws_bill_customer_sk customer_sk,
+ ws_item_sk item_sk
+ from plato.web_sales
+ ) cs_or_ws_sales,
+ plato.item,
+ plato.date_dim,
+ plato.customer
+ where sold_date_sk = d_date_sk
+ and item_sk = i_item_sk
+ and i_category = 'Jewelry'
+ and i_class = 'consignment'
+ and c_customer_sk = cs_or_ws_sales.customer_sk
+ and d_moy = 3
+ and d_year = 1999
+ )
+ , my_revenue as (
+ select c_customer_sk,
+ sum(ss_ext_sales_price) as revenue
+ from my_customers,
+ plato.store_sales,
+ plato.customer_address,
+ plato.store,
+ plato.date_dim
+ where c_current_addr_sk = ca_address_sk
+ and ca_county = s_county
+ and ca_state = s_state
+ and ss_sold_date_sk = d_date_sk
+ and c_customer_sk = ss_customer_sk
+ and d_month_seq between (select distinct d_month_seq+1
+ from plato.date_dim where d_year = 1999 and d_moy = 3)
+ and (select distinct d_month_seq+3
+ from plato.date_dim where d_year = 1999 and d_moy = 3)
+ group by c_customer_sk
+ )
+ , segments as
+ (select cast((revenue/50::numeric) as int) as segment
+ from my_revenue
+ )
+ select segment, count(*) as num_customers, segment*50 as segment_base
+ from segments
+ group by segment
+ order by segment, num_customers
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query54.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q55.sql b/yt/yql/tests/sql/suites/pg-tpcds/q55.sql
new file mode 100644
index 0000000000..3f42cc3c82
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q55.sql
@@ -0,0 +1,17 @@
+--!syntax_pg
+--TPC-DS Q55
+
+-- start query 1 in stream 0 using template ../query_templates/query55.tpl
+select i_brand_id brand_id, i_brand brand,
+ sum(ss_ext_sales_price) ext_price
+ from plato.date_dim, plato.store_sales, plato.item
+ where d_date_sk = ss_sold_date_sk
+ and ss_item_sk = i_item_sk
+ and i_manager_id=36
+ and d_moy=12
+ and d_year=2001
+ group by i_brand, i_brand_id
+ order by ext_price desc, i_brand_id
+limit 100 ;
+
+-- end query 1 in stream 0 using template ../query_templates/query55.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q56.sql b/yt/yql/tests/sql/suites/pg-tpcds/q56.sql
new file mode 100644
index 0000000000..8f6b72b284
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q56.sql
@@ -0,0 +1,72 @@
+--!syntax_pg
+--TPC-DS Q56
+
+-- start query 1 in stream 0 using template ../query_templates/query56.tpl
+with ss as (
+ select i_item_id,sum(ss_ext_sales_price) total_sales
+ from
+ plato.store_sales,
+ plato.date_dim,
+ plato.customer_address,
+ plato.item
+ where i_item_id in (select
+ i_item_id
+from plato.item
+where i_color in ('orchid','chiffon','lace'))
+ and ss_item_sk = i_item_sk
+ and ss_sold_date_sk = d_date_sk
+ and d_year = 2000
+ and d_moy = 1
+ and ss_addr_sk = ca_address_sk
+ and ca_gmt_offset = -8::numeric
+ group by i_item_id),
+ cs as (
+ select i_item_id,sum(cs_ext_sales_price) total_sales
+ from
+ plato.catalog_sales,
+ plato.date_dim,
+ plato.customer_address,
+ plato.item
+ where
+ i_item_id in (select
+ i_item_id
+from plato.item
+where i_color in ('orchid','chiffon','lace'))
+ and cs_item_sk = i_item_sk
+ and cs_sold_date_sk = d_date_sk
+ and d_year = 2000
+ and d_moy = 1
+ and cs_bill_addr_sk = ca_address_sk
+ and ca_gmt_offset = -8::numeric
+ group by i_item_id),
+ ws as (
+ select i_item_id,sum(ws_ext_sales_price) total_sales
+ from
+ plato.web_sales,
+ plato.date_dim,
+ plato.customer_address,
+ plato.item
+ where
+ i_item_id in (select
+ i_item_id
+from plato.item
+where i_color in ('orchid','chiffon','lace'))
+ and ws_item_sk = i_item_sk
+ and ws_sold_date_sk = d_date_sk
+ and d_year = 2000
+ and d_moy = 1
+ and ws_bill_addr_sk = ca_address_sk
+ and ca_gmt_offset = -8::numeric
+ group by i_item_id)
+ select i_item_id ,sum(total_sales) total_sales
+ from (select * from ss
+ union all
+ select * from cs
+ union all
+ select * from ws) tmp1
+ group by i_item_id
+ order by total_sales,
+ i_item_id
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query56.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q57.sql b/yt/yql/tests/sql/suites/pg-tpcds/q57.sql
new file mode 100644
index 0000000000..29d1e9ee12
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q57.sql
@@ -0,0 +1,51 @@
+--!syntax_pg
+--TPC-DS Q57
+
+-- start query 1 in stream 0 using template ../query_templates/query57.tpl
+with v1 as(
+ select i_category, i_brand,
+ cc_name,
+ d_year, d_moy,
+ sum(cs_sales_price) sum_sales,
+ avg(sum(cs_sales_price)) over
+ (partition by i_category, i_brand,
+ cc_name, d_year)
+ avg_monthly_sales,
+ rank() over
+ (partition by i_category, i_brand,
+ cc_name
+ order by d_year, d_moy) rn
+ from plato.item, plato.catalog_sales, plato.date_dim, plato.call_center
+ where cs_item_sk = i_item_sk and
+ cs_sold_date_sk = d_date_sk and
+ cc_call_center_sk= cs_call_center_sk and
+ (
+ d_year = 2000 or
+ ( d_year = 2000-1 and d_moy =12) or
+ ( d_year = 2000+1 and d_moy =1)
+ )
+ group by i_category, i_brand,
+ cc_name , d_year, d_moy),
+ v2 as(
+ select v1.cc_name
+ ,v1.d_year, v1.d_moy
+ ,v1.avg_monthly_sales
+ ,v1.sum_sales, v1_lag.sum_sales psum, v1_lead.sum_sales nsum
+ from v1, v1 v1_lag, v1 v1_lead
+ where v1.i_category = v1_lag.i_category and
+ v1.i_category = v1_lead.i_category and
+ v1.i_brand = v1_lag.i_brand and
+ v1.i_brand = v1_lead.i_brand and
+ v1. cc_name = v1_lag. cc_name and
+ v1. cc_name = v1_lead. cc_name and
+ v1.rn = v1_lag.rn + 1 and
+ v1.rn = v1_lead.rn - 1)
+ select *
+ from v2
+ where d_year = 2000 and
+ avg_monthly_sales > 0::numeric and
+ case when avg_monthly_sales > 0::numeric then abs(sum_sales - avg_monthly_sales) / avg_monthly_sales else null::numeric end > 0.1::numeric
+ order by sum_sales - avg_monthly_sales, nsum
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query57.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q58.sql b/yt/yql/tests/sql/suites/pg-tpcds/q58.sql
new file mode 100644
index 0000000000..5dd8e6aa22
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q58.sql
@@ -0,0 +1,68 @@
+--!syntax_pg
+--TPC-DS Q58
+
+-- start query 1 in stream 0 using template ../query_templates/query58.tpl
+with ss_items as
+ (select i_item_id item_id
+ ,sum(ss_ext_sales_price) ss_item_rev
+ from plato.store_sales
+ ,plato.item
+ ,plato.date_dim
+ where ss_item_sk = i_item_sk
+ and d_date in (select d_date
+ from plato.date_dim
+ where d_week_seq = (select d_week_seq
+ from plato.date_dim
+ where d_date = '1998-02-19'::date))
+ and ss_sold_date_sk = d_date_sk
+ group by i_item_id),
+ cs_items as
+ (select i_item_id item_id
+ ,sum(cs_ext_sales_price) cs_item_rev
+ from plato.catalog_sales
+ ,plato.item
+ ,plato.date_dim
+ where cs_item_sk = i_item_sk
+ and d_date in (select d_date
+ from plato.date_dim
+ where d_week_seq = (select d_week_seq
+ from plato.date_dim
+ where d_date = '1998-02-19'::date))
+ and cs_sold_date_sk = d_date_sk
+ group by i_item_id),
+ ws_items as
+ (select i_item_id item_id
+ ,sum(ws_ext_sales_price) ws_item_rev
+ from plato.web_sales
+ ,plato.item
+ ,plato.date_dim
+ where ws_item_sk = i_item_sk
+ and d_date in (select d_date
+ from plato.date_dim
+ where d_week_seq =(select d_week_seq
+ from plato.date_dim
+ where d_date = '1998-02-19'::date))
+ and ws_sold_date_sk = d_date_sk
+ group by i_item_id)
+ select ss_items.item_id
+ ,ss_item_rev
+ ,ss_item_rev/((ss_item_rev+cs_item_rev+ws_item_rev)/3::numeric) * 100::numeric ss_dev
+ ,cs_item_rev
+ ,cs_item_rev/((ss_item_rev+cs_item_rev+ws_item_rev)/3::numeric) * 100::numeric cs_dev
+ ,ws_item_rev
+ ,ws_item_rev/((ss_item_rev+cs_item_rev+ws_item_rev)/3::numeric) * 100::numeric ws_dev
+ ,(ss_item_rev+cs_item_rev+ws_item_rev)/3::numeric average
+ from ss_items,cs_items,ws_items
+ where ss_items.item_id=cs_items.item_id
+ and ss_items.item_id=ws_items.item_id
+ and ss_item_rev between 0.9::numeric * cs_item_rev and 1.1::numeric * cs_item_rev
+ and ss_item_rev between 0.9::numeric * ws_item_rev and 1.1::numeric * ws_item_rev
+ and cs_item_rev between 0.9::numeric * ss_item_rev and 1.1::numeric * ss_item_rev
+ and cs_item_rev between 0.9::numeric * ws_item_rev and 1.1::numeric * ws_item_rev
+ and ws_item_rev between 0.9::numeric * ss_item_rev and 1.1::numeric * ss_item_rev
+ and ws_item_rev between 0.9::numeric * cs_item_rev and 1.1::numeric * cs_item_rev
+ order by item_id
+ ,ss_item_rev
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query58.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q59.sql b/yt/yql/tests/sql/suites/pg-tpcds/q59.sql
new file mode 100644
index 0000000000..7d16a9aec8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q59.sql
@@ -0,0 +1,47 @@
+--!syntax_pg
+--TPC-DS Q59
+
+-- start query 1 in stream 0 using template ../query_templates/query59.tpl
+with wss as
+ (select d_week_seq,
+ ss_store_sk,
+ sum(case when (d_day_name='Sunday') then ss_sales_price else null::numeric end) sun_sales,
+ sum(case when (d_day_name='Monday') then ss_sales_price else null::numeric end) mon_sales,
+ sum(case when (d_day_name='Tuesday') then ss_sales_price else null::numeric end) tue_sales,
+ sum(case when (d_day_name='Wednesday') then ss_sales_price else null::numeric end) wed_sales,
+ sum(case when (d_day_name='Thursday') then ss_sales_price else null::numeric end) thu_sales,
+ sum(case when (d_day_name='Friday') then ss_sales_price else null::numeric end) fri_sales,
+ sum(case when (d_day_name='Saturday') then ss_sales_price else null::numeric end) sat_sales
+ from plato.store_sales,plato.date_dim
+ where d_date_sk = ss_sold_date_sk
+ group by d_week_seq,ss_store_sk
+ )
+ select s_store_name1,s_store_id1,d_week_seq1
+ ,sun_sales1/sun_sales2,mon_sales1/mon_sales2
+ ,tue_sales1/tue_sales2,wed_sales1/wed_sales2,thu_sales1/thu_sales2
+ ,fri_sales1/fri_sales2,sat_sales1/sat_sales2
+ from
+ (select s_store_name s_store_name1,wss.d_week_seq d_week_seq1
+ ,s_store_id s_store_id1,sun_sales sun_sales1
+ ,mon_sales mon_sales1,tue_sales tue_sales1
+ ,wed_sales wed_sales1,thu_sales thu_sales1
+ ,fri_sales fri_sales1,sat_sales sat_sales1
+ from wss,plato.store,plato.date_dim d
+ where d.d_week_seq = wss.d_week_seq and
+ ss_store_sk = s_store_sk and
+ d_month_seq between 1185 and 1185 + 11) y,
+ (select s_store_name s_store_name2,wss.d_week_seq d_week_seq2
+ ,s_store_id s_store_id2,sun_sales sun_sales2
+ ,mon_sales mon_sales2,tue_sales tue_sales2
+ ,wed_sales wed_sales2,thu_sales thu_sales2
+ ,fri_sales fri_sales2,sat_sales sat_sales2
+ from wss,plato.store,plato.date_dim d
+ where d.d_week_seq = wss.d_week_seq and
+ ss_store_sk = s_store_sk and
+ d_month_seq between 1185+ 12 and 1185 + 23) x
+ where s_store_id1=s_store_id2
+ and d_week_seq1=d_week_seq2-52
+ order by s_store_name1,s_store_id1,d_week_seq1
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query59.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q60.sql b/yt/yql/tests/sql/suites/pg-tpcds/q60.sql
new file mode 100644
index 0000000000..e8913a839c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q60.sql
@@ -0,0 +1,81 @@
+--!syntax_pg
+--TPC-DS Q60
+
+-- start query 1 in stream 0 using template ../query_templates/query60.tpl
+with ss as (
+ select
+ i_item_id,sum(ss_ext_sales_price) total_sales
+ from
+ plato.store_sales,
+ plato.date_dim,
+ plato.customer_address,
+ plato.item
+ where
+ i_item_id in (select
+ i_item_id
+from
+ plato.item
+where i_category in ('Children'))
+ and ss_item_sk = i_item_sk
+ and ss_sold_date_sk = d_date_sk
+ and d_year = 1999
+ and d_moy = 9
+ and ss_addr_sk = ca_address_sk
+ and ca_gmt_offset = -6::numeric
+ group by i_item_id),
+ cs as (
+ select
+ i_item_id,sum(cs_ext_sales_price) total_sales
+ from
+ plato.catalog_sales,
+ plato.date_dim,
+ plato.customer_address,
+ plato.item
+ where
+ i_item_id in (select
+ i_item_id
+from
+ plato.item
+where i_category in ('Children'))
+ and cs_item_sk = i_item_sk
+ and cs_sold_date_sk = d_date_sk
+ and d_year = 1999
+ and d_moy = 9
+ and cs_bill_addr_sk = ca_address_sk
+ and ca_gmt_offset = -6::numeric
+ group by i_item_id),
+ ws as (
+ select
+ i_item_id,sum(ws_ext_sales_price) total_sales
+ from
+ plato.web_sales,
+ plato.date_dim,
+ plato.customer_address,
+ plato.item
+ where
+ i_item_id in (select
+ i_item_id
+from
+ plato.item
+where i_category in ('Children'))
+ and ws_item_sk = i_item_sk
+ and ws_sold_date_sk = d_date_sk
+ and d_year = 1999
+ and d_moy = 9
+ and ws_bill_addr_sk = ca_address_sk
+ and ca_gmt_offset = -6::numeric
+ group by i_item_id)
+ select
+ i_item_id
+,sum(total_sales) total_sales
+ from (select * from ss
+ union all
+ select * from cs
+ union all
+ select * from ws) tmp1
+ group by i_item_id
+ order by i_item_id
+ ,total_sales
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query60.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q61.sql b/yt/yql/tests/sql/suites/pg-tpcds/q61.sql
new file mode 100644
index 0000000000..0862c0747e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q61.sql
@@ -0,0 +1,47 @@
+--!syntax_pg
+--TPC-DS Q61
+
+-- start query 1 in stream 0 using template ../query_templates/query61.tpl
+select promotions,total,cast(promotions as decimal(15,4))/cast(total as decimal(15,4))*100::numeric
+from
+ (select sum(ss_ext_sales_price) promotions
+ from plato.store_sales
+ ,plato.store
+ ,plato.promotion
+ ,plato.date_dim
+ ,plato.customer
+ ,plato.customer_address
+ ,plato.item
+ where ss_sold_date_sk = d_date_sk
+ and ss_store_sk = s_store_sk
+ and ss_promo_sk = p_promo_sk
+ and ss_customer_sk= c_customer_sk
+ and ca_address_sk = c_current_addr_sk
+ and ss_item_sk = i_item_sk
+ and ca_gmt_offset = -7::numeric
+ and i_category = 'Books'
+ and (p_channel_dmail = 'Y' or p_channel_email = 'Y' or p_channel_tv = 'Y')
+ and s_gmt_offset = -7::numeric
+ and d_year = 1999
+ and d_moy = 11) promotional_sales,
+ (select sum(ss_ext_sales_price) total
+ from plato.store_sales
+ ,plato.store
+ ,plato.date_dim
+ ,plato.customer
+ ,plato.customer_address
+ ,plato.item
+ where ss_sold_date_sk = d_date_sk
+ and ss_store_sk = s_store_sk
+ and ss_customer_sk= c_customer_sk
+ and ca_address_sk = c_current_addr_sk
+ and ss_item_sk = i_item_sk
+ and ca_gmt_offset = -7::numeric
+ and i_category = 'Books'
+ and s_gmt_offset = -7::numeric
+ and d_year = 1999
+ and d_moy = 11) all_sales
+order by promotions, total
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query61.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q62.sql b/yt/yql/tests/sql/suites/pg-tpcds/q62.sql
new file mode 100644
index 0000000000..c65b503787
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q62.sql
@@ -0,0 +1,38 @@
+--!syntax_pg
+--TPC-DS Q62
+
+-- start query 1 in stream 0 using template ../query_templates/query62.tpl
+select
+ substr(w_warehouse_name,1,20)
+ ,sm_type
+ ,web_name
+ ,sum(case when (ws_ship_date_sk - ws_sold_date_sk <= 30 ) then 1 else 0 end) as "30 days"
+ ,sum(case when (ws_ship_date_sk - ws_sold_date_sk > 30) and
+ (ws_ship_date_sk - ws_sold_date_sk <= 60) then 1 else 0 end ) as "31-60 days"
+ ,sum(case when (ws_ship_date_sk - ws_sold_date_sk > 60) and
+ (ws_ship_date_sk - ws_sold_date_sk <= 90) then 1 else 0 end) as "61-90 days"
+ ,sum(case when (ws_ship_date_sk - ws_sold_date_sk > 90) and
+ (ws_ship_date_sk - ws_sold_date_sk <= 120) then 1 else 0 end) as "91-120 days"
+ ,sum(case when (ws_ship_date_sk - ws_sold_date_sk > 120) then 1 else 0 end) as ">120 days"
+from
+ plato.web_sales
+ ,plato.warehouse
+ ,plato.ship_mode
+ ,plato.web_site
+ ,plato.date_dim
+where
+ d_month_seq between 1212 and 1212 + 11
+and ws_ship_date_sk = d_date_sk
+and ws_warehouse_sk = w_warehouse_sk
+and ws_ship_mode_sk = sm_ship_mode_sk
+and ws_web_site_sk = web_site_sk
+group by
+ substr(w_warehouse_name,1,20)
+ ,sm_type
+ ,web_name
+order by substr(w_warehouse_name,1,20)
+ ,sm_type
+ ,web_name
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query62.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q63.sql b/yt/yql/tests/sql/suites/pg-tpcds/q63.sql
new file mode 100644
index 0000000000..87064c5b8a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q63.sql
@@ -0,0 +1,32 @@
+--!syntax_pg
+--TPC-DS Q63
+
+-- start query 1 in stream 0 using template ../query_templates/query63.tpl
+select *
+from (select i_manager_id
+ ,sum(ss_sales_price) sum_sales
+ ,avg(sum(ss_sales_price)) over (partition by i_manager_id) avg_monthly_sales
+ from plato.item
+ ,plato.store_sales
+ ,plato.date_dim
+ ,plato.store
+ where ss_item_sk = i_item_sk
+ and ss_sold_date_sk = d_date_sk
+ and ss_store_sk = s_store_sk
+ and d_month_seq in (1212,1212+1,1212+2,1212+3,1212+4,1212+5,1212+6,1212+7,1212+8,1212+9,1212+10,1212+11)
+ and (( i_category in ('Books','Children','Electronics')
+ and i_class in ('personal','portable','reference','self-help')
+ and i_brand in ('scholaramalgamalg #14','scholaramalgamalg #7',
+ 'exportiunivamalg #9','scholaramalgamalg #9'))
+ or( i_category in ('Women','Music','Men')
+ and i_class in ('accessories','classical','fragrances','pants')
+ and i_brand in ('amalgimporto #1','edu packscholar #1','exportiimporto #1',
+ 'importoamalg #1')))
+group by i_manager_id, d_moy) tmp1
+where case when avg_monthly_sales > 0::numeric then abs (sum_sales - avg_monthly_sales) / avg_monthly_sales else null::numeric end > 0.1::numeric
+order by i_manager_id
+ ,avg_monthly_sales
+ ,sum_sales
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query63.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q64.sql b/yt/yql/tests/sql/suites/pg-tpcds/q64.sql
new file mode 100644
index 0000000000..57884978ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q64.sql
@@ -0,0 +1,124 @@
+--!syntax_pg
+--TPC-DS Q64
+
+-- start query 1 in stream 0 using template ../query_templates/query64.tpl
+with cs_ui as
+ (select cs_item_sk
+ ,sum(cs_ext_list_price) as sale,sum(cr_refunded_cash+cr_reversed_charge+cr_store_credit) as refund
+ from plato.catalog_sales
+ ,plato.catalog_returns
+ where cs_item_sk = cr_item_sk
+ and cs_order_number = cr_order_number
+ group by cs_item_sk
+ having sum(cs_ext_list_price)>2::numeric*sum(cr_refunded_cash+cr_reversed_charge+cr_store_credit)),
+cross_sales as
+ (select i_product_name product_name
+ ,i_item_sk item_sk
+ ,s_store_name store_name
+ ,s_zip store_zip
+ ,ad1.ca_street_number b_street_number
+ ,ad1.ca_street_name b_street_name
+ ,ad1.ca_city b_city
+ ,ad1.ca_zip b_zip
+ ,ad2.ca_street_number c_street_number
+ ,ad2.ca_street_name c_street_name
+ ,ad2.ca_city c_city
+ ,ad2.ca_zip c_zip
+ ,d1.d_year as syear
+ ,d2.d_year as fsyear
+ ,d3.d_year s2year
+ ,count(*) cnt
+ ,sum(ss_wholesale_cost) s1
+ ,sum(ss_list_price) s2
+ ,sum(ss_coupon_amt) s3
+ FROM plato.store_sales
+ ,plato.store_returns
+ ,cs_ui
+ ,plato.date_dim d1
+ ,plato.date_dim d2
+ ,plato.date_dim d3
+ ,plato.store
+ ,plato.customer
+ ,plato.customer_demographics cd1
+ ,plato.customer_demographics cd2
+ ,plato.promotion
+ ,plato.household_demographics hd1
+ ,plato.household_demographics hd2
+ ,plato.customer_address ad1
+ ,plato.customer_address ad2
+ ,plato.income_band ib1
+ ,plato.income_band ib2
+ ,plato.item
+ WHERE ss_store_sk = s_store_sk AND
+ ss_sold_date_sk = d1.d_date_sk AND
+ ss_customer_sk = c_customer_sk AND
+ ss_cdemo_sk= cd1.cd_demo_sk AND
+ ss_hdemo_sk = hd1.hd_demo_sk AND
+ ss_addr_sk = ad1.ca_address_sk and
+ ss_item_sk = i_item_sk and
+ ss_item_sk = sr_item_sk and
+ ss_ticket_number = sr_ticket_number and
+ ss_item_sk = cs_ui.cs_item_sk and
+ c_current_cdemo_sk = cd2.cd_demo_sk AND
+ c_current_hdemo_sk = hd2.hd_demo_sk AND
+ c_current_addr_sk = ad2.ca_address_sk and
+ c_first_sales_date_sk = d2.d_date_sk and
+ c_first_shipto_date_sk = d3.d_date_sk and
+ ss_promo_sk = p_promo_sk and
+ hd1.hd_income_band_sk = ib1.ib_income_band_sk and
+ hd2.hd_income_band_sk = ib2.ib_income_band_sk and
+ cd1.cd_marital_status <> cd2.cd_marital_status and
+ i_color in ('maroon','burnished','dim','steel','navajo','chocolate') and
+ i_current_price between 35::numeric and (35 + 10)::numeric and
+ i_current_price between (35 + 1)::numeric and (35 + 15)::numeric
+group by i_product_name
+ ,i_item_sk
+ ,s_store_name
+ ,s_zip
+ ,ad1.ca_street_number
+ ,ad1.ca_street_name
+ ,ad1.ca_city
+ ,ad1.ca_zip
+ ,ad2.ca_street_number
+ ,ad2.ca_street_name
+ ,ad2.ca_city
+ ,ad2.ca_zip
+ ,d1.d_year
+ ,d2.d_year
+ ,d3.d_year
+)
+select cs1.product_name
+ ,cs1.store_name
+ ,cs1.store_zip
+ ,cs1.b_street_number
+ ,cs1.b_street_name
+ ,cs1.b_city
+ ,cs1.b_zip
+ ,cs1.c_street_number
+ ,cs1.c_street_name
+ ,cs1.c_city
+ ,cs1.c_zip
+ ,cs1.syear as cs1_syear
+ ,cs1.cnt as cs1_cnt
+ ,cs1.s1 as s11
+ ,cs1.s2 as s21
+ ,cs1.s3 as s31
+ ,cs2.s1 as s12
+ ,cs2.s2 as s22
+ ,cs2.s3 as s32
+ ,cs2.syear as cs2_syear
+ ,cs2.cnt as cs2_cnt
+from cross_sales cs1,cross_sales cs2
+where cs1.item_sk=cs2.item_sk and
+ cs1.syear = 2000 and
+ cs2.syear = 2000 + 1 and
+ cs2.cnt <= cs1.cnt and
+ cs1.store_name = cs2.store_name and
+ cs1.store_zip = cs2.store_zip
+order by cs1.product_name
+ ,cs1.store_name
+ ,cs2_cnt
+ ,cs1.s1
+ ,cs2.s1;
+
+-- end query 1 in stream 0 using template ../query_templates/query64.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q65.sql b/yt/yql/tests/sql/suites/pg-tpcds/q65.sql
new file mode 100644
index 0000000000..87d4e776af
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q65.sql
@@ -0,0 +1,32 @@
+--!syntax_pg
+--TPC-DS Q65
+
+-- start query 1 in stream 0 using template ../query_templates/query65.tpl
+select
+ s_store_name,
+ i_item_desc,
+ sc.revenue,
+ i_current_price,
+ i_wholesale_cost,
+ i_brand
+ from plato.store, plato.item,
+ (select ss_store_sk, avg(revenue) as ave
+ from
+ (select ss_store_sk, ss_item_sk,
+ sum(ss_sales_price) as revenue
+ from plato.store_sales, plato.date_dim
+ where ss_sold_date_sk = d_date_sk and d_month_seq between 1212 and 1212+11
+ group by ss_store_sk, ss_item_sk) sa
+ group by ss_store_sk) sb,
+ (select ss_store_sk, ss_item_sk, sum(ss_sales_price) as revenue
+ from plato.store_sales, plato.date_dim
+ where ss_sold_date_sk = d_date_sk and d_month_seq between 1212 and 1212+11
+ group by ss_store_sk, ss_item_sk) sc
+ where sb.ss_store_sk = sc.ss_store_sk and
+ sc.revenue <= 0.1::numeric * sb.ave and
+ s_store_sk = sc.ss_store_sk and
+ i_item_sk = sc.ss_item_sk
+ order by s_store_name, i_item_desc
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query65.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q66.sql b/yt/yql/tests/sql/suites/pg-tpcds/q66.sql
new file mode 100644
index 0000000000..2e6a5eabad
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q66.sql
@@ -0,0 +1,223 @@
+--!syntax_pg
+--TPC-DS Q66
+
+-- start query 1 in stream 0 using template ../query_templates/query66.tpl
+select
+ w_warehouse_name
+ ,w_warehouse_sq_ft
+ ,w_city
+ ,w_county
+ ,w_state
+ ,w_country
+ ,ship_carriers
+ ,year
+ ,sum(jan_sales) as jan_sales
+ ,sum(feb_sales) as feb_sales
+ ,sum(mar_sales) as mar_sales
+ ,sum(apr_sales) as apr_sales
+ ,sum(may_sales) as may_sales
+ ,sum(jun_sales) as jun_sales
+ ,sum(jul_sales) as jul_sales
+ ,sum(aug_sales) as aug_sales
+ ,sum(sep_sales) as sep_sales
+ ,sum(oct_sales) as oct_sales
+ ,sum(nov_sales) as nov_sales
+ ,sum(dec_sales) as dec_sales
+ ,sum(jan_sales/w_warehouse_sq_ft::numeric) as jan_sales_per_sq_foot
+ ,sum(feb_sales/w_warehouse_sq_ft::numeric) as feb_sales_per_sq_foot
+ ,sum(mar_sales/w_warehouse_sq_ft::numeric) as mar_sales_per_sq_foot
+ ,sum(apr_sales/w_warehouse_sq_ft::numeric) as apr_sales_per_sq_foot
+ ,sum(may_sales/w_warehouse_sq_ft::numeric) as may_sales_per_sq_foot
+ ,sum(jun_sales/w_warehouse_sq_ft::numeric) as jun_sales_per_sq_foot
+ ,sum(jul_sales/w_warehouse_sq_ft::numeric) as jul_sales_per_sq_foot
+ ,sum(aug_sales/w_warehouse_sq_ft::numeric) as aug_sales_per_sq_foot
+ ,sum(sep_sales/w_warehouse_sq_ft::numeric) as sep_sales_per_sq_foot
+ ,sum(oct_sales/w_warehouse_sq_ft::numeric) as oct_sales_per_sq_foot
+ ,sum(nov_sales/w_warehouse_sq_ft::numeric) as nov_sales_per_sq_foot
+ ,sum(dec_sales/w_warehouse_sq_ft::numeric) as dec_sales_per_sq_foot
+ ,sum(jan_net) as jan_net
+ ,sum(feb_net) as feb_net
+ ,sum(mar_net) as mar_net
+ ,sum(apr_net) as apr_net
+ ,sum(may_net) as may_net
+ ,sum(jun_net) as jun_net
+ ,sum(jul_net) as jul_net
+ ,sum(aug_net) as aug_net
+ ,sum(sep_net) as sep_net
+ ,sum(oct_net) as oct_net
+ ,sum(nov_net) as nov_net
+ ,sum(dec_net) as dec_net
+ from (
+ select
+ w_warehouse_name
+ ,w_warehouse_sq_ft
+ ,w_city
+ ,w_county
+ ,w_state
+ ,w_country
+ ,'DIAMOND' || ',' || 'AIRBORNE' as ship_carriers
+ ,d_year as year
+ ,sum(case when d_moy = 1
+ then ws_sales_price* ws_quantity::numeric else 0::numeric end) as jan_sales
+ ,sum(case when d_moy = 2
+ then ws_sales_price* ws_quantity::numeric else 0::numeric end) as feb_sales
+ ,sum(case when d_moy = 3
+ then ws_sales_price* ws_quantity::numeric else 0::numeric end) as mar_sales
+ ,sum(case when d_moy = 4
+ then ws_sales_price* ws_quantity::numeric else 0::numeric end) as apr_sales
+ ,sum(case when d_moy = 5
+ then ws_sales_price* ws_quantity::numeric else 0::numeric end) as may_sales
+ ,sum(case when d_moy = 6
+ then ws_sales_price* ws_quantity::numeric else 0::numeric end) as jun_sales
+ ,sum(case when d_moy = 7
+ then ws_sales_price* ws_quantity::numeric else 0::numeric end) as jul_sales
+ ,sum(case when d_moy = 8
+ then ws_sales_price* ws_quantity::numeric else 0::numeric end) as aug_sales
+ ,sum(case when d_moy = 9
+ then ws_sales_price* ws_quantity::numeric else 0::numeric end) as sep_sales
+ ,sum(case when d_moy = 10
+ then ws_sales_price* ws_quantity::numeric else 0::numeric end) as oct_sales
+ ,sum(case when d_moy = 11
+ then ws_sales_price* ws_quantity::numeric else 0::numeric end) as nov_sales
+ ,sum(case when d_moy = 12
+ then ws_sales_price* ws_quantity::numeric else 0::numeric end) as dec_sales
+ ,sum(case when d_moy = 1
+ then ws_net_paid_inc_tax * ws_quantity::numeric else 0::numeric end) as jan_net
+ ,sum(case when d_moy = 2
+ then ws_net_paid_inc_tax * ws_quantity::numeric else 0::numeric end) as feb_net
+ ,sum(case when d_moy = 3
+ then ws_net_paid_inc_tax * ws_quantity::numeric else 0::numeric end) as mar_net
+ ,sum(case when d_moy = 4
+ then ws_net_paid_inc_tax * ws_quantity::numeric else 0::numeric end) as apr_net
+ ,sum(case when d_moy = 5
+ then ws_net_paid_inc_tax * ws_quantity::numeric else 0::numeric end) as may_net
+ ,sum(case when d_moy = 6
+ then ws_net_paid_inc_tax * ws_quantity::numeric else 0::numeric end) as jun_net
+ ,sum(case when d_moy = 7
+ then ws_net_paid_inc_tax * ws_quantity::numeric else 0::numeric end) as jul_net
+ ,sum(case when d_moy = 8
+ then ws_net_paid_inc_tax * ws_quantity::numeric else 0::numeric end) as aug_net
+ ,sum(case when d_moy = 9
+ then ws_net_paid_inc_tax * ws_quantity::numeric else 0::numeric end) as sep_net
+ ,sum(case when d_moy = 10
+ then ws_net_paid_inc_tax * ws_quantity::numeric else 0::numeric end) as oct_net
+ ,sum(case when d_moy = 11
+ then ws_net_paid_inc_tax * ws_quantity::numeric else 0::numeric end) as nov_net
+ ,sum(case when d_moy = 12
+ then ws_net_paid_inc_tax * ws_quantity::numeric else 0::numeric end) as dec_net
+ from
+ plato.web_sales
+ ,plato.warehouse
+ ,plato.date_dim
+ ,plato.time_dim
+ ,plato.ship_mode
+ where
+ ws_warehouse_sk = w_warehouse_sk
+ and ws_sold_date_sk = d_date_sk
+ and ws_sold_time_sk = t_time_sk
+ and ws_ship_mode_sk = sm_ship_mode_sk
+ and d_year = 2002
+ and t_time between 49530 and 49530+28800
+ and sm_carrier in ('DIAMOND','AIRBORNE')
+ group by
+ w_warehouse_name
+ ,w_warehouse_sq_ft
+ ,w_city
+ ,w_county
+ ,w_state
+ ,w_country
+ ,d_year
+ union all
+ select
+ w_warehouse_name
+ ,w_warehouse_sq_ft
+ ,w_city
+ ,w_county
+ ,w_state
+ ,w_country
+ ,'DIAMOND' || ',' || 'AIRBORNE' as ship_carriers
+ ,d_year as year
+ ,sum(case when d_moy = 1
+ then cs_ext_sales_price* cs_quantity::numeric else 0::numeric end) as jan_sales
+ ,sum(case when d_moy = 2
+ then cs_ext_sales_price* cs_quantity::numeric else 0::numeric end) as feb_sales
+ ,sum(case when d_moy = 3
+ then cs_ext_sales_price* cs_quantity::numeric else 0::numeric end) as mar_sales
+ ,sum(case when d_moy = 4
+ then cs_ext_sales_price* cs_quantity::numeric else 0::numeric end) as apr_sales
+ ,sum(case when d_moy = 5
+ then cs_ext_sales_price* cs_quantity::numeric else 0::numeric end) as may_sales
+ ,sum(case when d_moy = 6
+ then cs_ext_sales_price* cs_quantity::numeric else 0::numeric end) as jun_sales
+ ,sum(case when d_moy = 7
+ then cs_ext_sales_price* cs_quantity::numeric else 0::numeric end) as jul_sales
+ ,sum(case when d_moy = 8
+ then cs_ext_sales_price* cs_quantity::numeric else 0::numeric end) as aug_sales
+ ,sum(case when d_moy = 9
+ then cs_ext_sales_price* cs_quantity::numeric else 0::numeric end) as sep_sales
+ ,sum(case when d_moy = 10
+ then cs_ext_sales_price* cs_quantity::numeric else 0::numeric end) as oct_sales
+ ,sum(case when d_moy = 11
+ then cs_ext_sales_price* cs_quantity::numeric else 0::numeric end) as nov_sales
+ ,sum(case when d_moy = 12
+ then cs_ext_sales_price* cs_quantity::numeric else 0::numeric end) as dec_sales
+ ,sum(case when d_moy = 1
+ then cs_net_paid_inc_ship_tax * cs_quantity::numeric else 0::numeric end) as jan_net
+ ,sum(case when d_moy = 2
+ then cs_net_paid_inc_ship_tax * cs_quantity::numeric else 0::numeric end) as feb_net
+ ,sum(case when d_moy = 3
+ then cs_net_paid_inc_ship_tax * cs_quantity::numeric else 0::numeric end) as mar_net
+ ,sum(case when d_moy = 4
+ then cs_net_paid_inc_ship_tax * cs_quantity::numeric else 0::numeric end) as apr_net
+ ,sum(case when d_moy = 5
+ then cs_net_paid_inc_ship_tax * cs_quantity::numeric else 0::numeric end) as may_net
+ ,sum(case when d_moy = 6
+ then cs_net_paid_inc_ship_tax * cs_quantity::numeric else 0::numeric end) as jun_net
+ ,sum(case when d_moy = 7
+ then cs_net_paid_inc_ship_tax * cs_quantity::numeric else 0::numeric end) as jul_net
+ ,sum(case when d_moy = 8
+ then cs_net_paid_inc_ship_tax * cs_quantity::numeric else 0::numeric end) as aug_net
+ ,sum(case when d_moy = 9
+ then cs_net_paid_inc_ship_tax * cs_quantity::numeric else 0::numeric end) as sep_net
+ ,sum(case when d_moy = 10
+ then cs_net_paid_inc_ship_tax * cs_quantity::numeric else 0::numeric end) as oct_net
+ ,sum(case when d_moy = 11
+ then cs_net_paid_inc_ship_tax * cs_quantity::numeric else 0::numeric end) as nov_net
+ ,sum(case when d_moy = 12
+ then cs_net_paid_inc_ship_tax * cs_quantity::numeric else 0::numeric end) as dec_net
+ from
+ plato.catalog_sales
+ ,plato.warehouse
+ ,plato.date_dim
+ ,plato.time_dim
+ ,plato.ship_mode
+ where
+ cs_warehouse_sk = w_warehouse_sk
+ and cs_sold_date_sk = d_date_sk
+ and cs_sold_time_sk = t_time_sk
+ and cs_ship_mode_sk = sm_ship_mode_sk
+ and d_year = 2002
+ and t_time between 49530 AND 49530+28800
+ and sm_carrier in ('DIAMOND','AIRBORNE')
+ group by
+ w_warehouse_name
+ ,w_warehouse_sq_ft
+ ,w_city
+ ,w_county
+ ,w_state
+ ,w_country
+ ,d_year
+ ) x
+ group by
+ w_warehouse_name
+ ,w_warehouse_sq_ft
+ ,w_city
+ ,w_county
+ ,w_state
+ ,w_country
+ ,ship_carriers
+ ,year
+ order by w_warehouse_name
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query66.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q67.sql b/yt/yql/tests/sql/suites/pg-tpcds/q67.sql
new file mode 100644
index 0000000000..8f3f7a868a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q67.sql
@@ -0,0 +1,47 @@
+--!syntax_pg
+--TPC-DS Q67
+
+-- start query 1 in stream 0 using template ../query_templates/query67.tpl
+select *
+from (select i_category
+ ,i_class
+ ,i_brand
+ ,i_product_name
+ ,d_year
+ ,d_qoy
+ ,d_moy
+ ,s_store_id
+ ,sumsales
+ ,rank() over (partition by i_category order by sumsales desc) rk
+ from (select i_category
+ ,i_class
+ ,i_brand
+ ,i_product_name
+ ,d_year
+ ,d_qoy
+ ,d_moy
+ ,s_store_id
+ ,sum(coalesce(ss_sales_price*ss_quantity::numeric,0::numeric)) sumsales
+ from plato.store_sales
+ ,plato.date_dim
+ ,plato.store
+ ,plato.item
+ where ss_sold_date_sk=d_date_sk
+ and ss_item_sk=i_item_sk
+ and ss_store_sk = s_store_sk
+ and d_month_seq between 1212 and 1212+11
+ group by rollup(i_category, i_class, i_brand, i_product_name, d_year, d_qoy, d_moy,s_store_id))dw1) dw2
+where rk <= 100
+order by i_category
+ ,i_class
+ ,i_brand
+ ,i_product_name
+ ,d_year
+ ,d_qoy
+ ,d_moy
+ ,s_store_id
+ ,sumsales
+ ,rk
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query67.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q68.sql b/yt/yql/tests/sql/suites/pg-tpcds/q68.sql
new file mode 100644
index 0000000000..385f421edc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q68.sql
@@ -0,0 +1,45 @@
+--!syntax_pg
+--TPC-DS Q68
+
+-- start query 1 in stream 0 using template ../query_templates/query68.tpl
+select c_last_name
+ ,c_first_name
+ ,ca_city
+ ,bought_city
+ ,ss_ticket_number
+ ,extended_price
+ ,extended_tax
+ ,list_price
+ from (select ss_ticket_number
+ ,ss_customer_sk
+ ,ca_city bought_city
+ ,sum(ss_ext_sales_price) extended_price
+ ,sum(ss_ext_list_price) list_price
+ ,sum(ss_ext_tax) extended_tax
+ from plato.store_sales
+ ,plato.date_dim
+ ,plato.store
+ ,plato.household_demographics
+ ,plato.customer_address
+ where store_sales.ss_sold_date_sk = date_dim.d_date_sk
+ and store_sales.ss_store_sk = store.s_store_sk
+ and store_sales.ss_hdemo_sk = household_demographics.hd_demo_sk
+ and store_sales.ss_addr_sk = customer_address.ca_address_sk
+ and date_dim.d_dom between 1 and 2
+ and (household_demographics.hd_dep_count = 5 or
+ household_demographics.hd_vehicle_count= 3)
+ and date_dim.d_year in (1999,1999+1,1999+2)
+ and store.s_city in ('Midway','Fairview')
+ group by ss_ticket_number
+ ,ss_customer_sk
+ ,ss_addr_sk,ca_city) dn
+ ,plato.customer
+ ,plato.customer_address current_addr
+ where ss_customer_sk = c_customer_sk
+ and customer.c_current_addr_sk = current_addr.ca_address_sk
+ and current_addr.ca_city <> bought_city
+ order by c_last_name
+ ,ss_ticket_number
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query68.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q69.sql b/yt/yql/tests/sql/suites/pg-tpcds/q69.sql
new file mode 100644
index 0000000000..7fd3ba6c71
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q69.sql
@@ -0,0 +1,50 @@
+--!syntax_pg
+--TPC-DS Q69
+
+-- start query 1 in stream 0 using template ../query_templates/query69.tpl
+select
+ cd_gender,
+ cd_marital_status,
+ cd_education_status,
+ count(*) cnt1,
+ cd_purchase_estimate,
+ count(*) cnt2,
+ cd_credit_rating,
+ count(*) cnt3
+ from
+ plato.customer c,plato.customer_address ca,plato.customer_demographics
+ where
+ c.c_current_addr_sk = ca.ca_address_sk and
+ ca_state in ('CO','IL','MN') and
+ cd_demo_sk = c.c_current_cdemo_sk and
+ exists (select *
+ from plato.store_sales,plato.date_dim
+ where c.c_customer_sk = ss_customer_sk and
+ ss_sold_date_sk = d_date_sk and
+ d_year = 1999 and
+ d_moy between 1 and 1+2) and
+ (not exists (select *
+ from plato.web_sales,plato.date_dim
+ where c.c_customer_sk = ws_bill_customer_sk and
+ ws_sold_date_sk = d_date_sk and
+ d_year = 1999 and
+ d_moy between 1 and 1+2) and
+ not exists (select *
+ from plato.catalog_sales,plato.date_dim
+ where c.c_customer_sk = cs_ship_customer_sk and
+ cs_sold_date_sk = d_date_sk and
+ d_year = 1999 and
+ d_moy between 1 and 1+2))
+ group by cd_gender,
+ cd_marital_status,
+ cd_education_status,
+ cd_purchase_estimate,
+ cd_credit_rating
+ order by cd_gender,
+ cd_marital_status,
+ cd_education_status,
+ cd_purchase_estimate,
+ cd_credit_rating
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query69.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q70.sql b/yt/yql/tests/sql/suites/pg-tpcds/q70.sql
new file mode 100644
index 0000000000..530cb0f973
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q70.sql
@@ -0,0 +1,41 @@
+--!syntax_pg
+--TPC-DS Q70
+
+-- start query 1 in stream 0 using template ../query_templates/query70.tpl
+select
+ sum(ss_net_profit) as total_sum
+ ,s_state
+ ,s_county
+ ,grouping(s_state)+grouping(s_county) as lochierarchy
+ ,rank() over (
+ partition by grouping(s_state)+grouping(s_county),
+ case when grouping(s_county) = 0 then s_state end
+ order by sum(ss_net_profit) desc) as rank_within_parent
+ from
+ plato.store_sales
+ ,plato.date_dim d1
+ ,plato.store
+ where
+ d1.d_month_seq between 1212 and 1212+11
+ and d1.d_date_sk = ss_sold_date_sk
+ and s_store_sk = ss_store_sk
+ and s_state in
+ ( select s_state
+ from (select s_state as s_state,
+ rank() over ( partition by s_state order by sum(ss_net_profit) desc) as ranking
+ from plato.store_sales, plato.store, plato.date_dim
+ where d_month_seq between 1212 and 1212+11
+ and d_date_sk = ss_sold_date_sk
+ and s_store_sk = ss_store_sk
+ group by s_state
+ ) tmp1
+ where ranking <= 5
+ )
+ group by rollup(s_state,s_county)
+ order by
+ lochierarchy desc
+ ,case when lochierarchy = 0 then s_state end
+ ,rank_within_parent
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query70.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q71.sql b/yt/yql/tests/sql/suites/pg-tpcds/q71.sql
new file mode 100644
index 0000000000..72f8f06225
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q71.sql
@@ -0,0 +1,43 @@
+--!syntax_pg
+--TPC-DS Q71
+
+-- start query 1 in stream 0 using template ../query_templates/query71.tpl
+select i_brand_id brand_id, i_brand brand,t_hour,t_minute,
+ sum(ext_price) ext_price
+ from plato.item, (select ws_ext_sales_price as ext_price,
+ ws_sold_date_sk as sold_date_sk,
+ ws_item_sk as sold_item_sk,
+ ws_sold_time_sk as time_sk
+ from plato.web_sales,plato.date_dim
+ where d_date_sk = ws_sold_date_sk
+ and d_moy=12
+ and d_year=2000
+ union all
+ select cs_ext_sales_price as ext_price,
+ cs_sold_date_sk as sold_date_sk,
+ cs_item_sk as sold_item_sk,
+ cs_sold_time_sk as time_sk
+ from plato.catalog_sales,plato.date_dim
+ where d_date_sk = cs_sold_date_sk
+ and d_moy=12
+ and d_year=2000
+ union all
+ select ss_ext_sales_price as ext_price,
+ ss_sold_date_sk as sold_date_sk,
+ ss_item_sk as sold_item_sk,
+ ss_sold_time_sk as time_sk
+ from plato.store_sales,plato.date_dim
+ where d_date_sk = ss_sold_date_sk
+ and d_moy=12
+ and d_year=2000
+ ) tmp,plato.time_dim
+ where
+ sold_item_sk = i_item_sk
+ and i_manager_id=1
+ and time_sk = t_time_sk
+ and (t_meal_time = 'breakfast' or t_meal_time = 'dinner')
+ group by i_brand, i_brand_id,t_hour,t_minute
+ order by ext_price desc, i_brand_id
+ ;
+
+-- end query 1 in stream 0 using template ../query_templates/query71.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q72.sql b/yt/yql/tests/sql/suites/pg-tpcds/q72.sql
new file mode 100644
index 0000000000..1687f6f0e5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q72.sql
@@ -0,0 +1,32 @@
+--!syntax_pg
+--TPC-DS Q72
+
+-- start query 1 in stream 0 using template ../query_templates/query72.tpl
+select i_item_desc
+ ,w_warehouse_name
+ ,d1.d_week_seq
+ ,sum(case when p_promo_sk is null then 1 else 0 end) no_promo
+ ,sum(case when p_promo_sk is not null then 1 else 0 end) promo
+ ,count(*) total_cnt
+from plato.catalog_sales
+join plato.inventory on (cs_item_sk = inv_item_sk)
+join plato.warehouse on (w_warehouse_sk=inv_warehouse_sk)
+join plato.item on (i_item_sk = cs_item_sk)
+join plato.customer_demographics on (cs_bill_cdemo_sk = cd_demo_sk)
+join plato.household_demographics on (cs_bill_hdemo_sk = hd_demo_sk)
+join plato.date_dim d1 on (cs_sold_date_sk = d1.d_date_sk)
+join plato.date_dim d2 on (inv_date_sk = d2.d_date_sk)
+join plato.date_dim d3 on (cs_ship_date_sk = d3.d_date_sk)
+left outer join plato.promotion on (cs_promo_sk=p_promo_sk)
+left outer join plato.catalog_returns on (cr_item_sk = cs_item_sk and cr_order_number = cs_order_number)
+where d1.d_week_seq = d2.d_week_seq
+ and inv_quantity_on_hand < cs_quantity
+ and d3.d_date > d1.d_date + 5
+ and hd_buy_potential = '1001-5000'
+ and d1.d_year = 2001
+ and cd_marital_status = 'M'
+group by i_item_desc,w_warehouse_name,d1.d_week_seq
+order by total_cnt desc, i_item_desc, w_warehouse_name, d_week_seq
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query72.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q73.sql b/yt/yql/tests/sql/suites/pg-tpcds/q73.sql
new file mode 100644
index 0000000000..768a01d4cf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q73.sql
@@ -0,0 +1,31 @@
+--!syntax_pg
+--TPC-DS Q73
+
+-- start query 1 in stream 0 using template ../query_templates/query73.tpl
+select c_last_name
+ ,c_first_name
+ ,c_salutation
+ ,c_preferred_cust_flag
+ ,ss_ticket_number
+ ,cnt from
+ (select ss_ticket_number
+ ,ss_customer_sk
+ ,count(*) cnt
+ from plato.store_sales,plato.date_dim,plato.store,plato.household_demographics
+ where store_sales.ss_sold_date_sk = date_dim.d_date_sk
+ and store_sales.ss_store_sk = store.s_store_sk
+ and store_sales.ss_hdemo_sk = household_demographics.hd_demo_sk
+ and date_dim.d_dom between 1 and 2
+ and (household_demographics.hd_buy_potential = '>10000' or
+ household_demographics.hd_buy_potential = 'Unknown')
+ and household_demographics.hd_vehicle_count > 0
+ and case when household_demographics.hd_vehicle_count > 0 then
+ household_demographics.hd_dep_count/ household_demographics.hd_vehicle_count else null::int4 end > 1
+ and date_dim.d_year in (1998,1998+1,1998+2)
+ and store.s_county in ('Williamson County','Williamson County','Williamson County','Williamson County')
+ group by ss_ticket_number,ss_customer_sk) dj,plato.customer
+ where ss_customer_sk = c_customer_sk
+ and cnt between 1::int8 and 5::int8
+ order by cnt desc, c_last_name asc;
+
+-- end query 1 in stream 0 using template ../query_templates/query73.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q74.sql b/yt/yql/tests/sql/suites/pg-tpcds/q74.sql
new file mode 100644
index 0000000000..86b46f1122
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q74.sql
@@ -0,0 +1,64 @@
+--!syntax_pg
+--TPC-DS Q74
+
+-- start query 1 in stream 0 using template ../query_templates/query74.tpl
+with year_total as (
+ select c_customer_id customer_id
+ ,c_first_name customer_first_name
+ ,c_last_name customer_last_name
+ ,d_year as year
+ ,max(ss_net_paid) year_total
+ ,'s' sale_type
+ from plato.customer
+ ,plato.store_sales
+ ,plato.date_dim
+ where c_customer_sk = ss_customer_sk
+ and ss_sold_date_sk = d_date_sk
+ and d_year in (2001,2001+1)
+ group by c_customer_id
+ ,c_first_name
+ ,c_last_name
+ ,d_year
+ union all
+ select c_customer_id customer_id
+ ,c_first_name customer_first_name
+ ,c_last_name customer_last_name
+ ,d_year as year
+ ,max(ws_net_paid) year_total
+ ,'w' sale_type
+ from plato.customer
+ ,plato.web_sales
+ ,plato.date_dim
+ where c_customer_sk = ws_bill_customer_sk
+ and ws_sold_date_sk = d_date_sk
+ and d_year in (2001,2001+1)
+ group by c_customer_id
+ ,c_first_name
+ ,c_last_name
+ ,d_year
+ )
+ select
+ t_s_secyear.customer_id, t_s_secyear.customer_first_name, t_s_secyear.customer_last_name
+ from year_total t_s_firstyear
+ ,year_total t_s_secyear
+ ,year_total t_w_firstyear
+ ,year_total t_w_secyear
+ where t_s_secyear.customer_id = t_s_firstyear.customer_id
+ and t_s_firstyear.customer_id = t_w_secyear.customer_id
+ and t_s_firstyear.customer_id = t_w_firstyear.customer_id
+ and t_s_firstyear.sale_type = 's'
+ and t_w_firstyear.sale_type = 'w'
+ and t_s_secyear.sale_type = 's'
+ and t_w_secyear.sale_type = 'w'
+ and t_s_firstyear.year = 2001
+ and t_s_secyear.year = 2001+1
+ and t_w_firstyear.year = 2001
+ and t_w_secyear.year = 2001+1
+ and t_s_firstyear.year_total > 0::numeric
+ and t_w_firstyear.year_total > 0::numeric
+ and case when t_w_firstyear.year_total > 0::numeric then t_w_secyear.year_total / t_w_firstyear.year_total else null::numeric end
+ > case when t_s_firstyear.year_total > 0::numeric then t_s_secyear.year_total / t_s_firstyear.year_total else null::numeric end
+ order by 2,1,3
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query74.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q75.sql b/yt/yql/tests/sql/suites/pg-tpcds/q75.sql
new file mode 100644
index 0000000000..62937cb56d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q75.sql
@@ -0,0 +1,73 @@
+--!syntax_pg
+--TPC-DS Q75
+
+-- start query 1 in stream 0 using template ../query_templates/query75.tpl
+WITH all_sales AS (
+ SELECT d_year
+ ,i_brand_id
+ ,i_class_id
+ ,i_category_id
+ ,i_manufact_id
+ ,SUM(sales_cnt) AS sales_cnt
+ ,SUM(sales_amt) AS sales_amt
+ FROM (SELECT d_year
+ ,i_brand_id
+ ,i_class_id
+ ,i_category_id
+ ,i_manufact_id
+ ,cs_quantity - COALESCE(cr_return_quantity,0) AS sales_cnt
+ ,cs_ext_sales_price - COALESCE(cr_return_amount,0.0::numeric) AS sales_amt
+ FROM plato.catalog_sales JOIN plato.item ON i_item_sk=cs_item_sk
+ JOIN plato.date_dim ON d_date_sk=cs_sold_date_sk
+ LEFT JOIN plato.catalog_returns ON (cs_order_number=cr_order_number
+ AND cs_item_sk=cr_item_sk)
+ WHERE i_category='Sports'
+ UNION
+ SELECT d_year
+ ,i_brand_id
+ ,i_class_id
+ ,i_category_id
+ ,i_manufact_id
+ ,ss_quantity - COALESCE(sr_return_quantity,0) AS sales_cnt
+ ,ss_ext_sales_price - COALESCE(sr_return_amt,0.0::numeric) AS sales_amt
+ FROM plato.store_sales JOIN plato.item ON i_item_sk=ss_item_sk
+ JOIN plato.date_dim ON d_date_sk=ss_sold_date_sk
+ LEFT JOIN plato.store_returns ON (ss_ticket_number=sr_ticket_number
+ AND ss_item_sk=sr_item_sk)
+ WHERE i_category='Sports'
+ UNION
+ SELECT d_year
+ ,i_brand_id
+ ,i_class_id
+ ,i_category_id
+ ,i_manufact_id
+ ,ws_quantity - COALESCE(wr_return_quantity,0) AS sales_cnt
+ ,ws_ext_sales_price - COALESCE(wr_return_amt,0.0::numeric) AS sales_amt
+ FROM plato.web_sales JOIN plato.item ON i_item_sk=ws_item_sk
+ JOIN plato.date_dim ON d_date_sk=ws_sold_date_sk
+ LEFT JOIN plato.web_returns ON (ws_order_number=wr_order_number
+ AND ws_item_sk=wr_item_sk)
+ WHERE i_category='Sports') sales_detail
+ GROUP BY d_year, i_brand_id, i_class_id, i_category_id, i_manufact_id)
+ SELECT prev_yr.d_year AS prev_year
+ ,curr_yr.d_year AS year
+ ,curr_yr.i_brand_id
+ ,curr_yr.i_class_id
+ ,curr_yr.i_category_id
+ ,curr_yr.i_manufact_id
+ ,prev_yr.sales_cnt AS prev_yr_cnt
+ ,curr_yr.sales_cnt AS curr_yr_cnt
+ ,curr_yr.sales_cnt-prev_yr.sales_cnt AS sales_cnt_diff
+ ,curr_yr.sales_amt-prev_yr.sales_amt AS sales_amt_diff
+ FROM all_sales curr_yr, all_sales prev_yr
+ WHERE curr_yr.i_brand_id=prev_yr.i_brand_id
+ AND curr_yr.i_class_id=prev_yr.i_class_id
+ AND curr_yr.i_category_id=prev_yr.i_category_id
+ AND curr_yr.i_manufact_id=prev_yr.i_manufact_id
+ AND curr_yr.d_year=2002
+ AND prev_yr.d_year=2002-1
+ AND CAST(curr_yr.sales_cnt AS DECIMAL(17,2))/CAST(prev_yr.sales_cnt AS DECIMAL(17,2))<0.9::numeric
+ ORDER BY sales_cnt_diff,sales_amt_diff
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query75.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q76.sql b/yt/yql/tests/sql/suites/pg-tpcds/q76.sql
new file mode 100644
index 0000000000..ce2e458ace
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q76.sql
@@ -0,0 +1,27 @@
+--!syntax_pg
+--TPC-DS Q76
+
+-- start query 1 in stream 0 using template ../query_templates/query76.tpl
+select channel, col_name, d_year, d_qoy, i_category, COUNT(*) sales_cnt, SUM(ext_sales_price) sales_amt FROM (
+ SELECT 'store' as channel, 'ss_addr_sk' col_name, d_year, d_qoy, i_category, ss_ext_sales_price ext_sales_price
+ FROM plato.store_sales, plato.item, plato.date_dim
+ WHERE ss_addr_sk IS NULL
+ AND ss_sold_date_sk=d_date_sk
+ AND ss_item_sk=i_item_sk
+ UNION ALL
+ SELECT 'web' as channel, 'ws_web_page_sk' col_name, d_year, d_qoy, i_category, ws_ext_sales_price ext_sales_price
+ FROM plato.web_sales, plato.item, plato.date_dim
+ WHERE ws_web_page_sk IS NULL
+ AND ws_sold_date_sk=d_date_sk
+ AND ws_item_sk=i_item_sk
+ UNION ALL
+ SELECT 'catalog' as channel, 'cs_warehouse_sk' col_name, d_year, d_qoy, i_category, cs_ext_sales_price ext_sales_price
+ FROM plato.catalog_sales, plato.item, plato.date_dim
+ WHERE cs_warehouse_sk IS NULL
+ AND cs_sold_date_sk=d_date_sk
+ AND cs_item_sk=i_item_sk) foo
+GROUP BY channel, col_name, d_year, d_qoy, i_category
+ORDER BY channel, col_name, d_year, d_qoy, i_category
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query76.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q77.sql b/yt/yql/tests/sql/suites/pg-tpcds/q77.sql
new file mode 100644
index 0000000000..fbef66a1e2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q77.sql
@@ -0,0 +1,111 @@
+--!syntax_pg
+--TPC-DS Q77
+
+-- start query 1 in stream 0 using template ../query_templates/query77.tpl
+with ss as
+ (select s_store_sk,
+ sum(ss_ext_sales_price) as sales,
+ sum(ss_net_profit) as profit
+ from plato.store_sales,
+ plato.date_dim,
+ plato.store
+ where ss_sold_date_sk = d_date_sk
+ and d_date between cast('1998-08-04' as date)
+ and (cast('1998-08-04' as date) + interval '30' day)::date
+ and ss_store_sk = s_store_sk
+ group by s_store_sk)
+ ,
+ sr as
+ (select s_store_sk,
+ sum(sr_return_amt) as returns,
+ sum(sr_net_loss) as profit_loss
+ from plato.store_returns,
+ plato.date_dim,
+ plato.store
+ where sr_returned_date_sk = d_date_sk
+ and d_date between cast('1998-08-04' as date)
+ and (cast('1998-08-04' as date) + interval '30' day)::date
+ and sr_store_sk = s_store_sk
+ group by s_store_sk),
+ cs as
+ (select cs_call_center_sk,
+ sum(cs_ext_sales_price) as sales,
+ sum(cs_net_profit) as profit
+ from plato.catalog_sales,
+ plato.date_dim
+ where cs_sold_date_sk = d_date_sk
+ and d_date between cast('1998-08-04' as date)
+ and (cast('1998-08-04' as date) + interval '30' day)::date
+ group by cs_call_center_sk
+ ),
+ cr as
+ (select cr_call_center_sk,
+ sum(cr_return_amount) as returns,
+ sum(cr_net_loss) as profit_loss
+ from plato.catalog_returns,
+ plato.date_dim
+ where cr_returned_date_sk = d_date_sk
+ and d_date between cast('1998-08-04' as date)
+ and (cast('1998-08-04' as date) + interval '30' day)::date
+ group by cr_call_center_sk
+ ),
+ ws as
+ ( select wp_web_page_sk,
+ sum(ws_ext_sales_price) as sales,
+ sum(ws_net_profit) as profit
+ from plato.web_sales,
+ plato.date_dim,
+ plato.web_page
+ where ws_sold_date_sk = d_date_sk
+ and d_date between cast('1998-08-04' as date)
+ and (cast('1998-08-04' as date) + interval '30' day)::date
+ and ws_web_page_sk = wp_web_page_sk
+ group by wp_web_page_sk),
+ wr as
+ (select wp_web_page_sk,
+ sum(wr_return_amt) as returns,
+ sum(wr_net_loss) as profit_loss
+ from plato.web_returns,
+ plato.date_dim,
+ plato.web_page
+ where wr_returned_date_sk = d_date_sk
+ and d_date between cast('1998-08-04' as date)
+ and (cast('1998-08-04' as date) + interval '30' day)::date
+ and wr_web_page_sk = wp_web_page_sk
+ group by wp_web_page_sk)
+ select channel
+ , id
+ , sum(sales) as sales
+ , sum(returns) as returns
+ , sum(profit) as profit
+ from
+ (select 'store channel' as channel
+ , ss.s_store_sk as id
+ , sales
+ , coalesce(returns, 0::numeric) as returns
+ , (profit - coalesce(profit_loss,0::numeric)) as profit
+ from ss left join sr
+ on ss.s_store_sk = sr.s_store_sk
+ union all
+ select 'catalog channel' as channel
+ , cs_call_center_sk as id
+ , sales
+ , returns
+ , (profit - profit_loss) as profit
+ from cs
+ , cr
+ union all
+ select 'web channel' as channel
+ , ws.wp_web_page_sk as id
+ , sales
+ , coalesce(returns, 0::numeric) returns
+ , (profit - coalesce(profit_loss,0::numeric)) as profit
+ from ws left join wr
+ on ws.wp_web_page_sk = wr.wp_web_page_sk
+ ) x
+ group by rollup (channel, id)
+ order by channel
+ ,id
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query77.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q78.sql b/yt/yql/tests/sql/suites/pg-tpcds/q78.sql
new file mode 100644
index 0000000000..e9d81de782
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q78.sql
@@ -0,0 +1,61 @@
+--!syntax_pg
+--TPC-DS Q78
+
+-- start query 1 in stream 0 using template ../query_templates/query78.tpl
+with ws as
+ (select d_year AS ws_sold_year, ws_item_sk,
+ ws_bill_customer_sk ws_customer_sk,
+ sum(ws_quantity) ws_qty,
+ sum(ws_wholesale_cost) ws_wc,
+ sum(ws_sales_price) ws_sp
+ from plato.web_sales
+ left join plato.web_returns on wr_order_number=ws_order_number and ws_item_sk=wr_item_sk
+ join plato.date_dim on ws_sold_date_sk = d_date_sk
+ where wr_order_number is null
+ group by d_year, ws_item_sk, ws_bill_customer_sk
+ ),
+cs as
+ (select d_year AS cs_sold_year, cs_item_sk,
+ cs_bill_customer_sk cs_customer_sk,
+ sum(cs_quantity) cs_qty,
+ sum(cs_wholesale_cost) cs_wc,
+ sum(cs_sales_price) cs_sp
+ from plato.catalog_sales
+ left join plato.catalog_returns on cr_order_number=cs_order_number and cs_item_sk=cr_item_sk
+ join plato.date_dim on cs_sold_date_sk = d_date_sk
+ where cr_order_number is null
+ group by d_year, cs_item_sk, cs_bill_customer_sk
+ ),
+ss as
+ (select d_year AS ss_sold_year, ss_item_sk,
+ ss_customer_sk,
+ sum(ss_quantity) ss_qty,
+ sum(ss_wholesale_cost) ss_wc,
+ sum(ss_sales_price) ss_sp
+ from plato.store_sales
+ left join plato.store_returns on sr_ticket_number=ss_ticket_number and ss_item_sk=sr_item_sk
+ join plato.date_dim on ss_sold_date_sk = d_date_sk
+ where sr_ticket_number is null
+ group by d_year, ss_item_sk, ss_customer_sk
+ )
+ select
+ss_sold_year, ss_item_sk, ss_customer_sk,
+round((ss_qty/(coalesce(ws_qty,0::int8)+coalesce(cs_qty,0::int8)))::numeric,2) ratio,
+ss_qty store_qty, ss_wc store_wholesale_cost, ss_sp store_sales_price,
+coalesce(ws_qty,0::int8)+coalesce(cs_qty,0::int8) other_chan_qty,
+coalesce(ws_wc,0::numeric)+coalesce(cs_wc,0::numeric) other_chan_wholesale_cost,
+coalesce(ws_sp,0::numeric)+coalesce(cs_sp,0::numeric) other_chan_sales_price
+from ss
+left join ws on (ws_sold_year=ss_sold_year and ws_item_sk=ss_item_sk and ws_customer_sk=ss_customer_sk)
+left join cs on (cs_sold_year=ss_sold_year and cs_item_sk=ss_item_sk and cs_customer_sk=ss_customer_sk)
+where (coalesce(ws_qty,0::int8)>0::int8 or coalesce(cs_qty, 0::int8)>0::int8) and ss_sold_year=2000
+order by
+ ss_sold_year, ss_item_sk, ss_customer_sk,
+ ss_qty desc, ss_wc desc, ss_sp desc,
+ other_chan_qty,
+ other_chan_wholesale_cost,
+ other_chan_sales_price,
+ ratio
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query78.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q79.sql b/yt/yql/tests/sql/suites/pg-tpcds/q79.sql
new file mode 100644
index 0000000000..106c147a1e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q79.sql
@@ -0,0 +1,26 @@
+--!syntax_pg
+--TPC-DS Q79
+
+-- start query 1 in stream 0 using template ../query_templates/query79.tpl
+select
+ c_last_name,c_first_name,substr(s_city,1,30),ss_ticket_number,amt,profit
+ from
+ (select ss_ticket_number
+ ,ss_customer_sk
+ ,store.s_city
+ ,sum(ss_coupon_amt) amt
+ ,sum(ss_net_profit) profit
+ from plato.store_sales,plato.date_dim,plato.store,plato.household_demographics
+ where store_sales.ss_sold_date_sk = date_dim.d_date_sk
+ and store_sales.ss_store_sk = store.s_store_sk
+ and store_sales.ss_hdemo_sk = household_demographics.hd_demo_sk
+ and (household_demographics.hd_dep_count = 8 or household_demographics.hd_vehicle_count > 0)
+ and date_dim.d_dow = 1
+ and date_dim.d_year in (1998,1998+1,1998+2)
+ and store.s_number_employees between 200 and 295
+ group by ss_ticket_number,ss_customer_sk,ss_addr_sk,store.s_city) ms,plato.customer
+ where ss_customer_sk = c_customer_sk
+ order by c_last_name,c_first_name,substr(s_city,1,30), profit
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query79.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q80.sql b/yt/yql/tests/sql/suites/pg-tpcds/q80.sql
new file mode 100644
index 0000000000..0ed10ead39
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q80.sql
@@ -0,0 +1,99 @@
+--!syntax_pg
+--TPC-DS Q80
+
+-- start query 1 in stream 0 using template ../query_templates/query80.tpl
+with ssr as
+ (select s_store_id as store_id,
+ sum(ss_ext_sales_price) as sales,
+ sum(coalesce(sr_return_amt, 0::numeric)) as returns,
+ sum(ss_net_profit - coalesce(sr_net_loss, 0::numeric)) as profit
+ from plato.store_sales left outer join plato.store_returns on
+ (ss_item_sk = sr_item_sk and ss_ticket_number = sr_ticket_number),
+ plato.date_dim,
+ plato.store,
+ plato.item,
+ plato.promotion
+ where ss_sold_date_sk = d_date_sk
+ and d_date between cast('1998-08-04' as date)
+ and (cast('1998-08-04' as date) + interval '30' day)::date
+ and ss_store_sk = s_store_sk
+ and ss_item_sk = i_item_sk
+ and i_current_price > 50::numeric
+ and ss_promo_sk = p_promo_sk
+ and p_channel_tv = 'N'
+ group by s_store_id)
+ ,
+ csr as
+ (select cp_catalog_page_id as catalog_page_id,
+ sum(cs_ext_sales_price) as sales,
+ sum(coalesce(cr_return_amount, 0::numeric)) as returns,
+ sum(cs_net_profit - coalesce(cr_net_loss, 0::numeric)) as profit
+ from plato.catalog_sales left outer join plato.catalog_returns on
+ (cs_item_sk = cr_item_sk and cs_order_number = cr_order_number),
+ plato.date_dim,
+ plato.catalog_page,
+ plato.item,
+ plato.promotion
+ where cs_sold_date_sk = d_date_sk
+ and d_date between cast('1998-08-04' as date)
+ and (cast('1998-08-04' as date) + interval '30' day)::date
+ and cs_catalog_page_sk = cp_catalog_page_sk
+ and cs_item_sk = i_item_sk
+ and i_current_price > 50::numeric
+ and cs_promo_sk = p_promo_sk
+ and p_channel_tv = 'N'
+group by cp_catalog_page_id)
+ ,
+ wsr as
+ (select web_site_id,
+ sum(ws_ext_sales_price) as sales,
+ sum(coalesce(wr_return_amt, 0::numeric)) as returns,
+ sum(ws_net_profit - coalesce(wr_net_loss, 0::numeric)) as profit
+ from plato.web_sales left outer join plato.web_returns on
+ (ws_item_sk = wr_item_sk and ws_order_number = wr_order_number),
+ plato.date_dim,
+ plato.web_site,
+ plato.item,
+ plato.promotion
+ where ws_sold_date_sk = d_date_sk
+ and d_date between cast('1998-08-04' as date)
+ and (cast('1998-08-04' as date) + interval '30' day)::date
+ and ws_web_site_sk = web_site_sk
+ and ws_item_sk = i_item_sk
+ and i_current_price > 50::numeric
+ and ws_promo_sk = p_promo_sk
+ and p_channel_tv = 'N'
+group by web_site_id)
+ select channel
+ , id
+ , sum(sales) as sales
+ , sum(returns) as returns
+ , sum(profit) as profit
+ from
+ (select 'store channel' as channel
+ , 'store' || store_id as id
+ , sales
+ , returns
+ , profit
+ from ssr
+ union all
+ select 'catalog channel' as channel
+ , 'catalog_page' || catalog_page_id as id
+ , sales
+ , returns
+ , profit
+ from csr
+ union all
+ select 'web channel' as channel
+ , 'web_site' || web_site_id as id
+ , sales
+ , returns
+ , profit
+ from wsr
+ ) x
+ group by rollup (channel, id)
+ order by channel
+ ,id
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query80.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q81.sql b/yt/yql/tests/sql/suites/pg-tpcds/q81.sql
new file mode 100644
index 0000000000..e90c1f85ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q81.sql
@@ -0,0 +1,34 @@
+--!syntax_pg
+--TPC-DS Q81
+
+-- start query 1 in stream 0 using template ../query_templates/query81.tpl
+with customer_total_return as
+ (select cr_returning_customer_sk as ctr_customer_sk
+ ,ca_state as ctr_state,
+ sum(cr_return_amt_inc_tax) as ctr_total_return
+ from plato.catalog_returns
+ ,plato.date_dim
+ ,plato.customer_address
+ where cr_returned_date_sk = d_date_sk
+ and d_year =1998
+ and cr_returning_addr_sk = ca_address_sk
+ group by cr_returning_customer_sk
+ ,ca_state )
+ select c_customer_id,c_salutation,c_first_name,c_last_name,ca_street_number,ca_street_name
+ ,ca_street_type,ca_suite_number,ca_city,ca_county,ca_state,ca_zip,ca_country,ca_gmt_offset
+ ,ca_location_type,ctr_total_return
+ from customer_total_return ctr1
+ ,plato.customer_address
+ ,plato.customer
+ where ctr1.ctr_total_return > (select avg(ctr_total_return)*1.2::numeric
+ from customer_total_return ctr2
+ where ctr1.ctr_state = ctr2.ctr_state)
+ and ca_address_sk = c_current_addr_sk
+ and ca_state = 'IL'
+ and ctr1.ctr_customer_sk = c_customer_sk
+ order by c_customer_id,c_salutation,c_first_name,c_last_name,ca_street_number,ca_street_name
+ ,ca_street_type,ca_suite_number,ca_city,ca_county,ca_state,ca_zip,ca_country,ca_gmt_offset
+ ,ca_location_type,ctr_total_return
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query81.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q82.sql b/yt/yql/tests/sql/suites/pg-tpcds/q82.sql
new file mode 100644
index 0000000000..9d641268b6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q82.sql
@@ -0,0 +1,20 @@
+--!syntax_pg
+--TPC-DS Q82
+
+-- start query 1 in stream 0 using template ../query_templates/query82.tpl
+select i_item_id
+ ,i_item_desc
+ ,i_current_price
+ from plato.item, plato.inventory, plato.date_dim, plato.store_sales
+ where i_current_price between 30::numeric and (30+30)::numeric
+ and inv_item_sk = i_item_sk
+ and d_date_sk=inv_date_sk
+ and d_date between cast('2002-05-30' as date) and (cast('2002-05-30' as date) + interval '60' day)::date
+ and i_manufact_id in (437,129,727,663)
+ and inv_quantity_on_hand between 100 and 500
+ and ss_item_sk = i_item_sk
+ group by i_item_id,i_item_desc,i_current_price
+ order by i_item_id
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query82.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q83.sql b/yt/yql/tests/sql/suites/pg-tpcds/q83.sql
new file mode 100644
index 0000000000..0801e9902c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q83.sql
@@ -0,0 +1,70 @@
+--!syntax_pg
+--TPC-DS Q83
+
+-- start query 1 in stream 0 using template ../query_templates/query83.tpl
+with sr_items as
+ (select i_item_id item_id,
+ sum(sr_return_quantity) sr_item_qty
+ from plato.store_returns,
+ plato.item,
+ plato.date_dim
+ where sr_item_sk = i_item_sk
+ and d_date in
+ (select d_date
+ from plato.date_dim
+ where d_week_seq in
+ (select d_week_seq
+ from plato.date_dim
+ where d_date in ('1998-01-02'::date,'1998-10-15'::date,'1998-11-10'::date)))
+ and sr_returned_date_sk = d_date_sk
+ group by i_item_id),
+ cr_items as
+ (select i_item_id item_id,
+ sum(cr_return_quantity) cr_item_qty
+ from plato.catalog_returns,
+ plato.item,
+ plato.date_dim
+ where cr_item_sk = i_item_sk
+ and d_date in
+ (select d_date
+ from plato.date_dim
+ where d_week_seq in
+ (select d_week_seq
+ from plato.date_dim
+ where d_date in ('1998-01-02'::date,'1998-10-15'::date,'1998-11-10'::date)))
+ and cr_returned_date_sk = d_date_sk
+ group by i_item_id),
+ wr_items as
+ (select i_item_id item_id,
+ sum(wr_return_quantity) wr_item_qty
+ from plato.web_returns,
+ plato.item,
+ plato.date_dim
+ where wr_item_sk = i_item_sk
+ and d_date in
+ (select d_date
+ from plato.date_dim
+ where d_week_seq in
+ (select d_week_seq
+ from plato.date_dim
+ where d_date in ('1998-01-02'::date,'1998-10-15'::date,'1998-11-10'::date)))
+ and wr_returned_date_sk = d_date_sk
+ group by i_item_id)
+ select sr_items.item_id
+ ,sr_item_qty
+ ,sr_item_qty::numeric/(sr_item_qty+cr_item_qty+wr_item_qty)::numeric/3.0::numeric * 100::numeric sr_dev
+ ,cr_item_qty
+ ,cr_item_qty::numeric/(sr_item_qty+cr_item_qty+wr_item_qty)::numeric/3.0::numeric * 100::numeric cr_dev
+ ,wr_item_qty
+ ,wr_item_qty::numeric/(sr_item_qty+cr_item_qty+wr_item_qty)::numeric/3.0::numeric * 100::numeric wr_dev
+ ,(sr_item_qty+cr_item_qty+wr_item_qty)::numeric/3.0::numeric average
+ from sr_items
+ ,cr_items
+ ,wr_items
+ where sr_items.item_id=cr_items.item_id
+ and sr_items.item_id=wr_items.item_id
+ order by sr_items.item_id
+ ,sr_item_qty
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query83.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q84.sql b/yt/yql/tests/sql/suites/pg-tpcds/q84.sql
new file mode 100644
index 0000000000..edb7027691
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q84.sql
@@ -0,0 +1,24 @@
+--!syntax_pg
+--TPC-DS Q84
+
+-- start query 1 in stream 0 using template ../query_templates/query84.tpl
+select c_customer_id as customer_id
+ , coalesce(c_last_name,'') || ', ' || coalesce(c_first_name,'') as customername
+ from plato.customer
+ ,plato.customer_address
+ ,plato.customer_demographics
+ ,plato.household_demographics
+ ,plato.income_band
+ ,plato.store_returns
+ where ca_city = 'Hopewell'
+ and c_current_addr_sk = ca_address_sk
+ and ib_lower_bound >= 32287
+ and ib_upper_bound <= 32287 + 50000
+ and ib_income_band_sk = hd_income_band_sk
+ and cd_demo_sk = c_current_cdemo_sk
+ and hd_demo_sk = c_current_hdemo_sk
+ and sr_cdemo_sk = cd_demo_sk
+ order by c_customer_id
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query84.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q85.sql b/yt/yql/tests/sql/suites/pg-tpcds/q85.sql
new file mode 100644
index 0000000000..b438fd07c9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q85.sql
@@ -0,0 +1,87 @@
+--!syntax_pg
+--TPC-DS Q85
+
+-- start query 1 in stream 0 using template ../query_templates/query85.tpl
+select substr(r_reason_desc,1,20) reason
+ ,avg(ws_quantity) avg_ws_q
+ ,avg(wr_refunded_cash) avg_wr_r
+ ,avg(wr_fee) avg_wr_f
+ from plato.web_sales, plato.web_returns, plato.web_page, plato.customer_demographics cd1,
+ plato.customer_demographics cd2, plato.customer_address, plato.date_dim, plato.reason
+ where ws_web_page_sk = wp_web_page_sk
+ and ws_item_sk = wr_item_sk
+ and ws_order_number = wr_order_number
+ and ws_sold_date_sk = d_date_sk and d_year = 1998
+ and cd1.cd_demo_sk = wr_refunded_cdemo_sk
+ and cd2.cd_demo_sk = wr_returning_cdemo_sk
+ and ca_address_sk = wr_refunded_addr_sk
+ and r_reason_sk = wr_reason_sk
+ and
+ (
+ (
+ cd1.cd_marital_status = 'M'
+ and
+ cd1.cd_marital_status = cd2.cd_marital_status
+ and
+ cd1.cd_education_status = '4 yr Degree'
+ and
+ cd1.cd_education_status = cd2.cd_education_status
+ and
+ ws_sales_price between 100.00::numeric and 150.00::numeric
+ )
+ or
+ (
+ cd1.cd_marital_status = 'D'
+ and
+ cd1.cd_marital_status = cd2.cd_marital_status
+ and
+ cd1.cd_education_status = 'Primary'
+ and
+ cd1.cd_education_status = cd2.cd_education_status
+ and
+ ws_sales_price between 50.00::numeric and 100.00::numeric
+ )
+ or
+ (
+ cd1.cd_marital_status = 'U'
+ and
+ cd1.cd_marital_status = cd2.cd_marital_status
+ and
+ cd1.cd_education_status = 'Advanced Degree'
+ and
+ cd1.cd_education_status = cd2.cd_education_status
+ and
+ ws_sales_price between 150.00::numeric and 200.00::numeric
+ )
+ )
+ and
+ (
+ (
+ ca_country = 'United States'
+ and
+ ca_state in ('KY', 'GA', 'NM')
+ and ws_net_profit between 100::numeric and 200::numeric
+ )
+ or
+ (
+ ca_country = 'United States'
+ and
+ ca_state in ('MT', 'OR', 'IN')
+ and ws_net_profit between 150::numeric and 300::numeric
+ )
+ or
+ (
+ ca_country = 'United States'
+ and
+ ca_state in ('WI', 'MO', 'WV')
+ and ws_net_profit between 50::numeric and 250::numeric
+ )
+ )
+group by r_reason_desc
+order by substr(r_reason_desc,1,20)
+ ,avg(ws_quantity)
+ ,avg(wr_refunded_cash)
+ ,avg(wr_fee)
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query85.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q86.sql b/yt/yql/tests/sql/suites/pg-tpcds/q86.sql
new file mode 100644
index 0000000000..0d44f7482b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q86.sql
@@ -0,0 +1,29 @@
+--!syntax_pg
+--TPC-DS Q86
+
+-- start query 1 in stream 0 using template ../query_templates/query86.tpl
+select
+ sum(ws_net_paid) as total_sum
+ ,i_category
+ ,i_class
+ ,grouping(i_category)+grouping(i_class) as lochierarchy
+ ,rank() over (
+ partition by grouping(i_category)+grouping(i_class),
+ case when grouping(i_class) = 0 then i_category end
+ order by sum(ws_net_paid) desc) as rank_within_parent
+ from
+ plato.web_sales
+ ,plato.date_dim d1
+ ,plato.item
+ where
+ d1.d_month_seq between 1212 and 1212+11
+ and d1.d_date_sk = ws_sold_date_sk
+ and i_item_sk = ws_item_sk
+ group by rollup(i_category,i_class)
+ order by
+ lochierarchy desc,
+ case when lochierarchy = 0 then i_category end,
+ rank_within_parent
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query86.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q87.sql b/yt/yql/tests/sql/suites/pg-tpcds/q87.sql
new file mode 100644
index 0000000000..e3ff56344c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q87.sql
@@ -0,0 +1,26 @@
+--!syntax_pg
+--TPC-DS Q87
+
+-- start query 1 in stream 0 using template ../query_templates/query87.tpl
+select count(*)
+from ((select distinct c_last_name, c_first_name, d_date
+ from plato.store_sales, plato.date_dim, plato.customer
+ where store_sales.ss_sold_date_sk = date_dim.d_date_sk
+ and store_sales.ss_customer_sk = customer.c_customer_sk
+ and d_month_seq between 1212 and 1212+11)
+ except
+ (select distinct c_last_name, c_first_name, d_date
+ from plato.catalog_sales, plato.date_dim, plato.customer
+ where catalog_sales.cs_sold_date_sk = date_dim.d_date_sk
+ and catalog_sales.cs_bill_customer_sk = customer.c_customer_sk
+ and d_month_seq between 1212 and 1212+11)
+ except
+ (select distinct c_last_name, c_first_name, d_date
+ from plato.web_sales, plato.date_dim, plato.customer
+ where web_sales.ws_sold_date_sk = date_dim.d_date_sk
+ and web_sales.ws_bill_customer_sk = customer.c_customer_sk
+ and d_month_seq between 1212 and 1212+11)
+) cool_cust
+;
+
+-- end query 1 in stream 0 using template ../query_templates/query87.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q88.sql b/yt/yql/tests/sql/suites/pg-tpcds/q88.sql
new file mode 100644
index 0000000000..e2887788ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q88.sql
@@ -0,0 +1,97 @@
+--!syntax_pg
+--TPC-DS Q88
+
+-- start query 1 in stream 0 using template ../query_templates/query88.tpl
+select *
+from
+ (select count(*) h8_30_to_9
+ from plato.store_sales, plato.household_demographics , plato.time_dim, plato.store
+ where ss_sold_time_sk = time_dim.t_time_sk
+ and ss_hdemo_sk = household_demographics.hd_demo_sk
+ and ss_store_sk = s_store_sk
+ and time_dim.t_hour = 8
+ and time_dim.t_minute >= 30
+ and ((household_demographics.hd_dep_count = 3 and household_demographics.hd_vehicle_count<=3+2) or
+ (household_demographics.hd_dep_count = 0 and household_demographics.hd_vehicle_count<=0+2) or
+ (household_demographics.hd_dep_count = 1 and household_demographics.hd_vehicle_count<=1+2))
+ and store.s_store_name = 'ese') s1,
+ (select count(*) h9_to_9_30
+ from plato.store_sales, plato.household_demographics , plato.time_dim, plato.store
+ where ss_sold_time_sk = time_dim.t_time_sk
+ and ss_hdemo_sk = household_demographics.hd_demo_sk
+ and ss_store_sk = s_store_sk
+ and time_dim.t_hour = 9
+ and time_dim.t_minute < 30
+ and ((household_demographics.hd_dep_count = 3 and household_demographics.hd_vehicle_count<=3+2) or
+ (household_demographics.hd_dep_count = 0 and household_demographics.hd_vehicle_count<=0+2) or
+ (household_demographics.hd_dep_count = 1 and household_demographics.hd_vehicle_count<=1+2))
+ and store.s_store_name = 'ese') s2,
+ (select count(*) h9_30_to_10
+ from plato.store_sales, plato.household_demographics , plato.time_dim, plato.store
+ where ss_sold_time_sk = time_dim.t_time_sk
+ and ss_hdemo_sk = household_demographics.hd_demo_sk
+ and ss_store_sk = s_store_sk
+ and time_dim.t_hour = 9
+ and time_dim.t_minute >= 30
+ and ((household_demographics.hd_dep_count = 3 and household_demographics.hd_vehicle_count<=3+2) or
+ (household_demographics.hd_dep_count = 0 and household_demographics.hd_vehicle_count<=0+2) or
+ (household_demographics.hd_dep_count = 1 and household_demographics.hd_vehicle_count<=1+2))
+ and store.s_store_name = 'ese') s3,
+ (select count(*) h10_to_10_30
+ from plato.store_sales, plato.household_demographics , plato.time_dim, plato.store
+ where ss_sold_time_sk = time_dim.t_time_sk
+ and ss_hdemo_sk = household_demographics.hd_demo_sk
+ and ss_store_sk = s_store_sk
+ and time_dim.t_hour = 10
+ and time_dim.t_minute < 30
+ and ((household_demographics.hd_dep_count = 3 and household_demographics.hd_vehicle_count<=3+2) or
+ (household_demographics.hd_dep_count = 0 and household_demographics.hd_vehicle_count<=0+2) or
+ (household_demographics.hd_dep_count = 1 and household_demographics.hd_vehicle_count<=1+2))
+ and store.s_store_name = 'ese') s4,
+ (select count(*) h10_30_to_11
+ from plato.store_sales, plato.household_demographics , plato.time_dim, plato.store
+ where ss_sold_time_sk = time_dim.t_time_sk
+ and ss_hdemo_sk = household_demographics.hd_demo_sk
+ and ss_store_sk = s_store_sk
+ and time_dim.t_hour = 10
+ and time_dim.t_minute >= 30
+ and ((household_demographics.hd_dep_count = 3 and household_demographics.hd_vehicle_count<=3+2) or
+ (household_demographics.hd_dep_count = 0 and household_demographics.hd_vehicle_count<=0+2) or
+ (household_demographics.hd_dep_count = 1 and household_demographics.hd_vehicle_count<=1+2))
+ and store.s_store_name = 'ese') s5,
+ (select count(*) h11_to_11_30
+ from plato.store_sales, plato.household_demographics , plato.time_dim, plato.store
+ where ss_sold_time_sk = time_dim.t_time_sk
+ and ss_hdemo_sk = household_demographics.hd_demo_sk
+ and ss_store_sk = s_store_sk
+ and time_dim.t_hour = 11
+ and time_dim.t_minute < 30
+ and ((household_demographics.hd_dep_count = 3 and household_demographics.hd_vehicle_count<=3+2) or
+ (household_demographics.hd_dep_count = 0 and household_demographics.hd_vehicle_count<=0+2) or
+ (household_demographics.hd_dep_count = 1 and household_demographics.hd_vehicle_count<=1+2))
+ and store.s_store_name = 'ese') s6,
+ (select count(*) h11_30_to_12
+ from plato.store_sales, plato.household_demographics , plato.time_dim, plato.store
+ where ss_sold_time_sk = time_dim.t_time_sk
+ and ss_hdemo_sk = household_demographics.hd_demo_sk
+ and ss_store_sk = s_store_sk
+ and time_dim.t_hour = 11
+ and time_dim.t_minute >= 30
+ and ((household_demographics.hd_dep_count = 3 and household_demographics.hd_vehicle_count<=3+2) or
+ (household_demographics.hd_dep_count = 0 and household_demographics.hd_vehicle_count<=0+2) or
+ (household_demographics.hd_dep_count = 1 and household_demographics.hd_vehicle_count<=1+2))
+ and store.s_store_name = 'ese') s7,
+ (select count(*) h12_to_12_30
+ from plato.store_sales, plato.household_demographics , plato.time_dim, plato.store
+ where ss_sold_time_sk = time_dim.t_time_sk
+ and ss_hdemo_sk = household_demographics.hd_demo_sk
+ and ss_store_sk = s_store_sk
+ and time_dim.t_hour = 12
+ and time_dim.t_minute < 30
+ and ((household_demographics.hd_dep_count = 3 and household_demographics.hd_vehicle_count<=3+2) or
+ (household_demographics.hd_dep_count = 0 and household_demographics.hd_vehicle_count<=0+2) or
+ (household_demographics.hd_dep_count = 1 and household_demographics.hd_vehicle_count<=1+2))
+ and store.s_store_name = 'ese') s8
+;
+
+-- end query 1 in stream 0 using template ../query_templates/query88.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q89.sql b/yt/yql/tests/sql/suites/pg-tpcds/q89.sql
new file mode 100644
index 0000000000..7bc365056a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q89.sql
@@ -0,0 +1,31 @@
+--!syntax_pg
+--TPC-DS Q89
+
+-- start query 1 in stream 0 using template ../query_templates/query89.tpl
+select *
+from(
+select i_category, i_class, i_brand,
+ s_store_name, s_company_name,
+ d_moy,
+ sum(ss_sales_price) sum_sales,
+ avg(sum(ss_sales_price)) over
+ (partition by i_category, i_brand, s_store_name, s_company_name)
+ avg_monthly_sales
+from plato.item, plato.store_sales, plato.date_dim, plato.store
+where ss_item_sk = i_item_sk and
+ ss_sold_date_sk = d_date_sk and
+ ss_store_sk = s_store_sk and
+ d_year in (2000) and
+ ((i_category in ('Home','Books','Electronics') and
+ i_class in ('wallpaper','parenting','musical')
+ )
+ or (i_category in ('Shoes','Jewelry','Men') and
+ i_class in ('womens','birdal','pants')
+ ))
+group by i_category, i_class, i_brand,
+ s_store_name, s_company_name, d_moy) tmp1
+where case when (avg_monthly_sales <> 0::numeric) then (abs(sum_sales - avg_monthly_sales) / avg_monthly_sales) else null::numeric end > 0.1::numeric
+order by sum_sales - avg_monthly_sales, s_store_name
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query89.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q90.sql b/yt/yql/tests/sql/suites/pg-tpcds/q90.sql
new file mode 100644
index 0000000000..cf4342c67c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q90.sql
@@ -0,0 +1,25 @@
+--!syntax_pg
+--TPC-DS Q90
+
+-- start query 1 in stream 0 using template ../query_templates/query90.tpl
+select cast(amc as decimal(15,4))/cast(pmc as decimal(15,4)) am_pm_ratio
+ from ( select count(*) amc
+ from plato.web_sales, plato.household_demographics , plato.time_dim, plato.web_page
+ where ws_sold_time_sk = time_dim.t_time_sk
+ and ws_ship_hdemo_sk = household_demographics.hd_demo_sk
+ and ws_web_page_sk = web_page.wp_web_page_sk
+ and time_dim.t_hour between 6 and 6+1
+ and household_demographics.hd_dep_count = 8
+ and web_page.wp_char_count between 5000 and 5200) at,
+ ( select 1 + count(*) pmc
+ from plato.web_sales, plato.household_demographics , plato.time_dim, plato.web_page
+ where ws_sold_time_sk = time_dim.t_time_sk
+ and ws_ship_hdemo_sk = household_demographics.hd_demo_sk
+ and ws_web_page_sk = web_page.wp_web_page_sk
+ and time_dim.t_hour between 14 and 14+1
+ and household_demographics.hd_dep_count = 8
+ and web_page.wp_char_count between 5000 and 5200) pt
+ order by am_pm_ratio
+ limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query90.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q91.sql b/yt/yql/tests/sql/suites/pg-tpcds/q91.sql
new file mode 100644
index 0000000000..3fa68d2371
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q91.sql
@@ -0,0 +1,34 @@
+--!syntax_pg
+--TPC-DS Q91
+
+-- start query 1 in stream 0 using template ../query_templates/query91.tpl
+select
+ cc_call_center_id Call_Center,
+ cc_name Call_Center_Name,
+ cc_manager Manager,
+ sum(cr_net_loss) Returns_Loss
+from
+ plato.call_center,
+ plato.catalog_returns,
+ plato.date_dim,
+ plato.customer,
+ plato.customer_address,
+ plato.customer_demographics,
+ plato.household_demographics
+where
+ cr_call_center_sk = cc_call_center_sk
+and cr_returned_date_sk = d_date_sk
+and cr_returning_customer_sk= c_customer_sk
+and cd_demo_sk = c_current_cdemo_sk
+and hd_demo_sk = c_current_hdemo_sk
+and ca_address_sk = c_current_addr_sk
+and d_year = 1999
+and d_moy = 11
+and ( (cd_marital_status = 'M' and cd_education_status = 'Unknown')
+ or(cd_marital_status = 'W' and cd_education_status = 'Advanced Degree'))
+and hd_buy_potential like '0-500%'
+and ca_gmt_offset = -7::numeric
+group by cc_call_center_id,cc_name,cc_manager,cd_marital_status,cd_education_status
+order by sum(cr_net_loss) desc;
+
+-- end query 1 in stream 0 using template ../query_templates/query91.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q92.sql b/yt/yql/tests/sql/suites/pg-tpcds/q92.sql
new file mode 100644
index 0000000000..262bcdc718
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q92.sql
@@ -0,0 +1,33 @@
+--!syntax_pg
+--TPC-DS Q92
+
+-- start query 1 in stream 0 using template ../query_templates/query92.tpl
+select
+ sum(ws_ext_discount_amt) as "Excess Discount Amount"
+from
+ plato.web_sales
+ ,plato.item
+ ,plato.date_dim
+where
+i_manufact_id = 269
+and i_item_sk = ws_item_sk
+and d_date between '1998-03-18'::date and
+ (cast('1998-03-18' as date) + interval '90' day)::date
+and d_date_sk = ws_sold_date_sk
+and ws_ext_discount_amt
+ > (
+ SELECT
+ 1.3::numeric * avg(ws_ext_discount_amt)
+ FROM
+ plato.web_sales
+ ,plato.date_dim
+ WHERE
+ ws_item_sk = i_item_sk
+ and d_date between '1998-03-18'::date and
+ (cast('1998-03-18' as date) + interval '90' day)::date
+ and d_date_sk = ws_sold_date_sk
+ )
+order by sum(ws_ext_discount_amt)
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query92.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q93.sql b/yt/yql/tests/sql/suites/pg-tpcds/q93.sql
new file mode 100644
index 0000000000..4dadc188eb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q93.sql
@@ -0,0 +1,21 @@
+--!syntax_pg
+--TPC-DS Q93
+
+-- start query 1 in stream 0 using template ../query_templates/query93.tpl
+select ss_customer_sk
+ ,sum(act_sales) sumsales
+ from (select ss_item_sk
+ ,ss_ticket_number
+ ,ss_customer_sk
+ ,case when sr_return_quantity is not null then (ss_quantity-sr_return_quantity)::numeric*ss_sales_price
+ else (ss_quantity::numeric*ss_sales_price) end act_sales
+ from plato.store_sales left outer join plato.store_returns on (sr_item_sk = ss_item_sk
+ and sr_ticket_number = ss_ticket_number)
+ ,plato.reason
+ where sr_reason_sk = r_reason_sk
+ and r_reason_desc = 'Did not like the warranty') t
+ group by ss_customer_sk
+ order by sumsales, ss_customer_sk
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query93.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q94.sql b/yt/yql/tests/sql/suites/pg-tpcds/q94.sql
new file mode 100644
index 0000000000..daacc6aa7e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q94.sql
@@ -0,0 +1,32 @@
+--!syntax_pg
+--TPC-DS Q94
+
+-- start query 1 in stream 0 using template ../query_templates/query94.tpl
+select
+ count(distinct ws_order_number) as "order count"
+ ,sum(ws_ext_ship_cost) as "total shipping cost"
+ ,sum(ws_net_profit) as "total net profit"
+from
+ plato.web_sales ws1
+ ,plato.date_dim
+ ,plato.customer_address
+ ,plato.web_site
+where
+ d_date between '1999-5-01'::date and
+ (cast('1999-5-01' as date) + interval '60' day)::date
+and ws1.ws_ship_date_sk = d_date_sk
+and ws1.ws_ship_addr_sk = ca_address_sk
+and ca_state = 'TX'
+and ws1.ws_web_site_sk = web_site_sk
+and web_company_name = 'pri'
+and exists (select *
+ from plato.web_sales ws2
+ where ws1.ws_order_number = ws2.ws_order_number
+ and ws1.ws_warehouse_sk <> ws2.ws_warehouse_sk)
+and not exists(select *
+ from plato.web_returns wr1
+ where ws1.ws_order_number = wr1.wr_order_number)
+order by count(distinct ws_order_number)
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query94.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q95.sql b/yt/yql/tests/sql/suites/pg-tpcds/q95.sql
new file mode 100644
index 0000000000..22bf4259f4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q95.sql
@@ -0,0 +1,35 @@
+--!syntax_pg
+--TPC-DS Q95
+
+-- start query 1 in stream 0 using template ../query_templates/query95.tpl
+with ws_wh as
+(select ws1.ws_order_number,ws1.ws_warehouse_sk wh1,ws2.ws_warehouse_sk wh2
+ from plato.web_sales ws1,plato.web_sales ws2
+ where ws1.ws_order_number = ws2.ws_order_number
+ and ws1.ws_warehouse_sk <> ws2.ws_warehouse_sk)
+ select
+ count(distinct ws_order_number) as "order count"
+ ,sum(ws_ext_ship_cost) as "total shipping cost"
+ ,sum(ws_net_profit) as "total net profit"
+from
+ plato.web_sales ws1
+ ,plato.date_dim
+ ,plato.customer_address
+ ,plato.web_site
+where
+ d_date between '1999-5-01'::date and
+ (cast('1999-5-01' as date) + interval '60' day)::date
+and ws1.ws_ship_date_sk = d_date_sk
+and ws1.ws_ship_addr_sk = ca_address_sk
+and ca_state = 'TX'
+and ws1.ws_web_site_sk = web_site_sk
+and web_company_name = 'pri'
+and ws1.ws_order_number in (select ws_order_number
+ from ws_wh)
+and ws1.ws_order_number in (select wr_order_number
+ from plato.web_returns,ws_wh
+ where wr_order_number = ws_wh.ws_order_number)
+order by count(distinct ws_order_number)
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query95.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q96.sql b/yt/yql/tests/sql/suites/pg-tpcds/q96.sql
new file mode 100644
index 0000000000..d7b1e2032b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q96.sql
@@ -0,0 +1,19 @@
+--!syntax_pg
+--TPC-DS Q96
+
+-- start query 1 in stream 0 using template ../query_templates/query96.tpl
+select count(*)
+from plato.store_sales
+ ,plato.household_demographics
+ ,plato.time_dim, plato.store
+where ss_sold_time_sk = time_dim.t_time_sk
+ and ss_hdemo_sk = household_demographics.hd_demo_sk
+ and ss_store_sk = s_store_sk
+ and time_dim.t_hour = 8
+ and time_dim.t_minute >= 30
+ and household_demographics.hd_dep_count = 5
+ and store.s_store_name = 'ese'
+order by count(*)
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query96.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q97.sql b/yt/yql/tests/sql/suites/pg-tpcds/q97.sql
new file mode 100644
index 0000000000..6202209359
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q97.sql
@@ -0,0 +1,28 @@
+--!syntax_pg
+--TPC-DS Q97
+
+-- start query 1 in stream 0 using template ../query_templates/query97.tpl
+with ssci as (
+select ss_customer_sk customer_sk
+ ,ss_item_sk item_sk
+from plato.store_sales,plato.date_dim
+where ss_sold_date_sk = d_date_sk
+ and d_month_seq between 1212 and 1212 + 11
+group by ss_customer_sk
+ ,ss_item_sk),
+csci as(
+ select cs_bill_customer_sk customer_sk
+ ,cs_item_sk item_sk
+from plato.catalog_sales,plato.date_dim
+where cs_sold_date_sk = d_date_sk
+ and d_month_seq between 1212 and 1212 + 11
+group by cs_bill_customer_sk
+ ,cs_item_sk)
+ select sum(case when ssci.customer_sk is not null and csci.customer_sk is null then 1 else 0 end) store_only
+ ,sum(case when ssci.customer_sk is null and csci.customer_sk is not null then 1 else 0 end) catalog_only
+ ,sum(case when ssci.customer_sk is not null and csci.customer_sk is not null then 1 else 0 end) store_and_catalog
+from ssci full outer join csci on (ssci.customer_sk=csci.customer_sk
+ and ssci.item_sk = csci.item_sk)
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query97.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q98.sql b/yt/yql/tests/sql/suites/pg-tpcds/q98.sql
new file mode 100644
index 0000000000..a6342cfc08
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q98.sql
@@ -0,0 +1,36 @@
+--!syntax_pg
+--TPC-DS Q98
+
+-- start query 1 in stream 0 using template ../query_templates/query98.tpl
+select i_item_id
+ ,i_item_desc
+ ,i_category
+ ,i_class
+ ,i_current_price
+ ,sum(ss_ext_sales_price) as itemrevenue
+ ,sum(ss_ext_sales_price)*100::numeric/sum(sum(ss_ext_sales_price)) over
+ (partition by i_class) as revenueratio
+from
+ plato.store_sales
+ ,plato.item
+ ,plato.date_dim
+where
+ ss_item_sk = i_item_sk
+ and i_category in ('Jewelry', 'Sports', 'Books')
+ and ss_sold_date_sk = d_date_sk
+ and d_date between cast('2001-01-12' as date)
+ and (cast('2001-01-12' as date) + interval '30' day)::date
+group by
+ i_item_id
+ ,i_item_desc
+ ,i_category
+ ,i_class
+ ,i_current_price
+order by
+ i_category
+ ,i_class
+ ,i_item_id
+ ,i_item_desc
+ ,revenueratio;
+
+-- end query 1 in stream 0 using template ../query_templates/query98.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/q99.sql b/yt/yql/tests/sql/suites/pg-tpcds/q99.sql
new file mode 100644
index 0000000000..997a52b9c3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/q99.sql
@@ -0,0 +1,38 @@
+--!syntax_pg
+--TPC-DS Q99
+
+-- start query 1 in stream 0 using template ../query_templates/query99.tpl
+select
+ substr(w_warehouse_name,1,20)
+ ,sm_type
+ ,cc_name
+ ,sum(case when (cs_ship_date_sk - cs_sold_date_sk <= 30 ) then 1 else 0 end) as "30 days"
+ ,sum(case when (cs_ship_date_sk - cs_sold_date_sk > 30) and
+ (cs_ship_date_sk - cs_sold_date_sk <= 60) then 1 else 0 end ) as "31-60 days"
+ ,sum(case when (cs_ship_date_sk - cs_sold_date_sk > 60) and
+ (cs_ship_date_sk - cs_sold_date_sk <= 90) then 1 else 0 end) as "61-90 days"
+ ,sum(case when (cs_ship_date_sk - cs_sold_date_sk > 90) and
+ (cs_ship_date_sk - cs_sold_date_sk <= 120) then 1 else 0 end) as "91-120 days"
+ ,sum(case when (cs_ship_date_sk - cs_sold_date_sk > 120) then 1 else 0 end) as ">120 days"
+from
+ plato.catalog_sales
+ ,plato.warehouse
+ ,plato.ship_mode
+ ,plato.call_center
+ ,plato.date_dim
+where
+ d_month_seq between 1212 and 1212 + 11
+and cs_ship_date_sk = d_date_sk
+and cs_warehouse_sk = w_warehouse_sk
+and cs_ship_mode_sk = sm_ship_mode_sk
+and cs_call_center_sk = cc_call_center_sk
+group by
+ substr(w_warehouse_name,1,20)
+ ,sm_type
+ ,cc_name
+order by substr(w_warehouse_name,1,20)
+ ,sm_type
+ ,cc_name
+limit 100;
+
+-- end query 1 in stream 0 using template ../query_templates/query99.tpl
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/reason.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/reason.txt.attr
new file mode 100644
index 0000000000..fd3f41bb77
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/reason.txt.attr
@@ -0,0 +1,9 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["r_reason_sk";["PgType";"int4";];];
+ ["r_reason_id";["PgType";"text";];];
+ ["r_reason_desc";["PgType";"text";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/ship_mode.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/ship_mode.txt.attr
new file mode 100644
index 0000000000..51e9bb003e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/ship_mode.txt.attr
@@ -0,0 +1,12 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["sm_ship_mode_sk";["PgType";"int4";];];
+ ["sm_ship_mode_id";["PgType";"text";];];
+ ["sm_type";["PgType";"text";];];
+ ["sm_code";["PgType";"text";];];
+ ["sm_carrier";["PgType";"text";];];
+ ["sm_contract";["PgType";"text";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/store.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/store.txt.attr
new file mode 100644
index 0000000000..20fb103d16
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/store.txt.attr
@@ -0,0 +1,35 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["s_store_sk";["PgType";"int4";];];
+ ["s_store_id";["PgType";"text";];];
+ ["s_rec_start_date";["PgType";"date";];];
+ ["s_rec_end_date";["PgType";"date";];];
+ ["s_closed_date_sk";["PgType";"int4";];];
+ ["s_store_name";["PgType";"text";];];
+ ["s_number_employees";["PgType";"int4";];];
+ ["s_floor_space";["PgType";"int4";];];
+ ["s_hours";["PgType";"text";];];
+ ["s_manager";["PgType";"text";];];
+ ["s_market_id";["PgType";"int4";];];
+ ["s_geography_class";["PgType";"text";];];
+ ["s_market_desc";["PgType";"text";];];
+ ["s_market_manager";["PgType";"text";];];
+ ["s_division_id";["PgType";"int4";];];
+ ["s_division_name";["PgType";"text";];];
+ ["s_company_id";["PgType";"int4";];];
+ ["s_company_name";["PgType";"text";];];
+ ["s_street_number";["PgType";"text";];];
+ ["s_street_name";["PgType";"text";];];
+ ["s_street_type";["PgType";"text";];];
+ ["s_suite_number";["PgType";"text";];];
+ ["s_city";["PgType";"text";];];
+ ["s_county";["PgType";"text";];];
+ ["s_state";["PgType";"text";];];
+ ["s_zip";["PgType";"text";];];
+ ["s_country";["PgType";"text";];];
+ ["s_gmt_offset";["PgType";"numeric";];];
+ ["s_tax_precentage";["PgType";"numeric";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/store_returns.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/store_returns.txt.attr
new file mode 100644
index 0000000000..19ce866250
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/store_returns.txt.attr
@@ -0,0 +1,26 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["sr_returned_date_sk";["PgType";"int4";];];
+ ["sr_return_time_sk";["PgType";"int4";];];
+ ["sr_item_sk";["PgType";"int4";];];
+ ["sr_customer_sk";["PgType";"int4";];];
+ ["sr_cdemo_sk";["PgType";"int4";];];
+ ["sr_hdemo_sk";["PgType";"int4";];];
+ ["sr_addr_sk";["PgType";"int4";];];
+ ["sr_store_sk";["PgType";"int4";];];
+ ["sr_reason_sk";["PgType";"int4";];];
+ ["sr_ticket_number";["PgType";"int4";];];
+ ["sr_return_quantity";["PgType";"int4";];];
+ ["sr_return_amt";["PgType";"numeric";];];
+ ["sr_return_tax";["PgType";"numeric";];];
+ ["sr_return_amt_inc_tax";["PgType";"numeric";];];
+ ["sr_fee";["PgType";"numeric";];];
+ ["sr_return_ship_cost";["PgType";"numeric";];];
+ ["sr_refunded_cash";["PgType";"numeric";];];
+ ["sr_reversed_charge";["PgType";"numeric";];];
+ ["sr_store_credit";["PgType";"numeric";];];
+ ["sr_net_loss";["PgType";"numeric";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/store_sales.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/store_sales.txt.attr
new file mode 100644
index 0000000000..16235a21fb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/store_sales.txt.attr
@@ -0,0 +1,29 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["ss_sold_date_sk";["PgType";"int4";];];
+ ["ss_sold_time_sk";["PgType";"int4";];];
+ ["ss_item_sk";["PgType";"int4";];];
+ ["ss_customer_sk";["PgType";"int4";];];
+ ["ss_cdemo_sk";["PgType";"int4";];];
+ ["ss_hdemo_sk";["PgType";"int4";];];
+ ["ss_addr_sk";["PgType";"int4";];];
+ ["ss_store_sk";["PgType";"int4";];];
+ ["ss_promo_sk";["PgType";"int4";];];
+ ["ss_ticket_number";["PgType";"int4";];];
+ ["ss_quantity";["PgType";"int4";];];
+ ["ss_wholesale_cost";["PgType";"numeric";];];
+ ["ss_list_price";["PgType";"numeric";];];
+ ["ss_sales_price";["PgType";"numeric";];];
+ ["ss_ext_discount_amt";["PgType";"numeric";];];
+ ["ss_ext_sales_price";["PgType";"numeric";];];
+ ["ss_ext_wholesale_cost";["PgType";"numeric";];];
+ ["ss_ext_list_price";["PgType";"numeric";];];
+ ["ss_ext_tax";["PgType";"numeric";];];
+ ["ss_coupon_amt";["PgType";"numeric";];];
+ ["ss_net_paid";["PgType";"numeric";];];
+ ["ss_net_paid_inc_tax";["PgType";"numeric";];];
+ ["ss_net_profit";["PgType";"numeric";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/time_dim.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/time_dim.txt.attr
new file mode 100644
index 0000000000..4ce0b9f06d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/time_dim.txt.attr
@@ -0,0 +1,16 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["t_time_sk";["PgType";"int4";];];
+ ["t_time_id";["PgType";"text";];];
+ ["t_time";["PgType";"int4";];];
+ ["t_hour";["PgType";"int4";];];
+ ["t_minute";["PgType";"int4";];];
+ ["t_second";["PgType";"int4";];];
+ ["t_am_pm";["PgType";"text";];];
+ ["t_shift";["PgType";"text";];];
+ ["t_sub_shift";["PgType";"text";];];
+ ["t_meal_time";["PgType";"text";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/warehouse.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/warehouse.txt.attr
new file mode 100644
index 0000000000..1bb8d17441
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/warehouse.txt.attr
@@ -0,0 +1,20 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["w_warehouse_sk";["PgType";"int4";];];
+ ["w_warehouse_id";["PgType";"text";];];
+ ["w_warehouse_name";["PgType";"text";];];
+ ["w_warehouse_sq_ft";["PgType";"int4";];];
+ ["w_street_number";["PgType";"text";];];
+ ["w_street_name";["PgType";"text";];];
+ ["w_street_type";["PgType";"text";];];
+ ["w_suite_number";["PgType";"text";];];
+ ["w_city";["PgType";"text";];];
+ ["w_county";["PgType";"text";];];
+ ["w_state";["PgType";"text";];];
+ ["w_zip";["PgType";"text";];];
+ ["w_country";["PgType";"text";];];
+ ["w_gmt_offset";["PgType";"numeric";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/web_page.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/web_page.txt.attr
new file mode 100644
index 0000000000..627f5e6b90
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/web_page.txt.attr
@@ -0,0 +1,20 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["wp_web_page_sk";["PgType";"int4";];];
+ ["wp_web_page_id";["PgType";"text";];];
+ ["wp_rec_start_date";["PgType";"date";];];
+ ["wp_rec_end_date";["PgType";"date";];];
+ ["wp_creation_date_sk";["PgType";"int4";];];
+ ["wp_access_date_sk";["PgType";"int4";];];
+ ["wp_autogen_flag";["PgType";"text";];];
+ ["wp_customer_sk";["PgType";"int4";];];
+ ["wp_url";["PgType";"text";];];
+ ["wp_type";["PgType";"text";];];
+ ["wp_char_count";["PgType";"int4";];];
+ ["wp_link_count";["PgType";"int4";];];
+ ["wp_image_count";["PgType";"int4";];];
+ ["wp_max_ad_count";["PgType";"int4";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/web_returns.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/web_returns.txt.attr
new file mode 100644
index 0000000000..591d69b136
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/web_returns.txt.attr
@@ -0,0 +1,30 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["wr_returned_date_sk";["PgType";"int4";];];
+ ["wr_returned_time_sk";["PgType";"int4";];];
+ ["wr_item_sk";["PgType";"int4";];];
+ ["wr_refunded_customer_sk";["PgType";"int4";];];
+ ["wr_refunded_cdemo_sk";["PgType";"int4";];];
+ ["wr_refunded_hdemo_sk";["PgType";"int4";];];
+ ["wr_refunded_addr_sk";["PgType";"int4";];];
+ ["wr_returning_customer_sk";["PgType";"int4";];];
+ ["wr_returning_cdemo_sk";["PgType";"int4";];];
+ ["wr_returning_hdemo_sk";["PgType";"int4";];];
+ ["wr_returning_addr_sk";["PgType";"int4";];];
+ ["wr_web_page_sk";["PgType";"int4";];];
+ ["wr_reason_sk";["PgType";"int4";];];
+ ["wr_order_number";["PgType";"int4";];];
+ ["wr_return_quantity";["PgType";"int4";];];
+ ["wr_return_amt";["PgType";"numeric";];];
+ ["wr_return_tax";["PgType";"numeric";];];
+ ["wr_return_amt_inc_tax";["PgType";"numeric";];];
+ ["wr_fee";["PgType";"numeric";];];
+ ["wr_return_ship_cost";["PgType";"numeric";];];
+ ["wr_refunded_cash";["PgType";"numeric";];];
+ ["wr_reversed_charge";["PgType";"numeric";];];
+ ["wr_account_credit";["PgType";"numeric";];];
+ ["wr_net_loss";["PgType";"numeric";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/web_sales.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/web_sales.txt.attr
new file mode 100644
index 0000000000..7a4c5dda75
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/web_sales.txt.attr
@@ -0,0 +1,40 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["ws_sold_date_sk";["PgType";"int4";];];
+ ["ws_sold_time_sk";["PgType";"int4";];];
+ ["ws_ship_date_sk";["PgType";"int4";];];
+ ["ws_item_sk";["PgType";"int4";];];
+ ["ws_bill_customer_sk";["PgType";"int4";];];
+ ["ws_bill_cdemo_sk";["PgType";"int4";];];
+ ["ws_bill_hdemo_sk";["PgType";"int4";];];
+ ["ws_bill_addr_sk";["PgType";"int4";];];
+ ["ws_ship_customer_sk";["PgType";"int4";];];
+ ["ws_ship_cdemo_sk";["PgType";"int4";];];
+ ["ws_ship_hdemo_sk";["PgType";"int4";];];
+ ["ws_ship_addr_sk";["PgType";"int4";];];
+ ["ws_web_page_sk";["PgType";"int4";];];
+ ["ws_web_site_sk";["PgType";"int4";];];
+ ["ws_ship_mode_sk";["PgType";"int4";];];
+ ["ws_warehouse_sk";["PgType";"int4";];];
+ ["ws_promo_sk";["PgType";"int4";];];
+ ["ws_order_number";["PgType";"int4";];];
+ ["ws_quantity";["PgType";"int4";];];
+ ["ws_wholesale_cost";["PgType";"numeric";];];
+ ["ws_list_price";["PgType";"numeric";];];
+ ["ws_sales_price";["PgType";"numeric";];];
+ ["ws_ext_discount_amt";["PgType";"numeric";];];
+ ["ws_ext_sales_price";["PgType";"numeric";];];
+ ["ws_ext_wholesale_cost";["PgType";"numeric";];];
+ ["ws_ext_list_price";["PgType";"numeric";];];
+ ["ws_ext_tax";["PgType";"numeric";];];
+ ["ws_coupon_amt";["PgType";"numeric";];];
+ ["ws_ext_ship_cost";["PgType";"numeric";];];
+ ["ws_net_paid";["PgType";"numeric";];];
+ ["ws_net_paid_inc_tax";["PgType";"numeric";];];
+ ["ws_net_paid_inc_ship";["PgType";"numeric";];];
+ ["ws_net_paid_inc_ship_tax";["PgType";"numeric";];];
+ ["ws_net_profit";["PgType";"numeric";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpcds/web_site.txt.attr b/yt/yql/tests/sql/suites/pg-tpcds/web_site.txt.attr
new file mode 100644
index 0000000000..9244afbf49
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpcds/web_site.txt.attr
@@ -0,0 +1,32 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["web_site_sk";["PgType";"int4";];];
+ ["web_site_id";["PgType";"text";];];
+ ["web_rec_start_date";["PgType";"date";];];
+ ["web_rec_end_date";["PgType";"date";];];
+ ["web_name";["PgType";"text";];];
+ ["web_open_date_sk";["PgType";"int4";];];
+ ["web_close_date_sk";["PgType";"int4";];];
+ ["web_class";["PgType";"text";];];
+ ["web_manager";["PgType";"text";];];
+ ["web_mkt_id";["PgType";"int4";];];
+ ["web_mkt_class";["PgType";"text";];];
+ ["web_mkt_desc";["PgType";"text";];];
+ ["web_market_manager";["PgType";"text";];];
+ ["web_company_id";["PgType";"int4";];];
+ ["web_company_name";["PgType";"text";];];
+ ["web_street_number";["PgType";"text";];];
+ ["web_street_name";["PgType";"text";];];
+ ["web_street_type";["PgType";"text";];];
+ ["web_suite_number";["PgType";"text";];];
+ ["web_city";["PgType";"text";];];
+ ["web_county";["PgType";"text";];];
+ ["web_state";["PgType";"text";];];
+ ["web_zip";["PgType";"text";];];
+ ["web_country";["PgType";"text";];];
+ ["web_gmt_offset";["PgType";"numeric";];];
+ ["web_tax_percentage";["PgType";"numeric";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpch/customer.txt.attr b/yt/yql/tests/sql/suites/pg-tpch/customer.txt.attr
new file mode 100644
index 0000000000..858a12536d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/customer.txt.attr
@@ -0,0 +1,14 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["c_custkey";["PgType";"int4";];];
+ ["c_name";["PgType";"text";];];
+ ["c_address";["PgType";"text";];];
+ ["c_nationkey";["PgType";"int4";];];
+ ["c_phone";["PgType";"text";];];
+ ["c_acctbal";["PgType";"numeric";];];
+ ["c_mktsegment";["PgType";"text";];];
+ ["c_comment";["PgType";"text";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpch/default.cfg b/yt/yql/tests/sql/suites/pg-tpch/default.cfg
new file mode 100644
index 0000000000..f3c9624348
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/default.cfg
@@ -0,0 +1,8 @@
+in customer customer.txt
+in lineitem lineitem.txt
+in nation nation.txt
+in orders orders.txt
+in part part.txt
+in partsupp partsupp.txt
+in region region.txt
+in supplier supplier.txt
diff --git a/yt/yql/tests/sql/suites/pg-tpch/lineitem.txt.attr b/yt/yql/tests/sql/suites/pg-tpch/lineitem.txt.attr
new file mode 100644
index 0000000000..f6de3aba92
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/lineitem.txt.attr
@@ -0,0 +1,22 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["l_orderkey";["PgType";"int4";];];
+ ["l_partkey";["PgType";"int4";];];
+ ["l_suppkey";["PgType";"int4";];];
+ ["l_linenumber";["PgType";"int4";];];
+ ["l_quantity";["PgType";"numeric";];];
+ ["l_extendedprice";["PgType";"numeric";];];
+ ["l_discount";["PgType";"numeric";];];
+ ["l_tax";["PgType";"numeric";];];
+ ["l_returnflag";["PgType";"text";];];
+ ["l_linestatus";["PgType";"text";];];
+ ["l_shipdate";["PgType";"date";];];
+ ["l_commitdate";["PgType";"date";];];
+ ["l_receiptdate";["PgType";"date";];];
+ ["l_shipinstruct";["PgType";"text";];];
+ ["l_shipmode";["PgType";"text";];];
+ ["l_comment";["PgType";"text";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpch/nation.txt.attr b/yt/yql/tests/sql/suites/pg-tpch/nation.txt.attr
new file mode 100644
index 0000000000..984875af2b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/nation.txt.attr
@@ -0,0 +1,10 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["n_nationkey";["PgType";"int4";];];
+ ["n_name";["PgType";"text";];];
+ ["n_regionkey";["PgType";"int4";];];
+ ["n_comment";["PgType";"text";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpch/orders.txt.attr b/yt/yql/tests/sql/suites/pg-tpch/orders.txt.attr
new file mode 100644
index 0000000000..dc3829bfe4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/orders.txt.attr
@@ -0,0 +1,15 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["o_orderkey";["PgType";"int4";];];
+ ["o_custkey";["PgType";"int4";];];
+ ["o_orderstatus";["PgType";"text";];];
+ ["o_totalprice";["PgType";"numeric";];];
+ ["o_orderdate";["PgType";"date";];];
+ ["o_orderpriority";["PgType";"text";];];
+ ["o_clerk";["PgType";"text";];];
+ ["o_shippriority";["PgType";"int4";];];
+ ["o_comment";["PgType";"text";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpch/part.txt.attr b/yt/yql/tests/sql/suites/pg-tpch/part.txt.attr
new file mode 100644
index 0000000000..c4d0a973fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/part.txt.attr
@@ -0,0 +1,15 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["p_partkey";["PgType";"int4";];];
+ ["p_name";["PgType";"text";];];
+ ["p_mfgr";["PgType";"text";];];
+ ["p_brand";["PgType";"text";];];
+ ["p_type";["PgType";"text";];];
+ ["p_size";["PgType";"int4";];];
+ ["p_container";["PgType";"text";];];
+ ["p_retailprice";["PgType";"numeric";];];
+ ["p_comment";["PgType";"text";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpch/partsupp.txt.attr b/yt/yql/tests/sql/suites/pg-tpch/partsupp.txt.attr
new file mode 100644
index 0000000000..7e6a2bd73c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/partsupp.txt.attr
@@ -0,0 +1,11 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["ps_partkey";["PgType";"int4";];];
+ ["ps_suppkey";["PgType";"int4";];];
+ ["ps_availqty";["PgType";"int4";];];
+ ["ps_supplycost";["PgType";"numeric";];];
+ ["ps_comment";["PgType";"text";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q01.sql b/yt/yql/tests/sql/suites/pg-tpch/q01.sql
new file mode 100644
index 0000000000..7198f496bc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q01.sql
@@ -0,0 +1,25 @@
+--!syntax_pg
+--TPC-H Q1
+
+
+select
+l_returnflag,
+l_linestatus,
+sum(l_quantity) as sum_qty,
+sum(l_extendedprice) as sum_base_price,
+sum(l_extendedprice*(1::numeric-l_discount)) as sum_disc_price,
+sum(l_extendedprice*(1::numeric-l_discount)*(1::numeric+l_tax)) as sum_charge,
+avg(l_quantity) as avg_qty,
+avg(l_extendedprice) as avg_price,
+avg(l_discount) as avg_disc,
+count(*) as count_order
+from
+plato."lineitem"
+where
+l_shipdate <= date '1998-12-01' - interval '90' day
+group by
+l_returnflag,
+l_linestatus
+order by
+l_returnflag,
+l_linestatus;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q02.sql b/yt/yql/tests/sql/suites/pg-tpch/q02.sql
new file mode 100644
index 0000000000..91349256c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q02.sql
@@ -0,0 +1,49 @@
+--!syntax_pg
+--ignore runonopt plan diff
+--TPC-H Q2
+
+
+select
+s_acctbal,
+s_name,
+n_name,
+p_partkey,
+p_mfgr,
+s_address,
+s_phone,
+s_comment
+from
+plato."part",
+plato."supplier",
+plato."partsupp",
+plato."nation",
+plato."region"
+where
+p_partkey = ps_partkey
+and s_suppkey = ps_suppkey
+and p_size = 15
+and p_type like '%BRASS'
+and s_nationkey = n_nationkey
+and n_regionkey = r_regionkey
+and r_name = 'EUROPE'
+and ps_supplycost = (
+select
+min(ps_supplycost)
+from
+plato."partsupp",
+plato."supplier",
+plato."nation",
+plato."region"
+where
+p_partkey = ps_partkey
+and s_suppkey = ps_suppkey
+and s_nationkey = n_nationkey
+and n_regionkey = r_regionkey
+and r_name = 'EUROPE'
+)
+order by
+s_acctbal desc,
+n_name,
+s_name,
+p_partkey
+limit 100;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q03.sql b/yt/yql/tests/sql/suites/pg-tpch/q03.sql
new file mode 100644
index 0000000000..fd34b86d2b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q03.sql
@@ -0,0 +1,27 @@
+--!syntax_pg
+--TPC-H Q3
+
+
+select
+l_orderkey,
+sum(l_extendedprice*(1::numeric-l_discount)) as revenue,
+o_orderdate,
+o_shippriority
+from
+plato."customer",
+plato."orders",
+plato."lineitem"
+where
+c_mktsegment = 'BUILDING'
+and c_custkey = o_custkey
+and l_orderkey = o_orderkey
+and o_orderdate < date '1995-03-15'
+and l_shipdate > date '1995-03-15'
+group by
+l_orderkey,
+o_orderdate,
+o_shippriority
+order by
+revenue desc,
+o_orderdate
+limit 10;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q04.sql b/yt/yql/tests/sql/suites/pg-tpch/q04.sql
new file mode 100644
index 0000000000..40718918ee
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q04.sql
@@ -0,0 +1,26 @@
+--!syntax_pg
+--ignore runonopt plan diff
+--TPC-H Q4
+
+
+select
+o_orderpriority,
+count(*) as order_count
+from
+plato."orders"
+where
+o_orderdate >= date '1993-07-01'
+and o_orderdate < date '1993-07-01' + interval '3' month
+and exists (
+select
+*
+from
+plato."lineitem"
+where
+l_orderkey = o_orderkey
+and l_commitdate < l_receiptdate
+)
+group by
+o_orderpriority
+order by
+o_orderpriority;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q05.sql b/yt/yql/tests/sql/suites/pg-tpch/q05.sql
new file mode 100644
index 0000000000..089c838380
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q05.sql
@@ -0,0 +1,28 @@
+--!syntax_pg
+--TPC-H Q5
+
+
+select
+n_name,
+sum(l_extendedprice * (1::numeric - l_discount)) as revenue
+from
+plato."customer",
+plato."orders",
+plato."lineitem",
+plato."supplier",
+plato."nation",
+plato."region"
+where
+c_custkey = o_custkey
+and l_orderkey = o_orderkey
+and l_suppkey = s_suppkey
+and c_nationkey = s_nationkey
+and s_nationkey = n_nationkey
+and n_regionkey = r_regionkey
+and r_name = 'ASIA'
+and o_orderdate >= date '1994-01-01'
+and o_orderdate < date '1994-01-01' + interval '1' year
+group by
+n_name
+order by
+revenue desc;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q06.sql b/yt/yql/tests/sql/suites/pg-tpch/q06.sql
new file mode 100644
index 0000000000..4f6c0b039b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q06.sql
@@ -0,0 +1,13 @@
+--!syntax_pg
+--TPC-H Q6
+
+
+select
+sum(l_extendedprice*l_discount) as revenue
+from
+plato."lineitem"
+where
+l_shipdate >= date '1994-01-01'
+and l_shipdate < date '1994-01-01' + interval '1' year
+and l_discount between (0.06 - 0.01)::numeric and (0.06 + 0.01)::numeric
+and l_quantity < 24::numeric;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q07.sql b/yt/yql/tests/sql/suites/pg-tpch/q07.sql
new file mode 100644
index 0000000000..8f1c30e994
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q07.sql
@@ -0,0 +1,41 @@
+--!syntax_pg
+--TPC-H Q7
+
+
+select
+supp_nation,
+cust_nation,
+l_year, sum(volume) as revenue
+from (
+select
+n1.n_name as supp_nation,
+n2.n_name as cust_nation,
+extract(year from l_shipdate) as l_year,
+l_extendedprice * (1::numeric - l_discount) as volume
+from
+plato."supplier",
+plato."lineitem",
+plato."orders",
+plato."customer",
+plato."nation" n1,
+plato."nation" n2
+where
+s_suppkey = l_suppkey
+and o_orderkey = l_orderkey
+and c_custkey = o_custkey
+and s_nationkey = n1.n_nationkey
+and c_nationkey = n2.n_nationkey
+and (
+(n1.n_name = 'FRANCE' and n2.n_name = 'GERMANY')
+or (n1.n_name = 'GERMANY' and n2.n_name = 'FRANCE')
+)
+and l_shipdate between date '1995-01-01' and date '1996-12-31'
+) as shipping
+group by
+supp_nation,
+cust_nation,
+l_year
+order by
+supp_nation,
+cust_nation,
+l_year;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q08.sql b/yt/yql/tests/sql/suites/pg-tpch/q08.sql
new file mode 100644
index 0000000000..bd31d2dde4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q08.sql
@@ -0,0 +1,41 @@
+--!syntax_pg
+--TPC-H Q8
+
+
+select
+o_year,
+sum(case
+when nation = 'BRAZIL'
+then volume
+else 0::numeric
+end) / (sum(volume) + 1e-12::numeric) as mkt_share
+from (
+select
+extract(year from o_orderdate) as o_year,
+l_extendedprice * (1::numeric-l_discount) as volume,
+n2.n_name as nation
+from
+plato."part",
+plato."supplier",
+plato."lineitem",
+plato."orders",
+plato."customer",
+plato."nation" n1,
+plato."nation" n2,
+plato."region"
+where
+p_partkey = l_partkey
+and s_suppkey = l_suppkey
+and l_orderkey = o_orderkey
+and o_custkey = c_custkey
+and c_nationkey = n1.n_nationkey
+and n1.n_regionkey = r_regionkey
+and r_name = 'AMERICA'
+and s_nationkey = n2.n_nationkey
+and o_orderdate between date '1995-01-01' and date '1996-12-31'
+and p_type = 'ECONOMY ANODIZED STEEL'
+) as all_nations
+group by
+o_year
+order by
+o_year;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q09.sql b/yt/yql/tests/sql/suites/pg-tpch/q09.sql
new file mode 100644
index 0000000000..7db204c44f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q09.sql
@@ -0,0 +1,35 @@
+--!syntax_pg
+--TPC-H Q9
+
+
+select
+nation,
+o_year,
+sum(amount) as sum_profit
+from (
+select
+n_name as nation,
+extract(year from o_orderdate) as o_year,
+l_extendedprice * (1::numeric - l_discount) - ps_supplycost * l_quantity as amount
+from
+plato."part",
+plato."supplier",
+plato."lineitem",
+plato."partsupp",
+plato."orders",
+plato."nation"
+where
+s_suppkey = l_suppkey
+and ps_suppkey = l_suppkey
+and ps_partkey = l_partkey
+and p_partkey = l_partkey
+and o_orderkey = l_orderkey
+and s_nationkey = n_nationkey
+and p_name like '%green%'
+) as profit
+group by
+nation,
+o_year
+order by
+nation,
+o_year desc;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q10.sql b/yt/yql/tests/sql/suites/pg-tpch/q10.sql
new file mode 100644
index 0000000000..e331135e3b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q10.sql
@@ -0,0 +1,36 @@
+--!syntax_pg
+--TPC-H Q10
+
+
+select
+c_custkey,
+c_name,
+sum(l_extendedprice * (1::numeric - l_discount)) as revenue,
+c_acctbal,
+n_name,
+c_address,
+c_phone,
+c_comment
+from
+plato."customer",
+plato."orders",
+plato."lineitem",
+plato."nation"
+where
+c_custkey = o_custkey
+and l_orderkey = o_orderkey
+and o_orderdate >= date '1993-10-01'
+and o_orderdate < date '1993-10-01' + interval '3' month
+and l_returnflag = 'R'
+and c_nationkey = n_nationkey
+group by
+c_custkey,
+c_name,
+c_acctbal,
+c_phone,
+n_name,
+c_address,
+c_comment
+order by
+revenue desc
+limit 20;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q11.sql b/yt/yql/tests/sql/suites/pg-tpch/q11.sql
new file mode 100644
index 0000000000..f61ddbb957
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q11.sql
@@ -0,0 +1,32 @@
+--!syntax_pg
+--TPC-H Q11
+-- ignore runonopt plan diff
+
+
+select
+ps_partkey,
+sum(ps_supplycost * ps_availqty::numeric) as value
+from
+plato."partsupp",
+plato."supplier",
+plato."nation"
+where
+ps_suppkey = s_suppkey
+and s_nationkey = n_nationkey
+and n_name = 'GERMANY'
+group by
+ps_partkey having
+sum(ps_supplycost * ps_availqty::numeric) > (
+select
+sum(ps_supplycost * ps_availqty::numeric) * 0.0001::numeric
+from
+plato."partsupp",
+plato."supplier",
+plato."nation"
+where
+ps_suppkey = s_suppkey
+and s_nationkey = n_nationkey
+and n_name = 'GERMANY'
+)
+order by
+value desc;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q12.sql b/yt/yql/tests/sql/suites/pg-tpch/q12.sql
new file mode 100644
index 0000000000..bf38bc5e83
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q12.sql
@@ -0,0 +1,32 @@
+--!syntax_pg
+--TPC-H Q12
+
+
+select
+l_shipmode,
+sum(case
+when o_orderpriority ='1-URGENT'
+or o_orderpriority ='2-HIGH'
+then 1
+else 0
+end) as high_line_count,
+sum(case
+when o_orderpriority <> '1-URGENT'
+and o_orderpriority <> '2-HIGH'
+then 1
+else 0
+end) as low_line_count
+from
+plato."orders",
+plato."lineitem"
+where
+o_orderkey = l_orderkey
+and l_shipmode in ('MAIL', 'SHIP')
+and l_commitdate < l_receiptdate
+and l_shipdate < l_commitdate
+and l_receiptdate >= date '1994-01-01'
+and l_receiptdate < date '1994-01-01' + interval '1' year
+group by
+l_shipmode
+order by
+l_shipmode;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q13.sql b/yt/yql/tests/sql/suites/pg-tpch/q13.sql
new file mode 100644
index 0000000000..97848f0b9b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q13.sql
@@ -0,0 +1,25 @@
+--!syntax_pg
+--TPC-H Q13
+
+
+select
+c_count, count(*) as custdist
+from (
+select
+c_custkey,
+count(o_orderkey)
+from
+plato."customer"
+left outer join
+plato."orders"
+on
+c_custkey = o_custkey
+and o_comment not like '%special%requests%'
+group by
+c_custkey
+)as c_orders (c_custkey, c_count)
+group by
+c_count
+order by
+custdist desc,
+c_count desc;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q14.sql b/yt/yql/tests/sql/suites/pg-tpch/q14.sql
new file mode 100644
index 0000000000..e515a5d480
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q14.sql
@@ -0,0 +1,17 @@
+--!syntax_pg
+--TPC-H Q14
+
+
+select
+100.00::numeric * sum(case
+when p_type like 'PROMO%'
+then l_extendedprice*(1::numeric-l_discount)
+else 0::numeric
+end) / (sum(l_extendedprice * (1::numeric - l_discount)) + 1e-12::numeric) as promo_revenue
+from
+plato."lineitem",
+plato."part"
+where
+l_partkey = p_partkey
+and l_shipdate >= date '1995-09-01'
+and l_shipdate < date '1995-09-01' + interval '1' month;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q15.sql b/yt/yql/tests/sql/suites/pg-tpch/q15.sql
new file mode 100644
index 0000000000..729fd88641
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q15.sql
@@ -0,0 +1,36 @@
+--!syntax_pg
+--ignore runonopt plan diff
+--TPC-H Q15
+
+
+create view revenue_STREAM_ID (supplier_no, total_revenue) as
+select
+l_suppkey,
+sum(l_extendedprice * (1::numeric - l_discount))
+from
+plato."lineitem"
+where
+l_shipdate >= date '1996-01-01'
+and l_shipdate < date '1996-01-01' + interval '3' month
+group by
+l_suppkey;
+select
+s_suppkey,
+s_name,
+s_address,
+s_phone,
+total_revenue
+from
+plato."supplier",
+revenue_STREAM_ID
+where
+s_suppkey = supplier_no
+and total_revenue = (
+select
+max(total_revenue)
+from
+revenue_STREAM_ID
+)
+order by
+s_suppkey;
+drop view revenue_STREAM_ID;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q16.sql b/yt/yql/tests/sql/suites/pg-tpch/q16.sql
new file mode 100644
index 0000000000..7df4f54439
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q16.sql
@@ -0,0 +1,34 @@
+--!syntax_pg
+--TPC-H Q16
+
+
+select
+p_brand,
+p_type,
+p_size,
+count(distinct ps_suppkey) as supplier_cnt
+from
+plato."partsupp",
+plato."part"
+where
+p_partkey = ps_partkey
+and p_brand <> 'Brand#45'
+and p_type not like 'MEDIUM POLISHED%'
+and p_size in (49, 14, 23, 45, 19, 3, 36, 9)
+and ps_suppkey not in (
+select
+s_suppkey
+from
+plato."supplier"
+where
+s_comment like '%Customer%Complaints%'
+)
+group by
+p_brand,
+p_type,
+p_size
+order by
+supplier_cnt desc,
+p_brand,
+p_type,
+p_size;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q17.sql b/yt/yql/tests/sql/suites/pg-tpch/q17.sql
new file mode 100644
index 0000000000..e893138f09
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q17.sql
@@ -0,0 +1,22 @@
+--!syntax_pg
+--ignore runonopt plan diff
+--TPC-H Q17
+
+
+select
+sum(l_extendedprice) / 7.0::numeric as avg_yearly
+from
+plato."lineitem",
+plato."part"
+where
+p_partkey = l_partkey
+and p_brand = 'Brand#23'
+and p_container = 'MED BOX'
+and l_quantity < (
+select
+0.2::numeric * avg(l_quantity)
+from
+plato."lineitem"
+where
+l_partkey = p_partkey
+);
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q18.sql b/yt/yql/tests/sql/suites/pg-tpch/q18.sql
new file mode 100644
index 0000000000..0c32891237
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q18.sql
@@ -0,0 +1,38 @@
+--!syntax_pg
+--ignore runonopt plan diff
+--TPC-H Q18
+
+
+select
+c_name,
+c_custkey,
+o_orderkey,
+o_orderdate,
+o_totalprice,
+sum(l_quantity)
+from
+plato."customer",
+plato."orders",
+plato."lineitem"
+where
+o_orderkey in (
+select
+l_orderkey
+from
+plato."lineitem"
+group by
+l_orderkey having
+sum(l_quantity) > 300::numeric
+)
+and c_custkey = o_custkey
+and o_orderkey = l_orderkey
+group by
+c_name,
+c_custkey,
+o_orderkey,
+o_orderdate,
+o_totalprice
+order by
+o_totalprice desc,
+o_orderdate
+limit 100;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q19.sql b/yt/yql/tests/sql/suites/pg-tpch/q19.sql
new file mode 100644
index 0000000000..5eb0799774
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q19.sql
@@ -0,0 +1,39 @@
+--!syntax_pg
+--TPC-H Q19
+
+
+select
+sum(l_extendedprice * (1::numeric - l_discount) ) as revenue
+from
+plato."lineitem",
+plato."part"
+where
+(
+p_partkey = l_partkey
+and p_brand = 'Brand#12'
+and p_container in ( 'SM CASE', 'SM BOX', 'SM PACK', 'SM PKG')
+and l_quantity >= 1::numeric and l_quantity <= (1 + 10)::numeric
+and p_size between 1 and 5
+and l_shipmode in ('AIR', 'AIR REG')
+and l_shipinstruct = 'DELIVER IN PERSON'
+)
+or
+(
+p_partkey = l_partkey
+and p_brand = 'Brand#23'
+and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK')
+and l_quantity >= 10::numeric and l_quantity <= (10 + 10)::numeric
+and p_size between 1 and 10
+and l_shipmode in ('AIR', 'AIR REG')
+and l_shipinstruct = 'DELIVER IN PERSON'
+)
+or
+(
+p_partkey = l_partkey
+and p_brand = 'Brand#34'
+and p_container in ( 'LG CASE', 'LG BOX', 'LG PACK', 'LG PKG')
+and l_quantity >= 20::numeric and l_quantity <= (20 + 10)::numeric
+and p_size between 1 and 15
+and l_shipmode in ('AIR', 'AIR REG')
+and l_shipinstruct = 'DELIVER IN PERSON'
+);
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q20.sql b/yt/yql/tests/sql/suites/pg-tpch/q20.sql
new file mode 100644
index 0000000000..fdb34b62f1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q20.sql
@@ -0,0 +1,41 @@
+--!syntax_pg
+--TPC-H Q20
+
+
+select
+s_name,
+s_address
+from
+plato."supplier",
+plato."nation"
+where
+s_suppkey in (
+select
+ps_suppkey
+from
+plato."partsupp"
+where
+ps_partkey in (
+select
+p_partkey
+from
+plato."part"
+where
+p_name like 'forest%'
+)
+and ps_availqty::numeric > (
+select
+0.5::numeric * sum(l_quantity)
+from
+plato."lineitem"
+where
+l_partkey = ps_partkey
+and l_suppkey = ps_suppkey
+and l_shipdate >= '1994-01-01'::date
+and l_shipdate < '1994-01-01'::date + interval '1' year
+)
+)
+and s_nationkey = n_nationkey
+and n_name = 'CANADA'
+order by
+s_name;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q21.sql b/yt/yql/tests/sql/suites/pg-tpch/q21.sql
new file mode 100644
index 0000000000..acd5bf4bb1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q21.sql
@@ -0,0 +1,44 @@
+--!syntax_pg
+--TPC-H Q21
+
+
+select
+s_name,
+count(*) as numwait
+from
+plato."supplier",
+plato."lineitem" l1,
+plato."orders",
+plato."nation"
+where
+s_suppkey = l1.l_suppkey
+and o_orderkey = l1.l_orderkey
+and o_orderstatus = 'F'
+and l1.l_receiptdate > l1.l_commitdate
+and exists (
+select
+*
+from
+plato."lineitem" l2
+where
+l2.l_orderkey = l1.l_orderkey
+and l2.l_suppkey <> l1.l_suppkey
+)
+and not exists (
+select
+*
+from
+plato."lineitem" l3
+where
+l3.l_orderkey = l1.l_orderkey
+and l3.l_suppkey <> l1.l_suppkey
+and l3.l_receiptdate > l3.l_commitdate
+)
+and s_nationkey = n_nationkey
+and n_name = 'SAUDI ARABIA'
+group by
+s_name
+order by
+numwait desc,
+s_name
+limit 100;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/q22.sql b/yt/yql/tests/sql/suites/pg-tpch/q22.sql
new file mode 100644
index 0000000000..80a89442ef
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/q22.sql
@@ -0,0 +1,40 @@
+--!syntax_pg
+--TPC-H Q22
+
+
+select
+cntrycode,
+count(*) as numcust,
+sum(c_acctbal) as totacctbal
+from (
+select
+substring(c_phone from 1 for 2) as cntrycode,
+c_acctbal
+from
+plato."customer"
+where
+substring(c_phone from 1 for 2) in
+('13','31','23','29','30','18','17')
+and c_acctbal > (
+select
+avg(c_acctbal)
+from
+plato."customer"
+where
+c_acctbal > 0.00::numeric
+and substring (c_phone from 1 for 2) in
+('13','31','23','29','30','18','17')
+)
+and not exists (
+select
+*
+from
+plato."orders"
+where
+o_custkey = c_custkey
+)
+) as custsale
+group by
+cntrycode
+order by
+cntrycode;
diff --git a/yt/yql/tests/sql/suites/pg-tpch/region.txt.attr b/yt/yql/tests/sql/suites/pg-tpch/region.txt.attr
new file mode 100644
index 0000000000..3c92a439ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/region.txt.attr
@@ -0,0 +1,9 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["r_regionkey";["PgType";"int4";];];
+ ["r_name";["PgType";"text";];];
+ ["r_comment";["PgType";"text";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg-tpch/supplier.txt.attr b/yt/yql/tests/sql/suites/pg-tpch/supplier.txt.attr
new file mode 100644
index 0000000000..610ac95a35
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg-tpch/supplier.txt.attr
@@ -0,0 +1,13 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["s_suppkey";["PgType";"int4";];];
+ ["s_name";["PgType";"text";];];
+ ["s_address";["PgType";"text";];];
+ ["s_nationkey";["PgType";"int4";];];
+ ["s_phone";["PgType";"text";];];
+ ["s_acctbal";["PgType";"numeric";];];
+ ["s_comment";["PgType";"text";];];
+ ];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg/aggregate_combine.cfg b/yt/yql/tests/sql/suites/pg/aggregate_combine.cfg
new file mode 100644
index 0000000000..e377e2a9ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/aggregate_combine.cfg
@@ -0,0 +1 @@
+in Input3 input3.txt
diff --git a/yt/yql/tests/sql/suites/pg/aggregate_combine.sql b/yt/yql/tests/sql/suites/pg/aggregate_combine.sql
new file mode 100644
index 0000000000..2aaccbf7ce
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/aggregate_combine.sql
@@ -0,0 +1,4 @@
+--!syntax_pg
+select value,avg(key::int8)
+from plato."Input3"
+group by value
diff --git a/yt/yql/tests/sql/suites/pg/aggregate_combine_all.cfg b/yt/yql/tests/sql/suites/pg/aggregate_combine_all.cfg
new file mode 100644
index 0000000000..e377e2a9ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/aggregate_combine_all.cfg
@@ -0,0 +1 @@
+in Input3 input3.txt
diff --git a/yt/yql/tests/sql/suites/pg/aggregate_combine_all.sql b/yt/yql/tests/sql/suites/pg/aggregate_combine_all.sql
new file mode 100644
index 0000000000..4c2def72ab
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/aggregate_combine_all.sql
@@ -0,0 +1,3 @@
+--!syntax_pg
+select avg(key::int8)
+from plato."Input3"
diff --git a/yt/yql/tests/sql/suites/pg/aggregate_minus_zero.cfg b/yt/yql/tests/sql/suites/pg/aggregate_minus_zero.cfg
new file mode 100644
index 0000000000..0cdbb201f7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/aggregate_minus_zero.cfg
@@ -0,0 +1 @@
+in InputZ inputZ.txt
diff --git a/yt/yql/tests/sql/suites/pg/aggregate_minus_zero.sql b/yt/yql/tests/sql/suites/pg/aggregate_minus_zero.sql
new file mode 100644
index 0000000000..b4738cf99c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/aggregate_minus_zero.sql
@@ -0,0 +1,6 @@
+--!syntax_pg
+select x, count(*)
+from (
+select f::float8 as x from plato."InputZ"
+) a
+group by x
diff --git a/yt/yql/tests/sql/suites/pg/all_data.cfg b/yt/yql/tests/sql/suites/pg/all_data.cfg
new file mode 100644
index 0000000000..5b191b093d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/all_data.cfg
@@ -0,0 +1 @@
+in Input all_data.txt
diff --git a/yt/yql/tests/sql/suites/pg/all_data.sql b/yt/yql/tests/sql/suites/pg/all_data.sql
new file mode 100644
index 0000000000..cab5016734
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/all_data.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select * from plato."Input";
diff --git a/yt/yql/tests/sql/suites/pg/all_data.txt.attr b/yt/yql/tests/sql/suites/pg/all_data.txt.attr
new file mode 100644
index 0000000000..f2e081cdfe
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/all_data.txt.attr
@@ -0,0 +1,35 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["Bool";["OptionalType";["DataType";"Bool"]]];
+ ["Int8";["OptionalType";["DataType";"Int8"]]];
+ ["Uint8";["OptionalType";["DataType";"Uint8"]]];
+ ["Int16";["OptionalType";["DataType";"Int16"]]];
+ ["Uint16";["OptionalType";["DataType";"Uint16"]]];
+ ["Int32";["OptionalType";["DataType";"Int32"]]];
+ ["Uint32";["OptionalType";["DataType";"Uint32"]]];
+ ["Int64";["OptionalType";["DataType";"Int64"]]];
+ ["Uint64";["OptionalType";["DataType";"Uint64"]]];
+ ["Double";["OptionalType";["DataType";"Double"]]];
+ ["Float";["OptionalType";["DataType";"Float"]]];
+ ["String";["OptionalType";["DataType";"String"]]];
+ ["Utf8";["OptionalType";["DataType";"Utf8"]]];
+ ["Yson";["OptionalType";["DataType";"Yson"]]];
+ ["Json";["OptionalType";["DataType";"Json"]]];
+ ["Uuid";["OptionalType";["DataType";"Uuid"]]];
+ ["Date";["OptionalType";["DataType";"Date"]]];
+ ["Datetime";["OptionalType";["DataType";"Datetime"]]];
+ ["Timestamp";["OptionalType";["DataType";"Timestamp"]]];
+ ["Interval";["OptionalType";["DataType";"Interval"]]];
+ ["TzDate";["OptionalType";["DataType";"TzDate"]]];
+ ["TzDatetime";["OptionalType";["DataType";"TzDatetime"]]];
+ ["TzTimestamp";["OptionalType";["DataType";"TzTimestamp"]]];
+ ["Decimal";["OptionalType";["DataType";"Decimal";"10";"1"]]];
+ ["DyNumber";["OptionalType";["DataType";"DyNumber"]]];
+ ["JsonDocument";["OptionalType";["DataType";"JsonDocument"]]];
+ ["Date32";["OptionalType";["DataType";"Date32"]]];
+ ["Datetime64";["OptionalType";["DataType";"Datetime64"]]];
+ ["Timestamp64";["OptionalType";["DataType";"Timestamp64"]]];
+ ["Interval64";["OptionalType";["DataType";"Interval64"]]];
+ ]];
+}}
+
diff --git a/yt/yql/tests/sql/suites/pg/default.cfg b/yt/yql/tests/sql/suites/pg/default.cfg
new file mode 100644
index 0000000000..1e0c12cac0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/default.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+in Input2 input2.txt
+in Input5 input5.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/pg/doubles_search_path.sql b/yt/yql/tests/sql/suites/pg/doubles_search_path.sql
new file mode 100644
index 0000000000..f35d89bdca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/doubles_search_path.sql
@@ -0,0 +1,3 @@
+--!syntax_pg
+SET search_path = "public", public;
+select count(*) from plato."Input";
diff --git a/yt/yql/tests/sql/suites/pg/drop_table.cfg b/yt/yql/tests/sql/suites/pg/drop_table.cfg
new file mode 100644
index 0000000000..9b85bd0ae8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/drop_table.cfg
@@ -0,0 +1 @@
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/pg/drop_table.sql b/yt/yql/tests/sql/suites/pg/drop_table.sql
new file mode 100644
index 0000000000..7a3549cd75
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/drop_table.sql
@@ -0,0 +1,17 @@
+--!syntax_pg
+
+insert into plato."Output"
+SELECT 1;
+
+commit;
+
+drop table plato."Output";
+
+commit;
+
+insert into plato."Output"
+SELECT 'foo';
+
+commit;
+
+drop table plato."Output";
diff --git a/yt/yql/tests/sql/suites/pg/in_mixed.cfg b/yt/yql/tests/sql/suites/pg/in_mixed.cfg
new file mode 100644
index 0000000000..0ca1ef5bf1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/in_mixed.cfg
@@ -0,0 +1 @@
+in Input input_name.txt
diff --git a/yt/yql/tests/sql/suites/pg/in_mixed.sql b/yt/yql/tests/sql/suites/pg/in_mixed.sql
new file mode 100644
index 0000000000..b25173295c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/in_mixed.sql
@@ -0,0 +1,21 @@
+--!syntax_pg
+
+-- simple case
+select 1 in ('1', '2');
+
+-- splits into IN over numerics and IN over text
+select '1' in (0, 0.0, 1, '1'::text, '3'::char(3));
+
+-- mixture of types in rhs, expression in lhs
+select (c::int + 1) in (1, 2.9, '4') from (values ('0'), ('1')) as t(c);
+
+-- arrays support
+select array[1, 2] in (array[2, 4], array[1, 2]);
+
+-- NULL in rhs
+select 1 in (0, NULL);
+select 1 in ('1', NULL);
+
+-- non-PG types handling
+select index in ('2', 4) from plato."Input";
+
diff --git a/yt/yql/tests/sql/suites/pg/input.txt.attr b/yt/yql/tests/sql/suites/pg/input.txt.attr
new file mode 100644
index 0000000000..29966e9729
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/input.txt.attr
@@ -0,0 +1,5 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[["key";["PgType";"text";];];["subkey";["PgType";"text";];];["value";["PgType";"text";];];];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg/input2.txt.attr b/yt/yql/tests/sql/suites/pg/input2.txt.attr
new file mode 100644
index 0000000000..764e188c0e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/input2.txt.attr
@@ -0,0 +1,5 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[["key2";["PgType";"text";];];["subkey2";["PgType";"text";];];["value2";["PgType";"text";];];];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg/input3.txt.attr b/yt/yql/tests/sql/suites/pg/input3.txt.attr
new file mode 100644
index 0000000000..29966e9729
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/input3.txt.attr
@@ -0,0 +1,5 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[["key";["PgType";"text";];];["subkey";["PgType";"text";];];["value";["PgType";"text";];];];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg/input4.txt.attr b/yt/yql/tests/sql/suites/pg/input4.txt.attr
new file mode 100644
index 0000000000..cbd95f44d0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/input4.txt.attr
@@ -0,0 +1,5 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[["b_val";["PgType";"text";];];["i_val";["PgType";"text";];];["d_val";["PgType";"text";];];];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg/input5.txt.attr b/yt/yql/tests/sql/suites/pg/input5.txt.attr
new file mode 100644
index 0000000000..29966e9729
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/input5.txt.attr
@@ -0,0 +1,5 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[["key";["PgType";"text";];];["subkey";["PgType";"text";];];["value";["PgType";"text";];];];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg/inputC.txt.attr b/yt/yql/tests/sql/suites/pg/inputC.txt.attr
new file mode 100644
index 0000000000..04395da84e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/inputC.txt.attr
@@ -0,0 +1,5 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[["id";["PgType";"text";];];["CodeGen_FullTime";["PgType";"text";];];];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg/inputZ.txt.attr b/yt/yql/tests/sql/suites/pg/inputZ.txt.attr
new file mode 100644
index 0000000000..7a0736147d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/inputZ.txt.attr
@@ -0,0 +1,5 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[["f";["PgType";"text";];];];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg/input_1.txt.attr b/yt/yql/tests/sql/suites/pg/input_1.txt.attr
new file mode 100644
index 0000000000..4eb7921afd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/input_1.txt.attr
@@ -0,0 +1,5 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[["id";["PgType";"text";];];["name";["PgType";"text";];];];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg/input_2.txt.attr b/yt/yql/tests/sql/suites/pg/input_2.txt.attr
new file mode 100644
index 0000000000..e13fdd2707
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/input_2.txt.attr
@@ -0,0 +1,5 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[["id";["PgType";"text";];];["no";["PgType";"text";];];];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg/input_3.txt.attr b/yt/yql/tests/sql/suites/pg/input_3.txt.attr
new file mode 100644
index 0000000000..236c665843
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/input_3.txt.attr
@@ -0,0 +1,5 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[["id";["PgType";"text";];];["sname";["PgType";"text";];];];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg/input_name.txt.attr b/yt/yql/tests/sql/suites/pg/input_name.txt.attr
new file mode 100644
index 0000000000..8ec2d4d44b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/input_name.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["PgType";"name"]];
+ ["index";["DataType";"Int32"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/pg/input_pg.txt.attr b/yt/yql/tests/sql/suites/pg/input_pg.txt.attr
new file mode 100644
index 0000000000..aa9ffac476
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/input_pg.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["a";["PgType";"int2"]];
+ ["b";["PgType";"text"]];
+ ["c";["PgType";"_int2"]];
+ ]];
+}} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/pg/input_pg_int_and_text.txt.attr b/yt/yql/tests/sql/suites/pg/input_pg_int_and_text.txt.attr
new file mode 100644
index 0000000000..f10676fc0e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/input_pg_int_and_text.txt.attr
@@ -0,0 +1,6 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["a";["PgType";"int2"]];
+ ["b";["PgType";"text"]];
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/pg/insert.cfg b/yt/yql/tests/sql/suites/pg/insert.cfg
new file mode 100644
index 0000000000..de341b36d1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/insert.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/pg/insert.sql b/yt/yql/tests/sql/suites/pg/insert.sql
new file mode 100644
index 0000000000..25ed958fea
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/insert.sql
@@ -0,0 +1,3 @@
+--!syntax_pg
+insert into plato."Output"
+select * from plato."Input" \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/pg/join_using_multiple2.cfg b/yt/yql/tests/sql/suites/pg/join_using_multiple2.cfg
new file mode 100644
index 0000000000..8ea83a7905
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/join_using_multiple2.cfg
@@ -0,0 +1,3 @@
+in Input input_1.txt
+in Input2 input_2.txt
+in Input3 input_3.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/pg/join_using_multiple2.sql b/yt/yql/tests/sql/suites/pg/join_using_multiple2.sql
new file mode 100644
index 0000000000..56fbd4ce06
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/join_using_multiple2.sql
@@ -0,0 +1,9 @@
+--!syntax_pg
+select * from (
+ (plato."Input"
+ join
+ plato."Input2"
+ using (id))
+ join
+ plato."Input3"
+ using (id)) order by id \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/pg/join_using_tables1.sql b/yt/yql/tests/sql/suites/pg/join_using_tables1.sql
new file mode 100644
index 0000000000..6641655afc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/join_using_tables1.sql
@@ -0,0 +1,6 @@
+--!syntax_pg
+select a.* from (
+ plato."Input" a
+ join
+ plato."Input"
+ using(key)) order by key \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/pg/join_using_tables2.sql b/yt/yql/tests/sql/suites/pg/join_using_tables2.sql
new file mode 100644
index 0000000000..e8a7531146
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/join_using_tables2.sql
@@ -0,0 +1,6 @@
+--!syntax_pg
+select a.* from (
+ plato."Input"
+ join
+ plato."Input" a
+ using(key)) order by key \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/pg/join_using_tables3.sql b/yt/yql/tests/sql/suites/pg/join_using_tables3.sql
new file mode 100644
index 0000000000..4d7ccc7630
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/join_using_tables3.sql
@@ -0,0 +1,6 @@
+--!syntax_pg
+select * from (
+ plato."Input" a
+ full join
+ plato."Input"
+ using(key,subkey,value)) order by key \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/pg/join_using_tables4.sql b/yt/yql/tests/sql/suites/pg/join_using_tables4.sql
new file mode 100644
index 0000000000..008fcbf819
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/join_using_tables4.sql
@@ -0,0 +1,6 @@
+--!syntax_pg
+select key from (
+ plato."Input" a
+ full join
+ plato."Input5"
+ using(key)) order by key \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/pg/name.cfg b/yt/yql/tests/sql/suites/pg/name.cfg
new file mode 100644
index 0000000000..d54cfe5b7e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/name.cfg
@@ -0,0 +1,2 @@
+in Input input_name.txt
+out Output output.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/pg/name.sql b/yt/yql/tests/sql/suites/pg/name.sql
new file mode 100644
index 0000000000..42d2e28596
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/name.sql
@@ -0,0 +1,6 @@
+--!syntax_pg
+INSERT INTO plato."Output"
+SELECT
+ key, index+1 as index
+FROM plato."Input"
+ORDER BY index; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/pg/nulls.sql b/yt/yql/tests/sql/suites/pg/nulls.sql
new file mode 100644
index 0000000000..3ba4143226
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/nulls.sql
@@ -0,0 +1,39 @@
+use plato;
+
+insert into @foo
+select
+
+ 1 as a,
+ Nothing(pgcstring) as i1,
+
+ Just(Nothing(pgcstring)) as j1,
+ Nothing(pgcstring?) as j2,
+
+ Just(Just(Nothing(pgcstring))) as k1,
+ Just(Nothing(pgcstring?)) as k2,
+ Nothing(pgcstring??) as k3
+
+;
+
+commit;
+
+insert into @bar
+select t.a+1 as a,t.* without a from @foo as t;
+
+commit;
+
+select
+a,
+i1,i1 is null as i1n,
+j1,j1 is null as j1n,
+j2,j2 is null as j2n,
+k1,k1 is null as k1n,
+k2,k2 is null as k2n,
+k3,k3 is null as k3n
+from @bar;
+
+
+
+
+
+
diff --git a/yt/yql/tests/sql/suites/pg/nulls_native.sql b/yt/yql/tests/sql/suites/pg/nulls_native.sql
new file mode 100644
index 0000000000..3b77aeb9db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/nulls_native.sql
@@ -0,0 +1,40 @@
+use plato;
+pragma yt.UseNativeYtTypes;
+
+insert into @foo
+select
+
+ 1 as a,
+ Nothing(pgcstring) as i1,
+
+ Just(Nothing(pgcstring)) as j1,
+ Nothing(pgcstring?) as j2,
+
+ Just(Just(Nothing(pgcstring))) as k1,
+ Just(Nothing(pgcstring?)) as k2,
+ Nothing(pgcstring??) as k3
+
+;
+
+commit;
+
+insert into @bar
+select t.a+1 as a,t.* without a from @foo as t;
+
+commit;
+
+select
+a,
+i1,i1 is null as i1n,
+j1,j1 is null as j1n,
+j2,j2 is null as j2n,
+k1,k1 is null as k1n,
+k2,k2 is null as k2n,
+k3,k3 is null as k3n
+from @bar;
+
+
+
+
+
+
diff --git a/yt/yql/tests/sql/suites/pg/param_text1.json b/yt/yql/tests/sql/suites/pg/param_text1.json
new file mode 100644
index 0000000000..d4e83b6c9e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/param_text1.json
@@ -0,0 +1 @@
+"param_text1"
diff --git a/yt/yql/tests/sql/suites/pg/param_text2.json b/yt/yql/tests/sql/suites/pg/param_text2.json
new file mode 100644
index 0000000000..b948e9f727
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/param_text2.json
@@ -0,0 +1 @@
+"param_text2"
diff --git a/yt/yql/tests/sql/suites/pg/pg_column_case.cfg b/yt/yql/tests/sql/suites/pg/pg_column_case.cfg
new file mode 100644
index 0000000000..a175d357b1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/pg_column_case.cfg
@@ -0,0 +1,2 @@
+in InputC inputC.txt
+
diff --git a/yt/yql/tests/sql/suites/pg/pg_column_case.sql b/yt/yql/tests/sql/suites/pg/pg_column_case.sql
new file mode 100644
index 0000000000..a04df0091f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/pg_column_case.sql
@@ -0,0 +1,7 @@
+--!syntax_pg
+select id, CodeGen_FullTime
+ , "CodeGen_FullTime" as Quoted
+ , CodeGen_FullTime || 'x'
+ , "CodeGen_FullTime" || 'x'
+ , (CodeGen_FullTime || 'x')
+from plato."InputC" limit 100;
diff --git a/yt/yql/tests/sql/suites/pg/pg_types_orderby.cfg b/yt/yql/tests/sql/suites/pg/pg_types_orderby.cfg
new file mode 100644
index 0000000000..748ba77b3f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/pg_types_orderby.cfg
@@ -0,0 +1,2 @@
+in Input4 input4.txt
+providers dq
diff --git a/yt/yql/tests/sql/suites/pg/pg_types_orderby.sql b/yt/yql/tests/sql/suites/pg/pg_types_orderby.sql
new file mode 100644
index 0000000000..56fd84dded
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/pg_types_orderby.sql
@@ -0,0 +1,32 @@
+--!syntax_pg
+select b_val::bool as value
+from plato."Input4"
+order by value;
+
+select i_val::int2 as value
+from plato."Input4"
+order by value;
+
+select i_val::int4 as value
+from plato."Input4"
+order by value;
+
+select i_val::int8 as value
+from plato."Input4"
+order by value;
+
+select i_val::float4 as value
+from plato."Input4"
+order by value;
+
+select i_val::float8 as value
+from plato."Input4"
+order by value;
+
+select d_val::bytea as value
+from plato."Input4"
+order by value;
+
+select d_val::date as value
+from plato."Input4"
+order by value;
diff --git a/yt/yql/tests/sql/suites/pg/point.sql b/yt/yql/tests/sql/suites/pg/point.sql
new file mode 100644
index 0000000000..c106a3ecca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/point.sql
@@ -0,0 +1,3 @@
+--!syntax_pg
+select key,'(1,2)'::point from plato."Input"
+order by key;
diff --git a/yt/yql/tests/sql/suites/pg/select_alias_partial.sql b/yt/yql/tests/sql/suites/pg/select_alias_partial.sql
new file mode 100644
index 0000000000..2db4a8111e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_alias_partial.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select key,a.value,key2 from plato."Input" as a,plato."Input2";
diff --git a/yt/yql/tests/sql/suites/pg/select_columnref1.sql b/yt/yql/tests/sql/suites/pg/select_columnref1.sql
new file mode 100644
index 0000000000..b45b8e3cc3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_columnref1.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select key, value || '!', key || value as c from plato."Input";
diff --git a/yt/yql/tests/sql/suites/pg/select_columnref2.sql b/yt/yql/tests/sql/suites/pg/select_columnref2.sql
new file mode 100644
index 0000000000..dce20796a8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_columnref2.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select key, value || '!', key2, value2, key || value2 as c from plato."Input", plato."Input2";
diff --git a/yt/yql/tests/sql/suites/pg/select_common_type_unionall.cfg b/yt/yql/tests/sql/suites/pg/select_common_type_unionall.cfg
new file mode 100644
index 0000000000..1a343da34c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_common_type_unionall.cfg
@@ -0,0 +1 @@
+in Input input_pg_int_and_text.txt
diff --git a/yt/yql/tests/sql/suites/pg/select_common_type_unionall.sql b/yt/yql/tests/sql/suites/pg/select_common_type_unionall.sql
new file mode 100644
index 0000000000..9b9c379e87
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_common_type_unionall.sql
@@ -0,0 +1,21 @@
+--!syntax_pg
+
+-- check unknown-typed string literals converted to int and text types
+-- also check that column names from the 1st select are used for result columns
+select 1 as step, '1', 'x' as c2
+union all
+-- 2nd column is of integer type
+-- It's important to have one of 1st columns' value as the 2nd column value in this SELECT. That helps us to catch ExprNode sharing bugs
+select 2, 3, null as c3
+union all
+-- we need to check casts of aggregation functions' results, so make 2nd column int8
+-- also, check we get PgCasts for columns generated by PgStar
+-- also, check aggregation functions in projection subqueries
+select 3, * from (select 4::int8 as c1, max(b) as c from plato."Input") as t
+union all
+-- check PgQualifiedStar
+select 4, t.* from plato."Input" as t
+union all
+-- check if casts are there for aggregation functions used directly and in a projection
+select 5, min(a), (select min(b) from plato."Input") from plato."Input"
+order by 1, 2, 3
diff --git a/yt/yql/tests/sql/suites/pg/select_from_columns.sql b/yt/yql/tests/sql/suites/pg/select_from_columns.sql
new file mode 100644
index 0000000000..26a9849a9f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_from_columns.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select a from plato."Input" u(a,b,c)
diff --git a/yt/yql/tests/sql/suites/pg/select_from_columns_qstar.sql b/yt/yql/tests/sql/suites/pg/select_from_columns_qstar.sql
new file mode 100644
index 0000000000..de80f5d467
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_from_columns_qstar.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select u.* from plato."Input" u(a,b,c)
diff --git a/yt/yql/tests/sql/suites/pg/select_from_columns_star.sql b/yt/yql/tests/sql/suites/pg/select_from_columns_star.sql
new file mode 100644
index 0000000000..1ae501d588
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_from_columns_star.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select * from plato."Input" u(a,b,c)
diff --git a/yt/yql/tests/sql/suites/pg/select_limit.sql b/yt/yql/tests/sql/suites/pg/select_limit.sql
new file mode 100644
index 0000000000..a8c47d63f5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_limit.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select * from plato."Input" limit 2 offset 1 \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/pg/select_qstarref1.sql b/yt/yql/tests/sql/suites/pg/select_qstarref1.sql
new file mode 100644
index 0000000000..71a0b26b95
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_qstarref1.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select a.*,1,value as foo from plato."Input" as a;
diff --git a/yt/yql/tests/sql/suites/pg/select_qstarref2.sql b/yt/yql/tests/sql/suites/pg/select_qstarref2.sql
new file mode 100644
index 0000000000..be8829bd85
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_qstarref2.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select a.*,b.* from plato."Input" as a,plato."Input2" as b;
diff --git a/yt/yql/tests/sql/suites/pg/select_starref1.sql b/yt/yql/tests/sql/suites/pg/select_starref1.sql
new file mode 100644
index 0000000000..cab5016734
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_starref1.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select * from plato."Input";
diff --git a/yt/yql/tests/sql/suites/pg/select_starref2.sql b/yt/yql/tests/sql/suites/pg/select_starref2.sql
new file mode 100644
index 0000000000..7d4e1b9ec6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_starref2.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select * from plato."Input", plato."Input2";
diff --git a/yt/yql/tests/sql/suites/pg/select_subquery.sql b/yt/yql/tests/sql/suites/pg/select_subquery.sql
new file mode 100644
index 0000000000..f8f6899b72
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_subquery.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select * from (select value,key from plato."Input") a
diff --git a/yt/yql/tests/sql/suites/pg/select_subquery2.sql b/yt/yql/tests/sql/suites/pg/select_subquery2.sql
new file mode 100644
index 0000000000..ba11590f6c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_subquery2.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select * from (select * from plato."Input") a, (select * from plato."Input2") b;
diff --git a/yt/yql/tests/sql/suites/pg/select_subquery2_qstar.sql b/yt/yql/tests/sql/suites/pg/select_subquery2_qstar.sql
new file mode 100644
index 0000000000..7d5a5e46e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_subquery2_qstar.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select b.*,a.* from (select * from plato."Input") a, (select * from plato."Input2") b;
diff --git a/yt/yql/tests/sql/suites/pg/select_table1.sql b/yt/yql/tests/sql/suites/pg/select_table1.sql
new file mode 100644
index 0000000000..ef66a44482
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_table1.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select 1 from plato."Input";
diff --git a/yt/yql/tests/sql/suites/pg/select_table2.sql b/yt/yql/tests/sql/suites/pg/select_table2.sql
new file mode 100644
index 0000000000..d430b624f5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_table2.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select 1 from plato."Input", plato."Input2";
diff --git a/yt/yql/tests/sql/suites/pg/select_unionall_self.sql b/yt/yql/tests/sql/suites/pg/select_unionall_self.sql
new file mode 100644
index 0000000000..f0f8968796
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_unionall_self.sql
@@ -0,0 +1,6 @@
+--!syntax_pg
+select * from plato."Input"
+union all
+select * from plato."Input"
+union all
+select * from plato."Input";
diff --git a/yt/yql/tests/sql/suites/pg/select_where.sql b/yt/yql/tests/sql/suites/pg/select_where.sql
new file mode 100644
index 0000000000..c7db84240d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_where.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select * from plato."Input" where key = '800' or not (key < '999')
diff --git a/yt/yql/tests/sql/suites/pg/select_yql_type.cfg b/yt/yql/tests/sql/suites/pg/select_yql_type.cfg
new file mode 100644
index 0000000000..0ca1ef5bf1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_yql_type.cfg
@@ -0,0 +1 @@
+in Input input_name.txt
diff --git a/yt/yql/tests/sql/suites/pg/select_yql_type.sql b/yt/yql/tests/sql/suites/pg/select_yql_type.sql
new file mode 100644
index 0000000000..18574a079b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/select_yql_type.sql
@@ -0,0 +1,15 @@
+--!syntax_pg
+SELECT
+ key, index, index + 1
+FROM plato."Input"
+ORDER BY index;
+
+SELECT
+ *
+FROM plato."Input"
+ORDER BY index;
+
+SELECT
+ t.*
+FROM plato."Input" as t
+ORDER BY index;
diff --git a/yt/yql/tests/sql/suites/pg/table_func.sql b/yt/yql/tests/sql/suites/pg/table_func.sql
new file mode 100644
index 0000000000..3d481c9cf8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/table_func.sql
@@ -0,0 +1,15 @@
+--!syntax_pg
+select count(*) from plato.concat('Input','Input');
+select count(*) from plato.concat_view('Input','raw','Input','raw');
+select count(*) from plato.range('');
+select count(*) from plato.range('','A');
+select count(*) from plato.range('','A','Z');
+select count(*) from plato.range('','A','Z','');
+select count(*) from plato.range('','A','Z','','raw');
+select count(*) from plato.regexp('','Inpu.?');
+select count(*) from plato.regexp('','Inpu.?','');
+select count(*) from plato.regexp('','Inpu.?','','raw');
+select count(*) from plato.like('','Inpu%');
+select count(*) from plato.like('','Inpu%','');
+select count(*) from plato.like('','Inpu%','','raw');
+
diff --git a/yt/yql/tests/sql/suites/pg/wide_sort.cfg b/yt/yql/tests/sql/suites/pg/wide_sort.cfg
new file mode 100644
index 0000000000..72b51dc777
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/wide_sort.cfg
@@ -0,0 +1 @@
+in Input input_pg.txt
diff --git a/yt/yql/tests/sql/suites/pg/wide_sort.sql b/yt/yql/tests/sql/suites/pg/wide_sort.sql
new file mode 100644
index 0000000000..8d5fcffce2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/wide_sort.sql
@@ -0,0 +1,5 @@
+USE plato;
+SELECT
+ *
+FROM Input
+ORDER BY a,b desc,c desc
diff --git a/yt/yql/tests/sql/suites/pg/wide_top_sort.cfg b/yt/yql/tests/sql/suites/pg/wide_top_sort.cfg
new file mode 100644
index 0000000000..72b51dc777
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/wide_top_sort.cfg
@@ -0,0 +1 @@
+in Input input_pg.txt
diff --git a/yt/yql/tests/sql/suites/pg/wide_top_sort.sql b/yt/yql/tests/sql/suites/pg/wide_top_sort.sql
new file mode 100644
index 0000000000..0eabce49df
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg/wide_top_sort.sql
@@ -0,0 +1,5 @@
+USE plato;
+SELECT
+ *
+FROM Input
+ORDER BY a,b desc,c desc LIMIT 3
diff --git a/yt/yql/tests/sql/suites/pg_catalog/default.cfg b/yt/yql/tests/sql/suites/pg_catalog/default.cfg
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg_catalog/default.cfg
diff --git a/yt/yql/tests/sql/suites/pg_catalog/input_pg.txt.attr b/yt/yql/tests/sql/suites/pg_catalog/input_pg.txt.attr
new file mode 100644
index 0000000000..7747e0f9b7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg_catalog/input_pg.txt.attr
@@ -0,0 +1,5 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[["key";["PgType";"int4";];];["subkey";["PgType";"text";];];["value";["PgType";"text";];];];];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/pg_catalog/lambda.cfg b/yt/yql/tests/sql/suites/pg_catalog/lambda.cfg
new file mode 100644
index 0000000000..ef7e4f47a9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg_catalog/lambda.cfg
@@ -0,0 +1,2 @@
+in Input input_pg.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/pg_catalog/lambda.sql b/yt/yql/tests/sql/suites/pg_catalog/lambda.sql
new file mode 100644
index 0000000000..f7cf0d582a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg_catalog/lambda.sql
@@ -0,0 +1,2 @@
+--!syntax_pg
+select key, key::oid in (select oid from pg_catalog.pg_type) as found from plato."Input" order by key
diff --git a/yt/yql/tests/sql/suites/pg_duplicated/default.cfg b/yt/yql/tests/sql/suites/pg_duplicated/default.cfg
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg_duplicated/default.cfg
diff --git a/yt/yql/tests/sql/suites/pg_duplicated/duplicated_rowspec.cfg b/yt/yql/tests/sql/suites/pg_duplicated/duplicated_rowspec.cfg
new file mode 100644
index 0000000000..ab354ca5a0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg_duplicated/duplicated_rowspec.cfg
@@ -0,0 +1 @@
+in input duplicated_rowspec.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/pg_duplicated/duplicated_rowspec.sql b/yt/yql/tests/sql/suites/pg_duplicated/duplicated_rowspec.sql
new file mode 100644
index 0000000000..4d7bd0853f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg_duplicated/duplicated_rowspec.sql
@@ -0,0 +1,3 @@
+--!syntax_pg
+
+select * from plato.Input;
diff --git a/yt/yql/tests/sql/suites/pg_duplicated/duplicated_rowspec.txt.attr b/yt/yql/tests/sql/suites/pg_duplicated/duplicated_rowspec.txt.attr
new file mode 100644
index 0000000000..66ac98585a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pg_duplicated/duplicated_rowspec.txt.attr
@@ -0,0 +1,36 @@
+{
+ "_yql_row_spec"={
+ "ColumnOrder"=["x";"x"];
+ "NativeYtTypeFlags"=0u;
+ "StrictSchema"= %true;
+ "TypePatch"= [
+ "StructType"; [
+ ["x"; ["PgType";"int4"]];
+ ["x_generated_2"; ["PgType";"int8"]];
+ ]
+ ]
+ };
+ "schema"=<
+ "strict"=%true;
+ "unique_keys"=%false;
+ >[
+ {
+ "name"= "x";
+ "required"= %false;
+ "type"= "int32";
+ "type_v3"= {
+ "item"= "int32";
+ "type_name"= "optional";
+ }
+ };
+ {
+ "name"= "x_generated_2";
+ "required"= %false;
+ "type"= "int64";
+ "type_v3"= {
+ "item"= "int64";
+ "type_name"= "optional";
+ }
+ };
+ ]
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/pragma/config_exec.cfg b/yt/yql/tests/sql/suites/pragma/config_exec.cfg
new file mode 100644
index 0000000000..ad52c79527
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pragma/config_exec.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/pragma/config_exec.sql b/yt/yql/tests/sql/suites/pragma/config_exec.sql
new file mode 100644
index 0000000000..4e83143e42
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pragma/config_exec.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+USE plato;
+
+INSERT INTO Output
+SELECT "1" as key, "1" as subkey, "1" as value;
+
+PRAGMA File("file", "dummy");
+
+INSERT INTO Output
+SELECT * from Input where key < "030";
diff --git a/yt/yql/tests/sql/suites/pragma/default.cfg b/yt/yql/tests/sql/suites/pragma/default.cfg
new file mode 100644
index 0000000000..8d1c8b69c3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pragma/default.cfg
@@ -0,0 +1 @@
+
diff --git a/yt/yql/tests/sql/suites/pragma/file.sql b/yt/yql/tests/sql/suites/pragma/file.sql
new file mode 100644
index 0000000000..d252d8dbe5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pragma/file.sql
@@ -0,0 +1 @@
+pragma file("HW", "sbr:181041334");
diff --git a/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull.cfg b/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull.cfg
new file mode 100644
index 0000000000..1b5feeea00
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull.cfg
@@ -0,0 +1,2 @@
+providers yt
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull.sql b/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull.sql
new file mode 100644
index 0000000000..8fd8207414
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull.sql
@@ -0,0 +1,23 @@
+/* kikimr can not */
+USE plato;
+
+PRAGMA yt.ReleaseTempData="immediate";
+PRAGMA yt.InflightTempTablesLimit="6";
+
+DEFINE ACTION $action($param) AS
+
+$key = CAST($param as String);
+
+$a = "Input";
+$b = (SELECT key,value FROM $a WHERE key != ($key || ".1") GROUP BY key, value ORDER BY value LIMIT 10);
+$c = (SELECT key,value FROM $b WHERE key != ($key || ".2") GROUP BY key, value ORDER BY value LIMIT 10);
+$d = (SELECT key,value FROM $c WHERE key != ($key || ".3") GROUP BY key, value ORDER BY value LIMIT 10);
+$e = (SELECT key,value FROM $d WHERE key != ($key || ".4") GROUP BY key, value ORDER BY value LIMIT 10);
+$f = (SELECT key,value FROM $e WHERE key != ($key || ".5") GROUP BY key, value ORDER BY value LIMIT 10);
+$g = (SELECT key,value FROM $f WHERE key != ($key || ".6") GROUP BY key, value ORDER BY value LIMIT 10);
+
+PROCESS $g;
+
+END DEFINE;
+
+EVALUATE FOR $param IN ListFromRange(1, 3) DO $action($param);
diff --git a/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_fail.cfg b/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_fail.cfg
new file mode 100644
index 0000000000..8896f1030d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_fail.cfg
@@ -0,0 +1,3 @@
+xfail
+providers yt
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_fail.sql b/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_fail.sql
new file mode 100644
index 0000000000..ae0813c283
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_fail.sql
@@ -0,0 +1,24 @@
+USE plato;
+
+PRAGMA yt.ReleaseTempData="finish";
+PRAGMA yt.InflightTempTablesLimit="6";
+
+/* custom error:Too many temporary tables registered - limit is 6*/
+
+DEFINE ACTION $action($param) AS
+
+$key = CAST($param as String);
+
+$a = "Input";
+$b = (SELECT key,value FROM $a WHERE key != ($key || ".1") GROUP BY key, value ORDER BY value LIMIT 10);
+$c = (SELECT key,value FROM $b WHERE key != ($key || ".2") GROUP BY key, value ORDER BY value LIMIT 10);
+$d = (SELECT key,value FROM $c WHERE key != ($key || ".3") GROUP BY key, value ORDER BY value LIMIT 10);
+$e = (SELECT key,value FROM $d WHERE key != ($key || ".4") GROUP BY key, value ORDER BY value LIMIT 10);
+$f = (SELECT key,value FROM $e WHERE key != ($key || ".5") GROUP BY key, value ORDER BY value LIMIT 10);
+$g = (SELECT key,value FROM $f WHERE key != ($key || ".6") GROUP BY key, value ORDER BY value LIMIT 10);
+
+PROCESS $g;
+
+END DEFINE;
+
+EVALUATE FOR $param IN ListFromRange(1, 3) DO $action($param);
diff --git a/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_single_thread.cfg b/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_single_thread.cfg
new file mode 100644
index 0000000000..1b5feeea00
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_single_thread.cfg
@@ -0,0 +1,2 @@
+providers yt
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_single_thread.sql b/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_single_thread.sql
new file mode 100644
index 0000000000..fcd945613f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_single_thread.sql
@@ -0,0 +1,23 @@
+/* kikimr can not */
+USE plato;
+
+PRAGMA yt.ReleaseTempData="immediate";
+PRAGMA yt.InflightTempTablesLimit="3";
+
+DEFINE ACTION $action($param) AS
+
+$key = CAST($param as String);
+
+$a = "Input";
+$b = (SELECT key,value FROM $a WHERE key != ($key || ".1") GROUP BY key, value ORDER BY value LIMIT 10);
+$c = (SELECT key,value FROM $b WHERE key != ($key || ".2") GROUP BY key, value ORDER BY value LIMIT 10);
+$d = (SELECT key,value FROM $c WHERE key != ($key || ".3") GROUP BY key, value ORDER BY value LIMIT 10);
+$e = (SELECT key,value FROM $d WHERE key != ($key || ".4") GROUP BY key, value ORDER BY value LIMIT 10);
+$f = (SELECT key,value FROM $e WHERE key != ($key || ".5") GROUP BY key, value ORDER BY value LIMIT 10);
+$g = (SELECT key,value FROM $f WHERE key != ($key || ".6") GROUP BY key, value ORDER BY value LIMIT 10);
+
+PROCESS $g;
+
+END DEFINE;
+
+EVALUATE FOR $param IN ListFromRange(1, 2) DO $action($param);
diff --git a/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_single_thread_fail.cfg b/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_single_thread_fail.cfg
new file mode 100644
index 0000000000..8896f1030d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_single_thread_fail.cfg
@@ -0,0 +1,3 @@
+xfail
+providers yt
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_single_thread_fail.sql b/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_single_thread_fail.sql
new file mode 100644
index 0000000000..c8dc1a2ac3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/pragma/release_temp_data_chain_pull_single_thread_fail.sql
@@ -0,0 +1,25 @@
+/* dq can not */
+USE plato;
+
+PRAGMA yt.ReleaseTempData="immediate";
+PRAGMA yt.InflightTempTablesLimit="2";
+
+/* custom error:Too many temporary tables registered - limit is 2*/
+
+DEFINE ACTION $action($param) AS
+
+$key = CAST($param as String);
+
+$a = "Input";
+$b = (SELECT key,value FROM $a WHERE key != ($key || ".1") GROUP BY key, value ORDER BY value LIMIT 10);
+$c = (SELECT key,value FROM $b WHERE key != ($key || ".2") GROUP BY key, value ORDER BY value LIMIT 10);
+$d = (SELECT key,value FROM $c WHERE key != ($key || ".3") GROUP BY key, value ORDER BY value LIMIT 10);
+$e = (SELECT key,value FROM $d WHERE key != ($key || ".4") GROUP BY key, value ORDER BY value LIMIT 10);
+$f = (SELECT key,value FROM $e WHERE key != ($key || ".5") GROUP BY key, value ORDER BY value LIMIT 10);
+$g = (SELECT key,value FROM $f WHERE key != ($key || ".6") GROUP BY key, value ORDER BY value LIMIT 10);
+
+PROCESS $g;
+
+END DEFINE;
+
+EVALUATE FOR $param IN ListFromRange(1, 2) DO $action($param);
diff --git a/yt/yql/tests/sql/suites/produce/default.cfg b/yt/yql/tests/sql/suites/produce/default.cfg
new file mode 100644
index 0000000000..55e29c24ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/default.cfg
@@ -0,0 +1,7 @@
+in Input0 input0.txt
+in Input1 input1.txt
+udf python3_udf
+udf streaming_udf
+udf simple_udf
+udf string_udf
+udf structs_udf
diff --git a/yt/yql/tests/sql/suites/produce/descending.txt.attr b/yt/yql/tests/sql/suites/produce/descending.txt.attr
new file mode 100644
index 0000000000..4f8cb9b625
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/descending.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema"=<
+ "strict" = %true;
+ "unique_keys" = %false
+ >[
+ {
+ "name" = "key";
+ "type" = "string";
+ "required" = %true;
+ "sort_order" = "descending";
+ };
+ {
+ "name" = "subkey";
+ "type" = "string";
+ "required" = %true;
+ "sort_order" = "descending";
+ };
+ {
+ "name" = "value";
+ "type" = "string";
+ "required" = %true;
+ "sort_order" = "descending";
+ };
+ ]
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/produce/discard_process_with_lambda.sql b/yt/yql/tests/sql/suites/produce/discard_process_with_lambda.sql
new file mode 100644
index 0000000000..ea5a9252ff
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/discard_process_with_lambda.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+/* postgres can not */
+$udf = YQL::@@(lambda '(x)
+(FlatMap x
+ (lambda '(y) (AsList y y))
+))@@;
+
+discard process plato.Input0 using $udf(TableRows());
diff --git a/yt/yql/tests/sql/suites/produce/discard_reduce_lambda.cfg b/yt/yql/tests/sql/suites/produce/discard_reduce_lambda.cfg
new file mode 100644
index 0000000000..86c4b62f86
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/discard_reduce_lambda.cfg
@@ -0,0 +1,3 @@
+in Input1 input1.txt
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/discard_reduce_lambda.sql b/yt/yql/tests/sql/suites/produce/discard_reduce_lambda.sql
new file mode 100644
index 0000000000..132b492b4c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/discard_reduce_lambda.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+USE plato;
+
+$udf = YQL::@@(lambda '(key stream) (AsStruct
+ '('key key) '('summ (Collect (Condense stream (Uint32 '0) (lambda '(item state) (Bool 'False)) (lambda '(item state) (Add state item)))))
+))@@;
+
+--INSERT INTO Output
+DISCARD REDUCE Input1 ON key USING $udf(cast(value as uint32) ?? 0);
diff --git a/yt/yql/tests/sql/suites/produce/fuse_reduces_with_presort.cfg b/yt/yql/tests/sql/suites/produce/fuse_reduces_with_presort.cfg
new file mode 100644
index 0000000000..612a5060aa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/fuse_reduces_with_presort.cfg
@@ -0,0 +1 @@
+in Input input_sorted.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/produce/fuse_reduces_with_presort.sql b/yt/yql/tests/sql/suites/produce/fuse_reduces_with_presort.sql
new file mode 100644
index 0000000000..b4f5afd8c2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/fuse_reduces_with_presort.sql
@@ -0,0 +1,69 @@
+USE plato;
+
+$reduce = ($_, $TableRows) -> {
+ return Yql::Condense1(
+ $TableRows,
+ ($item) -> ($item),
+ ($_, $_) -> (false),
+ ($item, $_) -> ($item)
+ );
+};
+
+$stream =
+select * from Input;
+
+--
+
+$stream1 = Reduce $stream
+presort value1
+on key, subkey
+using $reduce(TableRow())
+assume order by key, subkey, value1;
+
+$stream1 = Reduce $stream1
+presort value1
+on key, subkey
+using $reduce(TableRow())
+assume order by key, subkey, value1;
+
+--
+
+$stream2 = Reduce $stream
+presort value1, value2
+on key, subkey
+using $reduce(TableRow())
+assume order by key, subkey, value1, value2;
+
+$stream2 = Reduce $stream2
+presort value1
+on key, subkey
+using $reduce(TableRow())
+assume order by key, subkey, value1;
+
+--
+
+$stream3 = Reduce $stream
+presort value1, value2, value3
+on key, subkey
+using $reduce(TableRow())
+assume order by key, subkey, value1, value2, value3;
+
+$stream3 = Reduce $stream3
+on key, subkey
+using $reduce(TableRow())
+assume order by key, subkey;
+
+select
+ *
+from $stream1
+ASSUME ORDER BY `key`, `subkey`;
+
+select
+ *
+from $stream2
+ASSUME ORDER BY `key`, `subkey`;
+
+select
+ *
+from $stream3
+ASSUME ORDER BY `key`, `subkey`;
diff --git a/yt/yql/tests/sql/suites/produce/input_sorted.txt.attr b/yt/yql/tests/sql/suites/produce/input_sorted.txt.attr
new file mode 100644
index 0000000000..f091ca59dd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/input_sorted.txt.attr
@@ -0,0 +1,15 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value1";["DataType";"String"]];
+ ["value2";["DataType";"String"]];
+ ["value3";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1;1;1;1;1];
+ "SortedBy"=["key";"subkey";"value1";"value2";"value3"];
+ "SortedByTypes"=[["DataType";"String"];["DataType";"String"];["DataType";"String"];["DataType";"String"];["DataType";"String"]];
+ "SortMembers"=["key";"subkey";"value1";"value2";"value3"];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/produce/native_desc_reduce_with_presort.cfg b/yt/yql/tests/sql/suites/produce/native_desc_reduce_with_presort.cfg
new file mode 100644
index 0000000000..d5fb684934
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/native_desc_reduce_with_presort.cfg
@@ -0,0 +1,4 @@
+in Input1 descending.txt
+in Input2 sorted.txt
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/native_desc_reduce_with_presort.sql b/yt/yql/tests/sql/suites/produce/native_desc_reduce_with_presort.sql
new file mode 100644
index 0000000000..4970a01bbe
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/native_desc_reduce_with_presort.sql
@@ -0,0 +1,23 @@
+/* postgres can not */
+USE plato;
+pragma yt.UseNativeDescSort;
+
+$udf = YQL::@@(lambda '(key stream) (AsStruct
+ '('key key) '('summ (Collect (Condense stream (Nothing (OptionalType (DataType 'String))) (lambda '(item state) (Bool 'False)) (lambda '(item state) (Coalesce state (Just item))))))
+))@@;
+
+select * from (
+ reduce Input1 presort value desc on key, subkey using $udf(value) --YtReduce
+) order by key, summ;
+
+select * from (
+ reduce Input1 presort subkey desc, value desc on key using $udf(value) --YtReduce
+) order by key, summ;
+
+select * from (
+ reduce Input1 presort value on key, subkey using $udf(value) --YtMapReduce
+) order by key, summ;
+
+select * from (
+ reduce concat(Input1, Input2) presort value desc on key, subkey using $udf(value) --YtMapReduce
+) order by key, summ;
diff --git a/yt/yql/tests/sql/suites/produce/process_and_filter.sql b/yt/yql/tests/sql/suites/produce/process_and_filter.sql
new file mode 100644
index 0000000000..2bd992f4f4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_and_filter.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+PROCESS pLaTo.Input0 USING SimpleUdf::Echo(value) as val WHERE value == "abc";
diff --git a/yt/yql/tests/sql/suites/produce/process_lambda_opt_args.sql b/yt/yql/tests/sql/suites/produce/process_lambda_opt_args.sql
new file mode 100644
index 0000000000..612885c95b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_lambda_opt_args.sql
@@ -0,0 +1,14 @@
+USE plato;
+
+$f = ($x, $optArg?)->{
+ return Ensure($x, $optArg is null or len($optArg)>0);
+};
+
+PROCESS Input0 USING $f(TableRow());
+
+PROCESS Input0 USING $f(TableRow(),'foo');
+
+PROCESS Input0 USING $f(TableRows());
+
+PROCESS Input0 USING $f(TableRows(),'foo');
+
diff --git a/yt/yql/tests/sql/suites/produce/process_multi_in.cfg b/yt/yql/tests/sql/suites/produce/process_multi_in.cfg
new file mode 100644
index 0000000000..5b95850078
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_multi_in.cfg
@@ -0,0 +1,4 @@
+in Input input0.txt
+res result.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/process_multi_in.sql b/yt/yql/tests/sql/suites/produce/process_multi_in.sql
new file mode 100644
index 0000000000..41d9c9be0e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_multi_in.sql
@@ -0,0 +1,22 @@
+/* syntax version 1 */
+/* postgres can not */
+/* dq file can not */
+$udfScript = @@
+def MyFunc(stream):
+ return stream
+@@;
+
+$record = (SELECT TableRow() FROM plato.Input);
+$recordType = TypeOf(Unwrap($record));
+$streamType = StreamType(VariantType(TupleType($recordType, $recordType, $recordType)));
+$udf = Python3::MyFunc(CallableType(0, $streamType, $streamType), $udfScript);
+
+$src = (select * from plato.Input where key > "200");
+
+$i, $j, $k = (PROCESS plato.Input, (select * from plato.Input where key > "100"), $src USING $udf(TableRows()));
+
+select * from $i;
+
+select * from $j;
+
+select * from $k;
diff --git a/yt/yql/tests/sql/suites/produce/process_multi_in_single_out.cfg b/yt/yql/tests/sql/suites/produce/process_multi_in_single_out.cfg
new file mode 100644
index 0000000000..98996c5bf7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_multi_in_single_out.cfg
@@ -0,0 +1,3 @@
+in Input0 input0.txt
+out Output output.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/process_multi_in_single_out.sql b/yt/yql/tests/sql/suites/produce/process_multi_in_single_out.sql
new file mode 100644
index 0000000000..11bc99aa5f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_multi_in_single_out.sql
@@ -0,0 +1,25 @@
+/* syntax version 1 */
+/* postgres can not */
+
+$udf = YQL::@@
+(lambda '(stream)
+ (PartitionByKey stream
+ (lambda '(item) (Way item))
+ (Void)
+ (Void)
+ (lambda '(listOfPairs)
+ (FlatMap listOfPairs (lambda '(pair)
+ (Map (Nth pair '1) (lambda '(elem)
+ (AsStruct
+ '('cnt (Visit elem '0 (lambda '(v) (Member v 'subkey)) '1 (lambda '(v) (Member v 'subkey))))
+ '('src (Nth pair '0))
+ )
+ ))
+ ))
+ )
+ )
+)
+@@;
+
+INSERT INTO plato.Output WITH TRUNCATE
+PROCESS plato.Input0, (select * from plato.Input0 where key > "100") USING $udf(TableRows());
diff --git a/yt/yql/tests/sql/suites/produce/process_multi_in_trivial_lambda.cfg b/yt/yql/tests/sql/suites/produce/process_multi_in_trivial_lambda.cfg
new file mode 100644
index 0000000000..4468d3ba29
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_multi_in_trivial_lambda.cfg
@@ -0,0 +1,2 @@
+in Input input0.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/produce/process_multi_in_trivial_lambda.sql b/yt/yql/tests/sql/suites/produce/process_multi_in_trivial_lambda.sql
new file mode 100644
index 0000000000..51c3de3aaf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_multi_in_trivial_lambda.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$lambda = ($x) -> { return $x; };
+
+$result = PROCESS Input, Input
+USING
+ $lambda(TableRow())
+;
+
+SELECT * FROM AS_TABLE($result.0);
diff --git a/yt/yql/tests/sql/suites/produce/process_multi_out.cfg b/yt/yql/tests/sql/suites/produce/process_multi_out.cfg
new file mode 100644
index 0000000000..d5a164924d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_multi_out.cfg
@@ -0,0 +1,4 @@
+in Input input0.txt
+res result.txt
+udf python2_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/process_multi_out.sql b/yt/yql/tests/sql/suites/produce/process_multi_out.sql
new file mode 100644
index 0000000000..a6162a13a8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_multi_out.sql
@@ -0,0 +1,24 @@
+/* syntax version 1 */
+/* postgres can not */
+$udfScript = @@
+def MyFunc(list):
+ return [(int(x.key) % 2, x) for x in list]
+@@;
+
+$record = (SELECT TableRow() FROM plato.Input);
+$recordType =TypeOf(Unwrap($record));
+
+$udf = Python::MyFunc(
+ CallableType(0,
+ StreamType(
+ VariantType(TupleType($recordType, $recordType))
+ ),
+ StreamType($recordType)),
+ $udfScript
+);
+
+$i, $j = (PROCESS plato.Input USING $udf(TableRows()));
+
+select * from $i;
+
+select * from $j;
diff --git a/yt/yql/tests/sql/suites/produce/process_multi_out_bad_count_fail.cfg b/yt/yql/tests/sql/suites/produce/process_multi_out_bad_count_fail.cfg
new file mode 100644
index 0000000000..00bbe745ac
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_multi_out_bad_count_fail.cfg
@@ -0,0 +1,4 @@
+xfail
+in Input input0.txt
+res result.txt
+udf python2_udf
diff --git a/yt/yql/tests/sql/suites/produce/process_multi_out_bad_count_fail.sql b/yt/yql/tests/sql/suites/produce/process_multi_out_bad_count_fail.sql
new file mode 100644
index 0000000000..6ad283fafc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_multi_out_bad_count_fail.sql
@@ -0,0 +1,23 @@
+/* custom error:Expected tuple type of size: 3, but got: 2*/
+$udfScript = @@
+def MyFunc(list):
+ return [(int(x.key) % 2, x) for x in list]
+@@;
+
+$record = (SELECT TableRow() FROM plato.Input);
+$recordType =TypeOf(Unwrap($record));
+
+$udf = Python::MyFunc(
+ CallableType(0,
+ StreamType(
+ VariantType(TupleType($recordType, $recordType))
+ ),
+ StreamType($recordType)),
+ $udfScript
+);
+
+$i, $j, $k = (PROCESS plato.Input USING $udf(TableRows()));
+
+select * from $i;
+select * from $j;
+select * from $k;
diff --git a/yt/yql/tests/sql/suites/produce/process_pure_with_sort.sql b/yt/yql/tests/sql/suites/produce/process_pure_with_sort.sql
new file mode 100644
index 0000000000..c03cc257ce
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_pure_with_sort.sql
@@ -0,0 +1,32 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$sorted = ($world, $input, $orderByColumns, $asc) -> {
+ $n = ListLength($orderByColumns);
+
+ $keySelector = LambdaCode(($row) -> {
+ $items = ListMap($orderByColumns,
+ ($x) -> {
+ RETURN FuncCode("Member", $row, AtomCode($x));
+ });
+ RETURN ListCode($items);
+ });
+
+ $sort = EvaluateCode(LambdaCode(($x) -> {
+ return FuncCode("Sort",
+ $x,
+ ListCode(ListReplicate(ReprCode($asc), $n)),
+ $keySelector)
+ }));
+
+ RETURN $sort($input($world));
+};
+
+DEFINE SUBQUERY $source() AS
+ PROCESS Input0;
+END DEFINE;
+
+PROCESS $sorted($source, AsList("key","subkey"), true);
+PROCESS $sorted($source, AsList("value"), true);
+PROCESS $sorted($source, ListCreate(TypeOf("")), true); \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/produce/process_row_and_columns.sql b/yt/yql/tests/sql/suites/produce/process_row_and_columns.sql
new file mode 100644
index 0000000000..8ce580f615
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_row_and_columns.sql
@@ -0,0 +1,19 @@
+/* syntax version 1 */
+/* postgres can not */
+$udfScript = @@
+def processRow(row, tag, separator):
+ return {"value":row.Name + separator + row.Value + separator + tag};
+@@;
+
+$udf = Python::processRow(
+ Callable<(Struct<Name:String, Tag:String, Value:String>, String, String)->Struct<value:String>>,
+ $udfScript
+);
+
+$data = (
+ SELECT key AS Name, value AS Value, subkey AS Tag FROM plato.Input0
+);
+
+$separator = "|";
+
+PROCESS $data USING $udf(TableRow(), Tag, $separator);
diff --git a/yt/yql/tests/sql/suites/produce/process_rows_and_filter.cfg b/yt/yql/tests/sql/suites/produce/process_rows_and_filter.cfg
new file mode 100644
index 0000000000..c1a5b06634
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_rows_and_filter.cfg
@@ -0,0 +1,3 @@
+in Input1 input1.txt
+udf python2_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/process_rows_and_filter.sql b/yt/yql/tests/sql/suites/produce/process_rows_and_filter.sql
new file mode 100644
index 0000000000..1af88830eb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_rows_and_filter.sql
@@ -0,0 +1,23 @@
+/* syntax version 1 */
+/* postgres can not */
+$udfScript = @@
+def processRows(prefix, rowList, separator):
+ result = [];
+ for row in rowList:
+ result.append({"Data" : prefix + row.Name + separator + row.Value});
+
+ return result;
+@@;
+
+$udf = Python::processRows(
+ Callable<(String, Stream<Struct<Name:String, Value:String>>, String)->Stream<Struct<Data:String>>>,
+ $udfScript
+);
+
+$data = (
+ SELECT key AS Name, value AS Value FROM plato.Input1
+);
+
+$prefix = ">>";
+
+PROCESS $data USING $udf($prefix, TableRows(), "=") WHERE Name != "foo";
diff --git a/yt/yql/tests/sql/suites/produce/process_rows_sorted_desc_multi_out.cfg b/yt/yql/tests/sql/suites/produce/process_rows_sorted_desc_multi_out.cfg
new file mode 100644
index 0000000000..a1b36ede45
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_rows_sorted_desc_multi_out.cfg
@@ -0,0 +1,2 @@
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/process_rows_sorted_desc_multi_out.sql b/yt/yql/tests/sql/suites/produce/process_rows_sorted_desc_multi_out.sql
new file mode 100644
index 0000000000..97fb0222b6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_rows_sorted_desc_multi_out.sql
@@ -0,0 +1,30 @@
+USE plato;
+
+$values = ListMap(
+ ListFromRange(0, 30),
+ ($x) -> (AsStruct($x as x))
+);
+
+INSERT INTO @table SELECT * FROM AS_TABLE($values) ORDER BY x DESC;
+
+COMMIT;
+
+$splitter = ($rows) -> {
+ $recordType = StreamItemType(TypeOf($rows));
+ $varType = VariantType(TupleType($recordType, $recordType, $recordType, $recordType));
+ RETURN Yql::OrderedMap($rows, ($row) -> {
+ RETURN CASE $row.x
+ WHEN 0 THEN Variant($row, "0", $varType)
+ WHEN 1 THEN Variant($row, "1", $varType)
+ WHEN 2 THEN Variant($row, "2", $varType)
+ ELSE Variant($row, "3", $varType)
+ END;
+ });
+};
+
+$a, $b, $c, $d = (PROCESS @table USING $splitter(TableRows()));
+
+SELECT * FROM $a;
+SELECT * FROM $b;
+SELECT * FROM $c ORDER BY x DESC;
+SELECT * FROM $d ORDER BY x DESC; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/produce/process_rows_sorted_multi_out.cfg b/yt/yql/tests/sql/suites/produce/process_rows_sorted_multi_out.cfg
new file mode 100644
index 0000000000..a1b36ede45
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_rows_sorted_multi_out.cfg
@@ -0,0 +1,2 @@
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/process_rows_sorted_multi_out.sql b/yt/yql/tests/sql/suites/produce/process_rows_sorted_multi_out.sql
new file mode 100644
index 0000000000..17ecc1de2b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_rows_sorted_multi_out.sql
@@ -0,0 +1,30 @@
+USE plato;
+
+$values = ListMap(
+ ListFromRange(0, 30),
+ ($x) -> (AsStruct($x as x))
+);
+
+INSERT INTO @table SELECT * FROM AS_TABLE($values) ORDER BY x;
+
+COMMIT;
+
+$splitter = ($rows) -> {
+ $recordType = StreamItemType(TypeOf($rows));
+ $varType = VariantType(TupleType($recordType, $recordType, $recordType, $recordType));
+ RETURN Yql::OrderedMap($rows, ($row) -> {
+ RETURN CASE $row.x
+ WHEN 0 THEN Variant($row, "0", $varType)
+ WHEN 1 THEN Variant($row, "1", $varType)
+ WHEN 2 THEN Variant($row, "2", $varType)
+ ELSE Variant($row, "3", $varType)
+ END;
+ });
+};
+
+$a, $b, $c, $d = (PROCESS @table USING $splitter(TableRows()));
+
+SELECT * FROM $a;
+SELECT * FROM $b;
+SELECT * FROM $c ORDER BY x;
+SELECT * FROM $d ORDER BY x; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/produce/process_sorted_desc_multi_out.cfg b/yt/yql/tests/sql/suites/produce/process_sorted_desc_multi_out.cfg
new file mode 100644
index 0000000000..a1b36ede45
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_sorted_desc_multi_out.cfg
@@ -0,0 +1,2 @@
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/process_sorted_desc_multi_out.sql b/yt/yql/tests/sql/suites/produce/process_sorted_desc_multi_out.sql
new file mode 100644
index 0000000000..478eda3d2c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_sorted_desc_multi_out.sql
@@ -0,0 +1,28 @@
+USE plato;
+
+$values = ListMap(
+ ListFromRange(0, 30),
+ ($x) -> (AsStruct($x as x))
+);
+
+INSERT INTO @table SELECT * FROM AS_TABLE($values) ORDER BY x DESC;
+
+COMMIT;
+
+$splitter = ($row) -> {
+ $recordType = TypeOf($row);
+ $varType = VariantType(TupleType($recordType, $recordType, $recordType, $recordType));
+ RETURN CASE $row.x
+ WHEN 0 THEN Variant($row, "0", $varType)
+ WHEN 1 THEN Variant($row, "1", $varType)
+ WHEN 2 THEN Variant($row, "2", $varType)
+ ELSE Variant($row, "3", $varType)
+ END
+};
+
+$a, $b, $c, $d = (PROCESS @table USING $splitter(TableRow()));
+
+SELECT * FROM $a;
+SELECT * FROM $b;
+SELECT * FROM $c ORDER BY x DESC;
+SELECT * FROM $d ORDER BY x DESC; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/produce/process_sorted_multi_out.cfg b/yt/yql/tests/sql/suites/produce/process_sorted_multi_out.cfg
new file mode 100644
index 0000000000..a1b36ede45
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_sorted_multi_out.cfg
@@ -0,0 +1,2 @@
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/process_sorted_multi_out.sql b/yt/yql/tests/sql/suites/produce/process_sorted_multi_out.sql
new file mode 100644
index 0000000000..87a401a806
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_sorted_multi_out.sql
@@ -0,0 +1,28 @@
+USE plato;
+
+$values = ListMap(
+ ListFromRange(0, 30),
+ ($x) -> (AsStruct($x as x))
+);
+
+INSERT INTO @table SELECT * FROM AS_TABLE($values) ORDER BY x;
+
+COMMIT;
+
+$splitter = ($row) -> {
+ $recordType = TypeOf($row);
+ $varType = VariantType(TupleType($recordType, $recordType, $recordType, $recordType));
+ RETURN CASE $row.x
+ WHEN 0 THEN Variant($row, "0", $varType)
+ WHEN 1 THEN Variant($row, "1", $varType)
+ WHEN 2 THEN Variant($row, "2", $varType)
+ ELSE Variant($row, "3", $varType)
+ END
+};
+
+$a, $b, $c, $d = (PROCESS @table USING $splitter(TableRow()));
+
+SELECT * FROM $a;
+SELECT * FROM $b;
+SELECT * FROM $c ORDER BY x;
+SELECT * FROM $d ORDER BY x; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/produce/process_streaming.sql b/yt/yql/tests/sql/suites/produce/process_streaming.sql
new file mode 100644
index 0000000000..1ad7274c79
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_streaming.sql
@@ -0,0 +1,22 @@
+/* syntax version 1 */
+/* postgres can not */
+-- not supported on windows
+
+$input = (
+ SELECT String::JoinFromList(AsList(key, subkey, value), ",") AS Data FROM plato.Input1
+);
+
+$processed = (
+ PROCESS $input USING Streaming::Process(TableRows(), "grep", AsList("[14]"))
+);
+
+$list = (
+ SELECT String::SplitToList(Data, ',') AS DataList FROM $processed
+);
+
+SELECT
+ input.DataList[0] AS key,
+ input.DataList[1] AS subkey,
+ input.DataList[2] AS value
+FROM $list AS input;
+
diff --git a/yt/yql/tests/sql/suites/produce/process_streaming_count.sql b/yt/yql/tests/sql/suites/produce/process_streaming_count.sql
new file mode 100644
index 0000000000..c8111d385a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_streaming_count.sql
@@ -0,0 +1,19 @@
+/* syntax version 1 */
+/* postgres can not */
+-- not supported on windows
+
+$input = (
+ SELECT String::JoinFromList(AsList(key, subkey, value), ",") AS Data FROM plato.Input1
+);
+
+$processed = (
+ PROCESS $input USING Streaming::Process(TableRows(), "grep", AsList("[14]"))
+);
+
+SELECT
+ *
+FROM $processed;
+
+SELECT
+ COUNT(*)
+FROM $processed;
diff --git a/yt/yql/tests/sql/suites/produce/process_streaming_inline_bash.sql b/yt/yql/tests/sql/suites/produce/process_streaming_inline_bash.sql
new file mode 100644
index 0000000000..5737cf807b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_streaming_inline_bash.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+-- not supported on windows
+
+$script = @@
+#!/bin/bash
+cat - | grep $1 | head -n 3 | grep [234]
+@@;
+
+$input = (
+ SELECT String::JoinFromList(AsList(key, subkey, value), ",") AS Data FROM plato.Input1
+);
+
+PROCESS $input USING Streaming::ProcessInline(TableRows(), $script, AsList("bar"));
diff --git a/yt/yql/tests/sql/suites/produce/process_trivial_as_struct.sql b/yt/yql/tests/sql/suites/produce/process_trivial_as_struct.sql
new file mode 100644
index 0000000000..a948124640
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_trivial_as_struct.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+process plato.Input0 using SimpleUdf::Echo(value) as val; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/produce/process_with_assume.cfg b/yt/yql/tests/sql/suites/produce/process_with_assume.cfg
new file mode 100644
index 0000000000..66737248b8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_with_assume.cfg
@@ -0,0 +1,2 @@
+in Input sorted.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/produce/process_with_assume.sql b/yt/yql/tests/sql/suites/produce/process_with_assume.sql
new file mode 100644
index 0000000000..ddb1353299
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_with_assume.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+/* multirun can not */
+/* syntax version 1 */
+use plato;
+
+$udf = YQL::@@(lambda '(x)
+(FlatMap x
+ (lambda '(y) (Just (AsStruct '('key (Concat (String '"0") (Member y 'key))) '('subkey (Member y 'subkey)) '('value (Member y 'value)))))
+))@@;
+
+insert into Output with truncate
+process plato.Input using $udf(TableRows()) assume order by key;
diff --git a/yt/yql/tests/sql/suites/produce/process_with_lambda.sql b/yt/yql/tests/sql/suites/produce/process_with_lambda.sql
new file mode 100644
index 0000000000..e0886faaf8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_with_lambda.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+/* postgres can not */
+$udf = YQL::@@(lambda '(x)
+(FlatMap x
+ (lambda '(y) (AsList y y))
+))@@;
+
+process plato.Input0 using $udf(TableRows());
diff --git a/yt/yql/tests/sql/suites/produce/process_with_lambda_outstream.sql b/yt/yql/tests/sql/suites/produce/process_with_lambda_outstream.sql
new file mode 100644
index 0000000000..0c6c100764
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_with_lambda_outstream.sql
@@ -0,0 +1,27 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$f1 = ($r)->{
+ return $r;
+};
+
+PROCESS Input0 USING $f1(TableRow());
+
+$f2 = ($r)->{
+ return Just($r);
+};
+
+PROCESS Input0 USING $f2(TableRow());
+
+$f3 = ($r)->{
+ return AsList($r,$r);
+};
+
+PROCESS Input0 USING $f3(TableRow());
+
+$f4 = ($r)->{
+ return Yql::Iterator(AsList($r,$r));
+};
+
+PROCESS Input0 USING $f4(TableRow());
diff --git a/yt/yql/tests/sql/suites/produce/process_with_python.sql b/yt/yql/tests/sql/suites/produce/process_with_python.sql
new file mode 100644
index 0000000000..caeb8c2cb3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_with_python.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+/* syntax version 1 */
+$udfScript = @@
+def Dup(s):
+ return [{"value":s},{"value":s}]
+@@;
+
+$udf = Python::Dup(Callable<(String)->List<Struct<value:String>>>, $udfScript);
+
+process plato.Input0 using $udf(value);
diff --git a/yt/yql/tests/sql/suites/produce/process_with_python_as_struct.sql b/yt/yql/tests/sql/suites/produce/process_with_python_as_struct.sql
new file mode 100644
index 0000000000..237c2abef8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_with_python_as_struct.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+/* syntax version 1 */
+$udfScript = @@
+def Dup(s):
+ return [s, s];
+@@;
+
+$udf = Python::Dup(Callable<(String)->List<String>>, $udfScript);
+
+process plato.Input0 using $udf(value) as val;
diff --git a/yt/yql/tests/sql/suites/produce/process_with_python_stream-empty.cfg b/yt/yql/tests/sql/suites/produce/process_with_python_stream-empty.cfg
new file mode 100644
index 0000000000..837223c684
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_with_python_stream-empty.cfg
@@ -0,0 +1,2 @@
+in Input0 empty.txt
+udf python3_udf
diff --git a/yt/yql/tests/sql/suites/produce/process_with_python_stream.cfg b/yt/yql/tests/sql/suites/produce/process_with_python_stream.cfg
new file mode 100644
index 0000000000..e34e70ff55
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_with_python_stream.cfg
@@ -0,0 +1,3 @@
+in Input0 input0.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/process_with_python_stream.sql b/yt/yql/tests/sql/suites/produce/process_with_python_stream.sql
new file mode 100644
index 0000000000..33a0b8f8f7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_with_python_stream.sql
@@ -0,0 +1,23 @@
+/* syntax version 1 */
+/* kikimr can not */
+USE plato;
+
+$udfScript = @@
+def f(input,x):
+ for i in input:
+ yield {
+ 'key': i.key,
+ 'subkey': i.subkey,
+ 'value': i.value,
+ 'pass': x
+ }
+@@;
+
+$udf_stream = Python3::f(
+Callable<
+ (Stream<Struct<key:String,subkey:String,value:String>>,Int32)
+ ->
+ Stream<Struct<key:String,subkey:String,value:String,pass:Int32>>
+>, $udfScript);
+
+PROCESS Input0 using $udf_stream(TableRows(), 2);
diff --git a/yt/yql/tests/sql/suites/produce/process_with_udf.sql b/yt/yql/tests/sql/suites/produce/process_with_udf.sql
new file mode 100644
index 0000000000..f8fb326983
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_with_udf.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+process plato.Input0 using Person::New(key, subkey, coalesce(cast(value as Uint32), 0)); \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/produce/process_with_udf_rows.sql b/yt/yql/tests/sql/suites/produce/process_with_udf_rows.sql
new file mode 100644
index 0000000000..3df9f4df1b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_with_udf_rows.sql
@@ -0,0 +1,17 @@
+/* postgres can not */
+$udf = Python::process(
+Callable<
+ ()->Stream<Struct<result:Int64>>
+>, @@
+def process():
+ for row in range(10):
+ result = row
+ yield locals()
+@@);
+
+$users = (
+ SELECT `key` AS age, `value` AS name FROM plato.Input0
+);
+
+PROCESS $users
+USING $udf();
diff --git a/yt/yql/tests/sql/suites/produce/process_with_udf_validate.sql b/yt/yql/tests/sql/suites/produce/process_with_udf_validate.sql
new file mode 100644
index 0000000000..e5082fdd77
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_with_udf_validate.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+$processed = (
+ process plato.Input0 using Person::New(key, subkey, coalesce(cast(value as Uint32), 0))
+);
+
+PRAGMA config.flags("ValidateUdf", "Lazy");
+SELECT * FROM $processed;
diff --git a/yt/yql/tests/sql/suites/produce/process_with_udf_validate_ignore_broken.sql b/yt/yql/tests/sql/suites/produce/process_with_udf_validate_ignore_broken.sql
new file mode 100644
index 0000000000..de471f14f3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/process_with_udf_validate_ignore_broken.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+
+$processed = (
+ process plato.Input0 using Person::New(key, subkey, Length(SimpleUdf::ReturnBrokenInt()))
+);
+
+PRAGMA config.flags("ValidateUdf", "None");
+SELECT * FROM $processed;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_all.sql b/yt/yql/tests/sql/suites/produce/reduce_all.sql
new file mode 100644
index 0000000000..89362a4454
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_all.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+/* dqfile can not */
+USE plato;
+
+$udfScript = @@
+import functools
+def Len(stream):
+ sums = [functools.reduce(lambda x,y: x + int(y.value), pair[1], 0) for pair in stream]
+ return {"sumByAllVal":functools.reduce(lambda x,y: x + y, sums, 0)}
+@@;
+
+$udf = Python::Len(Callable<(Stream<Tuple<String,Stream<Struct<key:String,subkey:String,value:String>>>>)->Struct<sumByAllVal:Uint32>>, $udfScript);
+
+--INSERT INTO Output
+REDUCE Input1 ON key USING ALL $udf(TableRow());
diff --git a/yt/yql/tests/sql/suites/produce/reduce_all_expr.sql b/yt/yql/tests/sql/suites/produce/reduce_all_expr.sql
new file mode 100644
index 0000000000..d4e194802f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_all_expr.sql
@@ -0,0 +1,16 @@
+/* postgres can not */
+/* syntax version 1 */
+/* dqfile can not */
+USE plato;
+
+$udfScript = @@
+import functools
+def Len(stream):
+ sums = [functools.reduce(lambda x,y: x + y, pair[1], 0) for pair in stream]
+ return {"sumByAllVal":functools.reduce(lambda x,y: x + y, sums, 0)}
+@@;
+
+$udf = Python::Len(Callable<(Stream<Tuple<String,Stream<Uint32>>>)->Struct<sumByAllVal:Uint32>>, $udfScript);
+
+--INSERT INTO Output
+REDUCE Input1 ON key USING ALL $udf(cast(value as uint32) ?? 0);
diff --git a/yt/yql/tests/sql/suites/produce/reduce_all_list.sql b/yt/yql/tests/sql/suites/produce/reduce_all_list.sql
new file mode 100644
index 0000000000..ec08c7922d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_all_list.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+/* postgres can not */
+/* dq can not */
+/* dqfile can not */
+USE plato;
+
+$udfScript = @@
+import functools
+
+def Len(stream):
+ sums = [functools.reduce(lambda x,y: x + int(y.value), pair[1], 0) for pair in stream]
+ return [{"sumByAllVal":functools.reduce(lambda x,y: x + y, sums, 0)}]
+@@;
+
+$udf = Python::Len(Callable<(Stream<Tuple<String,Stream<Struct<key:String,subkey:String,value:String>>>>)->List<Struct<sumByAllVal:Uint32>>>, $udfScript);
+
+--INSERT INTO Output
+REDUCE Input1 ON key USING ALL $udf(TableRow());
diff --git a/yt/yql/tests/sql/suites/produce/reduce_all_list_stream.cfg b/yt/yql/tests/sql/suites/produce/reduce_all_list_stream.cfg
new file mode 100644
index 0000000000..13bb8734c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_all_list_stream.cfg
@@ -0,0 +1,3 @@
+in Input1 input1.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_all_list_stream.sql b/yt/yql/tests/sql/suites/produce/reduce_all_list_stream.sql
new file mode 100644
index 0000000000..5e154426c0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_all_list_stream.sql
@@ -0,0 +1,25 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$udfScript = @@
+import functools
+from yql import TYieldIteration
+
+def Sum(stream):
+ def Gen(stream):
+ sums = []
+ for pair in stream:
+ if isinstance(pair, TYieldIteration):
+ yield pair
+ else:
+ sums.append(functools.reduce(lambda x,y: x + int(y.value), pair[1], 0))
+
+ yield {"sumByAllVal":functools.reduce(lambda x,y: x + y, sums, 0)}
+ return Gen(stream)
+@@;
+
+$udf = Python3::Sum(Callable<(Stream<Tuple<String,Stream<Struct<key:String,subkey:String,value:String>>>>)->Stream<Struct<sumByAllVal:Uint32>>>, $udfScript);
+
+--INSERT INTO Output
+REDUCE Input1 ON key USING ALL $udf(TableRow());
diff --git a/yt/yql/tests/sql/suites/produce/reduce_all_multi_in.sql b/yt/yql/tests/sql/suites/produce/reduce_all_multi_in.sql
new file mode 100644
index 0000000000..6f6750898e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_all_multi_in.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+/* dqfile can not */
+USE plato;
+
+$udfScript = @@
+import functools
+def Len(stream):
+ sums = [functools.reduce(lambda x,y: x + int(y[1].value), pair[1], 0) for pair in stream]
+ return {"sumByAllVal":functools.reduce(lambda x,y: x + y, sums, 0)}
+@@;
+
+$udf = Python::Len(Callable<(Stream<Tuple<String,Stream<Variant<Struct<key:String,subkey:String,value:String>,Struct<key:String,subkey:String,value:String>>>>>)->Struct<sumByAllVal:Uint32>>, $udfScript);
+
+REDUCE Input1, Input1 ON key USING ALL $udf(TableRow());
diff --git a/yt/yql/tests/sql/suites/produce/reduce_all_opt.sql b/yt/yql/tests/sql/suites/produce/reduce_all_opt.sql
new file mode 100644
index 0000000000..467be50696
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_all_opt.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+/* dqfile can not */
+USE plato;
+
+$udfScript = @@
+import functools
+def Len(stream):
+ sums = [functools.reduce(lambda x,y: x + int(y.value), pair[1], 0) for pair in stream]
+ return {"sumByAllVal":functools.reduce(lambda x,y: x + y, sums, 0)}
+@@;
+
+$udf = Python::Len(Callable<(Stream<Tuple<String,Stream<Struct<key:String,subkey:String,value:String>>>>)->Optional<Struct<sumByAllVal:Uint32>>>, $udfScript);
+
+--INSERT INTO Output
+REDUCE Input1 ON key USING ALL $udf(TableRow());
diff --git a/yt/yql/tests/sql/suites/produce/reduce_all_with_python_input_stream-dq_fail.cfg b/yt/yql/tests/sql/suites/produce/reduce_all_with_python_input_stream-dq_fail.cfg
new file mode 100644
index 0000000000..c426164726
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_all_with_python_input_stream-dq_fail.cfg
@@ -0,0 +1,4 @@
+xfail
+in Input1 input1.txt
+udf python3_udf
+providers dq
diff --git a/yt/yql/tests/sql/suites/produce/reduce_all_with_python_input_stream.cfg b/yt/yql/tests/sql/suites/produce/reduce_all_with_python_input_stream.cfg
new file mode 100644
index 0000000000..5ff8b5fcd6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_all_with_python_input_stream.cfg
@@ -0,0 +1,5 @@
+xfail
+in Input1 input1.txt
+udf python3_udf
+providers dq
+
diff --git a/yt/yql/tests/sql/suites/produce/reduce_all_with_python_input_stream.sql b/yt/yql/tests/sql/suites/produce/reduce_all_with_python_input_stream.sql
new file mode 100644
index 0000000000..5aac572264
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_all_with_python_input_stream.sql
@@ -0,0 +1,14 @@
+/* custom error: Cannot execute ScriptUdf over stream/flow inside DQ stage */
+USE plato;
+
+$udfScript = @@
+import functools
+def Len(stream):
+ sums = [functools.reduce(lambda x,y: x + y, pair[1], 0) for pair in stream]
+ return {"sumByAllVal":functools.reduce(lambda x,y: x + y, sums, 0)}
+@@;
+
+$udf = Python3::Len(Callable<(Stream<Tuple<String,Stream<Uint32>>>)->Struct<sumByAllVal:Uint32>>, $udfScript);
+
+--INSERT INTO Output
+REDUCE Input1 ON key USING ALL $udf(cast(value as uint32) ?? 0);
diff --git a/yt/yql/tests/sql/suites/produce/reduce_by_struct.sql b/yt/yql/tests/sql/suites/produce/reduce_by_struct.sql
new file mode 100644
index 0000000000..a36223f7a4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_by_struct.sql
@@ -0,0 +1,16 @@
+USE plato;
+
+INSERT INTO @tmp
+SELECT * FROM AS_TABLE([
+ <|key: <|field1: 1, field2: 1|>, value: 1|>,
+ <|key: <|field1: 1, field2: 1|>, value: 2|>,
+ ]);
+
+COMMIT;
+
+$reducer = ($_key, $stream) -> ($stream);
+
+REDUCE @tmp
+ON key
+USING $reducer(TableRow());
+
diff --git a/yt/yql/tests/sql/suites/produce/reduce_lambda.cfg b/yt/yql/tests/sql/suites/produce/reduce_lambda.cfg
new file mode 100644
index 0000000000..9afdccdc47
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_lambda.cfg
@@ -0,0 +1,2 @@
+in Input1 input1.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_lambda.sql b/yt/yql/tests/sql/suites/produce/reduce_lambda.sql
new file mode 100644
index 0000000000..74d1372d73
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_lambda.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+USE plato;
+
+$udf = YQL::@@(lambda '(key stream) (AsStruct
+ '('key key) '('summ (Collect (Condense stream (Uint32 '0) (lambda '(item state) (Bool 'False)) (lambda '(item state) (Add state item)))))
+))@@;
+
+--INSERT INTO Output
+$res = (REDUCE Input1 ON key USING $udf(cast(value as uint32) ?? 0));
+
+select * from $res order by key;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_lambda_list_mem.sql b/yt/yql/tests/sql/suites/produce/reduce_lambda_list_mem.sql
new file mode 100644
index 0000000000..4593e67ba3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_lambda_list_mem.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+USE plato;
+
+$udf = YQL::@@(lambda '(key stream) (AsStruct
+ '('key key) '('summ (Collect (Condense stream (Uint32 '0) (lambda '(item state) (Bool 'False)) (lambda '(item state) (Add state item)))))
+))@@;
+
+--INSERT INTO Output
+$res = (REDUCE (select AsList("foo") as key, "123" as value) ON key USING $udf(cast(value as uint32) ?? 0));
+
+select * from $res order by key;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_lambda_list_table.cfg b/yt/yql/tests/sql/suites/produce/reduce_lambda_list_table.cfg
new file mode 100644
index 0000000000..13bb8734c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_lambda_list_table.cfg
@@ -0,0 +1,3 @@
+in Input1 input1.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_lambda_list_table.sql b/yt/yql/tests/sql/suites/produce/reduce_lambda_list_table.sql
new file mode 100644
index 0000000000..39aa5ec294
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_lambda_list_table.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+USE plato;
+
+$udf = YQL::@@(lambda '(key stream) (AsStruct
+ '('key key) '('summ (Collect (Condense stream (Uint32 '0) (lambda '(item state) (Bool 'False)) (lambda '(item state) (Add state item)))))
+))@@;
+
+--INSERT INTO Output
+$res = (REDUCE (select AsList(key) as key, value from Input1) ON key USING $udf(cast(value as uint32) ?? 0));
+
+select * from $res order by key;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_lambda_presort_twin.cfg b/yt/yql/tests/sql/suites/produce/reduce_lambda_presort_twin.cfg
new file mode 100644
index 0000000000..9afdccdc47
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_lambda_presort_twin.cfg
@@ -0,0 +1,2 @@
+in Input1 input1.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_lambda_presort_twin.sql b/yt/yql/tests/sql/suites/produce/reduce_lambda_presort_twin.sql
new file mode 100644
index 0000000000..ca37608c70
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_lambda_presort_twin.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+USE plato;
+
+$udf = YQL::@@(lambda '(key stream) (AsStruct
+ '('key key) '('superstring (Collect (Condense stream (String '"") (lambda '(item state) (Bool 'False)) (lambda '(item state)
+ (Concat state (Concat (Member item 'char) (Member item 'num)))
+ ))))
+))@@;
+
+--INSERT INTO Output
+$res = (REDUCE Input1 PRESORT subkey, value desc ON key USING $udf(AsStruct(subkey as char, value as num)));
+
+select * from $res order by key;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_lambda_presort_twin_list.cfg b/yt/yql/tests/sql/suites/produce/reduce_lambda_presort_twin_list.cfg
new file mode 100644
index 0000000000..9afdccdc47
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_lambda_presort_twin_list.cfg
@@ -0,0 +1,2 @@
+in Input1 input1.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_lambda_presort_twin_list.sql b/yt/yql/tests/sql/suites/produce/reduce_lambda_presort_twin_list.sql
new file mode 100644
index 0000000000..65225b9ffa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_lambda_presort_twin_list.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+USE plato;
+
+$udf = YQL::@@(lambda '(key stream) (AsStruct
+ '('key key) '('superstring (Collect (Condense stream (String '"") (lambda '(item state) (Bool 'False)) (lambda '(item state)
+ (Concat state (Concat (Member item 'char) (Member item 'num)))
+ ))))
+))@@;
+
+--INSERT INTO Output
+$res = (REDUCE Input1 PRESORT AsList(subkey), value desc ON key USING $udf(AsStruct(subkey as char, value as num)));
+
+select * from $res order by key;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in-empty.cfg b/yt/yql/tests/sql/suites/produce/reduce_multi_in-empty.cfg
new file mode 100644
index 0000000000..ce36bb4337
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in-empty.cfg
@@ -0,0 +1,2 @@
+in Input empty.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in-sorted.cfg b/yt/yql/tests/sql/suites/produce/reduce_multi_in-sorted.cfg
new file mode 100644
index 0000000000..3f5bebb5a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in-sorted.cfg
@@ -0,0 +1,2 @@
+in Input sorted.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in.cfg b/yt/yql/tests/sql/suites/produce/reduce_multi_in.cfg
new file mode 100644
index 0000000000..4468d3ba29
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in.cfg
@@ -0,0 +1,2 @@
+in Input input0.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in.sql b/yt/yql/tests/sql/suites/produce/reduce_multi_in.sql
new file mode 100644
index 0000000000..c819fb4a58
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in.sql
@@ -0,0 +1,22 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$udf = YQL::@@
+(lambda '(key stream)
+ (PartitionByKey stream
+ (lambda '(item) (Way item))
+ (Void)
+ (Void)
+ (lambda '(listOfPairs)
+ (FlatMap listOfPairs
+ (lambda '(pair) (Just (AsStruct '('key key) '('src (Nth pair '0)) '('cnt (Length (ForwardList (Nth pair '1)))))))
+ )
+ )
+ )
+)
+@@;
+
+$r = (REDUCE Input, Input ON key USING $udf(TableRow()));
+
+SELECT key, src, cnt FROM $r ORDER BY key, src, cnt;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype.cfg b/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype.cfg
new file mode 100644
index 0000000000..4468d3ba29
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype.cfg
@@ -0,0 +1,2 @@
+in Input input0.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype.sql b/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype.sql
new file mode 100644
index 0000000000..b867fc4fdc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype.sql
@@ -0,0 +1,22 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$udf = YQL::@@
+(lambda '(key stream)
+ (PartitionByKey stream
+ (lambda '(item) (Way item))
+ (Void)
+ (Void)
+ (lambda '(listOfPairs)
+ (FlatMap listOfPairs
+ (lambda '(pair) (Just (AsStruct '('key key) '('src (Nth pair '0)) '('cnt (Length (ForwardList (Nth pair '1)))))))
+ )
+ )
+ )
+)
+@@;
+
+$r = (REDUCE Input, `Input{key,subkey}` ON key USING $udf(TableRow()));
+
+SELECT key, src, cnt FROM $r ORDER BY key, src, cnt;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype_assume.cfg b/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype_assume.cfg
new file mode 100644
index 0000000000..470ecf9066
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype_assume.cfg
@@ -0,0 +1,3 @@
+in Input sorted.txt
+out Output output.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype_assume.sql b/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype_assume.sql
new file mode 100644
index 0000000000..159e80f995
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype_assume.sql
@@ -0,0 +1,46 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$user_process = ($key, $t1, $t2, $t3) -> {
+ return AsStruct(
+ $key AS key,
+ COALESCE(cast($t1.subkey as Int32), 0) + COALESCE(cast($t2.subkey as Int32), 0) + COALESCE(cast($t3.subkey as Int32), 0) AS subkey
+ );
+};
+
+$reducer = ($key, $stream) -> {
+ $stream = YQL::OrderedMap($stream, ($item) -> {
+ return AsStruct(
+ YQL::Guess($item, AsAtom("0")).t1 AS t1,
+ YQL::Guess($item, AsAtom("1")).t2 AS t2,
+ YQL::Guess($item, AsAtom("2")).t3 AS t3,
+ );
+ });
+ $recs = YQL::Collect(YQL::Condense1(
+ $stream,
+ ($item) -> {return AsStruct(
+ $item.t1 AS t1,
+ $item.t2 AS t2,
+ $item.t3 AS t3,
+ );},
+ ($_item, $_state) -> {return false;},
+ ($item, $state) -> {return AsStruct(
+ COALESCE($state.t1, $item.t1) AS t1,
+ COALESCE($state.t2, $item.t2) AS t2,
+ COALESCE($state.t3, $item.t3) AS t3,
+ );},
+ ));
+ $rec = Ensure($recs, ListLength($recs) == 1ul)[0];
+ return $user_process($key, $rec.t1, $rec.t2, $rec.t3);
+};
+
+INSERT INTO Output WITH TRUNCATE
+REDUCE
+ (SELECT key, TableRow() AS t1 FROM Input),
+ (SELECT key, TableRow() AS t2 FROM Input),
+ (SELECT key, TableRow() AS t3 FROM Input)
+ON key
+USING $reducer(TableRow())
+ASSUME ORDER BY key;
+
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype_assume_keytuple.cfg b/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype_assume_keytuple.cfg
new file mode 100644
index 0000000000..470ecf9066
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype_assume_keytuple.cfg
@@ -0,0 +1,3 @@
+in Input sorted.txt
+out Output output.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype_assume_keytuple.sql b/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype_assume_keytuple.sql
new file mode 100644
index 0000000000..e1f71c3953
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_difftype_assume_keytuple.sql
@@ -0,0 +1,45 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$user_process = ($key, $t1, $t2, $t3) -> {
+ return AsStruct(
+ $key.0 AS key,
+ COALESCE(cast($t1.subkey as Int32), 0) + COALESCE(cast($t2.subkey as Int32), 0) + COALESCE(cast($t3.subkey as Int32), 0) AS subkey
+ );
+};
+
+$reducer = ($key, $stream) -> {
+ $stream = YQL::OrderedMap($stream, ($item) -> {
+ return AsStruct(
+ YQL::Guess($item, AsAtom("0")).t1 AS t1,
+ YQL::Guess($item, AsAtom("1")).t2 AS t2,
+ YQL::Guess($item, AsAtom("2")).t3 AS t3,
+ );
+ });
+ $recs = YQL::Collect(YQL::Condense1(
+ $stream,
+ ($item) -> {return AsStruct(
+ $item.t1 AS t1,
+ $item.t2 AS t2,
+ $item.t3 AS t3,
+ );},
+ ($_item, $_state) -> {return false;},
+ ($item, $state) -> {return AsStruct(
+ COALESCE($state.t1, $item.t1) AS t1,
+ COALESCE($state.t2, $item.t2) AS t2,
+ COALESCE($state.t3, $item.t3) AS t3,
+ );},
+ ));
+ $rec = Ensure($recs, ListLength($recs) == 1ul)[0];
+ return $user_process($key, $rec.t1, $rec.t2, $rec.t3);
+};
+
+INSERT INTO Output WITH TRUNCATE
+REDUCE
+ (SELECT key, subkey, TableRow() AS t1 FROM Input),
+ (SELECT key, subkey, TableRow() AS t2 FROM Input),
+ (SELECT key, subkey, TableRow() AS t3 FROM Input)
+ON key, subkey
+USING $reducer(TableRow())
+ASSUME ORDER BY key, subkey;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_keytuple.cfg b/yt/yql/tests/sql/suites/produce/reduce_multi_in_keytuple.cfg
new file mode 100644
index 0000000000..4468d3ba29
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_keytuple.cfg
@@ -0,0 +1,2 @@
+in Input input0.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_keytuple.sql b/yt/yql/tests/sql/suites/produce/reduce_multi_in_keytuple.sql
new file mode 100644
index 0000000000..fe9bd349ae
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_keytuple.sql
@@ -0,0 +1,21 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+$udf = YQL::@@
+(lambda '(key stream)
+ (PartitionByKey stream
+ (lambda '(item) (Way item))
+ (Void)
+ (Void)
+ (lambda '(listOfPairs)
+ (FlatMap listOfPairs
+ (lambda '(pair) (Just (AsStruct '('key (Nth key '0)) '('src (Nth pair '0)) '('cnt (Length (ForwardList (Nth pair '1)))))))
+ )
+ )
+ )
+)
+@@;
+
+$r = (REDUCE Input, Input ON key,subkey USING $udf(TableRow()));
+
+SELECT key, src, cnt FROM $r ORDER BY key, src, cnt;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_keytuple_difftype.cfg b/yt/yql/tests/sql/suites/produce/reduce_multi_in_keytuple_difftype.cfg
new file mode 100644
index 0000000000..4468d3ba29
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_keytuple_difftype.cfg
@@ -0,0 +1,2 @@
+in Input input0.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_keytuple_difftype.sql b/yt/yql/tests/sql/suites/produce/reduce_multi_in_keytuple_difftype.sql
new file mode 100644
index 0000000000..ea6a236d22
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_keytuple_difftype.sql
@@ -0,0 +1,22 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$udf = YQL::@@
+(lambda '(key stream)
+ (PartitionByKey stream
+ (lambda '(item) (Way item))
+ (Void)
+ (Void)
+ (lambda '(listOfPairs)
+ (FlatMap listOfPairs
+ (lambda '(pair) (Just (AsStruct '('key (Nth key '0)) '('src (Nth pair '0)) '('cnt (Length (ForwardList (Nth pair '1)))))))
+ )
+ )
+ )
+)
+@@;
+
+$r = (REDUCE Input, `Input{key,subkey}` ON key,subkey USING $udf(TableRow()));
+
+SELECT key, src, cnt FROM $r ORDER BY key, src, cnt;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_presort.cfg b/yt/yql/tests/sql/suites/produce/reduce_multi_in_presort.cfg
new file mode 100644
index 0000000000..4468d3ba29
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_presort.cfg
@@ -0,0 +1,2 @@
+in Input input0.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_presort.sql b/yt/yql/tests/sql/suites/produce/reduce_multi_in_presort.sql
new file mode 100644
index 0000000000..3712268059
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_presort.sql
@@ -0,0 +1,22 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$udf = YQL::@@
+(lambda '(key stream)
+ (PartitionByKey stream
+ (lambda '(item) (Way item))
+ (Void)
+ (Void)
+ (lambda '(listOfPairs)
+ (FlatMap listOfPairs
+ (lambda '(pair) (Just (AsStruct '('key key) '('src (Nth pair '0)) '('cnt (Length (ForwardList (Nth pair '1)))))))
+ )
+ )
+ )
+)
+@@;
+
+$r = (REDUCE Input, Input PRESORT value, key || subkey ON key USING $udf(TableRow()));
+
+SELECT key, src, cnt FROM $r ORDER BY key, src, cnt;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_ref.cfg b/yt/yql/tests/sql/suites/produce/reduce_multi_in_ref.cfg
new file mode 100644
index 0000000000..4468d3ba29
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_ref.cfg
@@ -0,0 +1,2 @@
+in Input input0.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_ref.sql b/yt/yql/tests/sql/suites/produce/reduce_multi_in_ref.sql
new file mode 100644
index 0000000000..9587d1a453
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_ref.sql
@@ -0,0 +1,24 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$udf = YQL::@@
+(lambda '(key stream)
+ (PartitionByKey stream
+ (lambda '(item) (Way item))
+ (Void)
+ (Void)
+ (lambda '(listOfPairs)
+ (FlatMap listOfPairs
+ (lambda '(pair) (Just (AsStruct '('key key) '('src (Nth pair '0)) '('cnt (Length (ForwardList (Nth pair '1)))))))
+ )
+ )
+ )
+)
+@@;
+
+$src = (select * from plato.Input where key > "200");
+
+$r = (REDUCE Input, (select * from Input where key > "100"), $src ON key USING $udf(TableRow()));
+
+SELECT key, src, cnt FROM $r ORDER BY key, src, cnt;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_sampling-sorted.cfg b/yt/yql/tests/sql/suites/produce/reduce_multi_in_sampling-sorted.cfg
new file mode 100644
index 0000000000..2334ceb124
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_sampling-sorted.cfg
@@ -0,0 +1,2 @@
+in Input sorted1.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_sampling.cfg b/yt/yql/tests/sql/suites/produce/reduce_multi_in_sampling.cfg
new file mode 100644
index 0000000000..fb4fb16059
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_sampling.cfg
@@ -0,0 +1,2 @@
+in Input input2.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_sampling.sql b/yt/yql/tests/sql/suites/produce/reduce_multi_in_sampling.sql
new file mode 100644
index 0000000000..a613cdf8db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_sampling.sql
@@ -0,0 +1,23 @@
+/* syntax version 1 */
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 16 */
+USE plato;
+
+$udf = YQL::@@
+(lambda '(key stream)
+ (PartitionByKey stream
+ (lambda '(item) (Way item))
+ (Void)
+ (Void)
+ (lambda '(listOfPairs)
+ (FlatMap listOfPairs
+ (lambda '(pair) (Just (AsStruct '('key key) '('src (Nth pair '0)) '('cnt (Length (ForwardList (Nth pair '1)))))))
+ )
+ )
+ )
+)
+@@;
+
+$r = (REDUCE Input SAMPLE(0.1), Input SAMPLE(0.1) ON key USING $udf(TableRow()));
+
+SELECT key, src, cnt FROM $r ORDER BY key, src, cnt;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_stage_and_flatmap.cfg b/yt/yql/tests/sql/suites/produce/reduce_multi_in_stage_and_flatmap.cfg
new file mode 100644
index 0000000000..4468d3ba29
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_stage_and_flatmap.cfg
@@ -0,0 +1,2 @@
+in Input input0.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_in_stage_and_flatmap.sql b/yt/yql/tests/sql/suites/produce/reduce_multi_in_stage_and_flatmap.sql
new file mode 100644
index 0000000000..1e694e0280
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_in_stage_and_flatmap.sql
@@ -0,0 +1,24 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$udf = YQL::@@
+(lambda '(key stream)
+ (PartitionByKey stream
+ (lambda '(item) (Way item))
+ (Void)
+ (Void)
+ (lambda '(listOfPairs)
+ (FlatMap listOfPairs
+ (lambda '(pair) (Just (AsStruct '('key key) '('src (Nth pair '0)) '('cnt (Length (ForwardList (Nth pair '1)))))))
+ )
+ )
+ )
+)
+@@;
+
+$r = (REDUCE Input, AS_TABLE(ListMap(ListFromRange(0,10), ($val) -> {
+ RETURN AsStruct(Cast($val AS String) AS key, Cast($val AS String) AS subkey, Cast($val AS String) AS value)
+})) ON key USING $udf(TableRow()));
+
+SELECT key, src, cnt FROM $r ORDER BY key, src, cnt; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_out.cfg b/yt/yql/tests/sql/suites/produce/reduce_multi_out.cfg
new file mode 100644
index 0000000000..f73dce605c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_out.cfg
@@ -0,0 +1,4 @@
+in Input input1.txt
+res result.txt
+udf python2_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_multi_out.sql b/yt/yql/tests/sql/suites/produce/reduce_multi_out.sql
new file mode 100644
index 0000000000..079ff55899
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_multi_out.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$udfScript = @@
+import functools
+
+def Len(key, input):
+ sumByValue = functools.reduce(lambda x,y: x + int(y.value), input, 0)
+ return (sumByValue % 2, {"sumByVal": sumByValue})
+@@;
+
+$udf = Python::Len(Callable<(String, Stream<Struct<key:String,subkey:String,value:String>>)->Variant<Struct<sumByVal:Uint32>,Struct<sumByVal:Uint32>>>, $udfScript);
+
+$i, $j = (REDUCE Input ON key USING $udf(TableRow()));
+
+select * from $i order by sumByVal;
+select * from $j order by sumByVal;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_subfields-sorted.cfg b/yt/yql/tests/sql/suites/produce/reduce_subfields-sorted.cfg
new file mode 100644
index 0000000000..1cce20b68c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_subfields-sorted.cfg
@@ -0,0 +1,3 @@
+in Input sorted.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_subfields.cfg b/yt/yql/tests/sql/suites/produce/reduce_subfields.cfg
new file mode 100644
index 0000000000..4a1369f183
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_subfields.cfg
@@ -0,0 +1,3 @@
+in Input input0.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_subfields.sql b/yt/yql/tests/sql/suites/produce/reduce_subfields.sql
new file mode 100644
index 0000000000..3518cac97e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_subfields.sql
@@ -0,0 +1,25 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+
+$udfScript = @@
+def f(key, input):
+ for i in input:
+ yield {
+ 'key': i.key,
+ 'value': i.value,
+ 'pass': 10
+ }
+@@;
+
+$udf_stream = Python3::f(
+Callable<
+ (String,Stream<Struct<key:String,value:String>>)
+ ->
+ Stream<Struct<key:String,value:String,pass:Int32>>
+>, $udfScript);
+
+
+REDUCE Input
+ON key
+USING $udf_stream(TableRow());
diff --git a/yt/yql/tests/sql/suites/produce/reduce_typeinfo.cfg b/yt/yql/tests/sql/suites/produce/reduce_typeinfo.cfg
new file mode 100644
index 0000000000..520f10d8f9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_typeinfo.cfg
@@ -0,0 +1,3 @@
+in Input0 input0.txt
+udf simple_udf
+providers yt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/produce/reduce_typeinfo.sql b/yt/yql/tests/sql/suites/produce/reduce_typeinfo.sql
new file mode 100644
index 0000000000..bebc744f63
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_typeinfo.sql
@@ -0,0 +1,18 @@
+/* postgres can not */
+/* syntax version 1 */
+/* ignore runonopt plan diff */
+use plato;
+
+pragma warning("disable", "4510");
+
+$r1 = REDUCE Input0 ON key USING ALL SimpleUdf::GenericAsStruct(TableRows());
+$r2 = REDUCE Input0 ON key USING SimpleUdf::GenericAsStruct(cast(TableRow().subkey as Int32));
+$r3 = REDUCE Input0 ON key USING ALL SimpleUdf::GenericAsStruct(TableRow().key);
+
+
+select * from (select * from $r1 flatten list by arg_0) flatten columns order by key, subkey;
+select arg_0 as key, ListSort(YQL::Collect(arg_1)) as values from $r2 order by key;
+
+
+select FormatType(TypeOf(TableRow())) from $r1 limit 1;
+select FormatType(TypeOf(TableRow())) from $r3 limit 1;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_assume.cfg b/yt/yql/tests/sql/suites/produce/reduce_with_assume.cfg
new file mode 100644
index 0000000000..470ecf9066
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_assume.cfg
@@ -0,0 +1,3 @@
+in Input sorted.txt
+out Output output.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_assume.sql b/yt/yql/tests/sql/suites/produce/reduce_with_assume.sql
new file mode 100644
index 0000000000..3f51be0d12
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_assume.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+/* multirun can not */
+/* syntax version 1 */
+USE plato;
+
+$udf = YQL::@@(lambda '(key stream) (AsStruct
+ '('key key) '('sum (Collect (Condense stream (Uint32 '0) (lambda '(item state) (Bool 'False)) (lambda '(item state) (Add state item)))))
+))@@;
+
+INSERT INTO Output
+REDUCE Input ON key USING $udf(cast(subkey as uint32) ?? 0) ASSUME ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_assume_in_subquery.cfg b/yt/yql/tests/sql/suites/produce/reduce_with_assume_in_subquery.cfg
new file mode 100644
index 0000000000..c3fd8a0bcd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_assume_in_subquery.cfg
@@ -0,0 +1,2 @@
+in Input input2.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_assume_in_subquery.sql b/yt/yql/tests/sql/suites/produce/reduce_with_assume_in_subquery.sql
new file mode 100644
index 0000000000..3913353e12
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_assume_in_subquery.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+
+$udf = YQL::@@(lambda '(key stream) (AsStruct
+ '('key key) '('summ (Collect (Condense stream (Nothing (OptionalType (DataType 'String))) (lambda '(item state) (Bool 'False)) (lambda '(item state) (Coalesce state (Just item))))))
+))@@;
+
+$in = (SELECT * FROM Input ASSUME ORDER BY key, subkey);
+
+$res = (REDUCE $in ON key USING $udf(value));
+
+SELECT * FROM $res ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_flat_lambda.sql b/yt/yql/tests/sql/suites/produce/reduce_with_flat_lambda.sql
new file mode 100644
index 0000000000..b0e1e56200
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_flat_lambda.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+/* kikimr can not */
+USE plato;
+
+$udf_stream = ($input)->{ return $input };
+
+$res = REDUCE Input0 ON key using all $udf_stream(TableRows());
+
+select * from $res order by value;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_flat_python_stream.cfg b/yt/yql/tests/sql/suites/produce/reduce_with_flat_python_stream.cfg
new file mode 100644
index 0000000000..e34e70ff55
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_flat_python_stream.cfg
@@ -0,0 +1,3 @@
+in Input0 input0.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_flat_python_stream.sql b/yt/yql/tests/sql/suites/produce/reduce_with_flat_python_stream.sql
new file mode 100644
index 0000000000..8d164a65c9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_flat_python_stream.sql
@@ -0,0 +1,30 @@
+/* syntax version 1 */
+/* kikimr can not */
+USE plato;
+
+$udfScript = @@
+def f(input):
+ s = []
+ last_key = None
+ for i in input:
+ if last_key is not None and last_key != i.key:
+ s = []
+ s.append(i.value)
+ last_key = i.key
+ yield {
+ 'key': i.key,
+ 'subkey1': i.subkey,
+ 'value': b''.join(s),
+ }
+@@;
+
+$udf_stream = Python3::f(
+Callable<
+ (Stream<Struct<key:String,subkey:String,value:String>>)
+ ->
+ Stream<Struct<key:String,subkey1:String,value:String>>
+>, $udfScript);
+
+$res = REDUCE Input0 PRESORT value ON key using all $udf_stream(TableRows()) ;
+
+select * from $res order by key, value; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_presort_diff_order.cfg b/yt/yql/tests/sql/suites/produce/reduce_with_presort_diff_order.cfg
new file mode 100644
index 0000000000..6be0f54054
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_presort_diff_order.cfg
@@ -0,0 +1,2 @@
+in Input input0.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_presort_diff_order.sql b/yt/yql/tests/sql/suites/produce/reduce_with_presort_diff_order.sql
new file mode 100644
index 0000000000..9bdca4b7d9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_presort_diff_order.sql
@@ -0,0 +1,32 @@
+USE plato;
+
+insert into @skv1v2
+select key, subkey, value as value1, value as value2 from Input order by subkey, key, value1, value2;
+
+insert into @skv2v1
+select key, subkey, value as value1, value as value2 from Input order by subkey, key, value2, value1;
+
+insert into @ksv1v2
+select key, subkey, value as value1, value as value2 from Input order by key, subkey, value1, value2;
+
+commit;
+
+$udf = YQL::@@(lambda '(key stream) (AsStruct
+ '('key key) '('summ (Collect (Condense stream (Nothing (OptionalType (DataType 'String))) (lambda '(item state) (Bool 'False)) (lambda '(item state) (Coalesce state (Just item))))))
+))@@;
+
+select * from (
+ reduce concat(@skv1v2, @skv1v2) presort value1, value2 on key, subkey using $udf(value1) --YtReduce
+) order by key, summ;
+
+select * from (
+ reduce @ksv1v2 presort value2, value1 on key, subkey using $udf(value1) --YtMapReduce
+) order by key, summ;
+
+select * from (
+ reduce concat(@skv1v2, @skv2v1) presort value1, value2 on key, subkey using $udf(value1) --YtMapReduce
+) order by key, summ;
+
+select * from (
+ reduce concat(@skv1v2, @ksv1v2) presort value1, value2 on key, subkey using $udf(value1) --YtMapReduce
+) order by key, summ;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python.cfg b/yt/yql/tests/sql/suites/produce/reduce_with_python.cfg
new file mode 100644
index 0000000000..13bb8734c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python.cfg
@@ -0,0 +1,3 @@
+in Input1 input1.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python.sql b/yt/yql/tests/sql/suites/produce/reduce_with_python.sql
new file mode 100644
index 0000000000..6bdf0efb24
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python.sql
@@ -0,0 +1,16 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+
+$udfScript = @@
+import functools
+def Len(key, input):
+ return {"value":functools.reduce(lambda x,y: x + 1, input, 0)}
+@@;
+
+$udf = Python::Len(Callable<(String, Stream<String>)->Struct<value:Uint32>>, $udfScript);
+
+--INSERT INTO Output
+$res = (REDUCE Input1 ON key USING $udf(value));
+
+select * from $res order by value;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_few_keys.cfg b/yt/yql/tests/sql/suites/produce/reduce_with_python_few_keys.cfg
new file mode 100644
index 0000000000..13bb8734c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_few_keys.cfg
@@ -0,0 +1,3 @@
+in Input1 input1.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_few_keys.sql b/yt/yql/tests/sql/suites/produce/reduce_with_python_few_keys.sql
new file mode 100644
index 0000000000..346c977f16
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_few_keys.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+/* syntax version 1 */
+$udfScript = @@
+import functools
+def Len(val_key, input):
+ return {"zuza": {val_key[0] + b"-" + str(val_key[1]).encode('utf-8'): functools.reduce(lambda x,y: x + 1, input, 0)}}
+@@;
+
+$udf = Python::Len(Callable<(Tuple<String,Uint32>, Stream<String>)->Struct<zuza:Dict<String, Uint32>>>, $udfScript);
+
+$data = (select Cast(value as uint32) ?? 0 as kk, value as ss, key as val from plato.Input1);
+
+$res = (reduce $data on val, kk using $udf(ss));
+
+select * from $res order by Yql::ToOptional(Yql::DictKeys(zuza));
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_few_keys_stream.cfg b/yt/yql/tests/sql/suites/produce/reduce_with_python_few_keys_stream.cfg
new file mode 100644
index 0000000000..13bb8734c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_few_keys_stream.cfg
@@ -0,0 +1,3 @@
+in Input1 input1.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_few_keys_stream.sql b/yt/yql/tests/sql/suites/produce/reduce_with_python_few_keys_stream.sql
new file mode 100644
index 0000000000..aac5ae32b1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_few_keys_stream.sql
@@ -0,0 +1,19 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+$udfScript = @@
+import functools
+
+def Len(val_key, input):
+ return {"zuza": {val_key[0] + b"-" + str(val_key[1]).encode('utf-8'): functools.reduce(lambda x, y: x + 1, input, 0)}}
+@@;
+
+$udf = Python3::Len(Callable<(Tuple<String,Uint32>, Stream<String>)->Struct<zuza:Dict<String, Uint32>>>, $udfScript);
+
+$data = (select Cast(value as uint32) ?? 0 as kk, value as ss, key as val from Input1);
+
+--insert into Output
+$res = (reduce $data on val, kk using $udf(ss));
+
+select * from $res order by DictKeys(zuza);
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_filter_and_having.cfg b/yt/yql/tests/sql/suites/produce/reduce_with_python_filter_and_having.cfg
new file mode 100644
index 0000000000..13bb8734c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_filter_and_having.cfg
@@ -0,0 +1,3 @@
+in Input1 input1.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_filter_and_having.sql b/yt/yql/tests/sql/suites/produce/reduce_with_python_filter_and_having.sql
new file mode 100644
index 0000000000..dc3beb4025
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_filter_and_having.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+
+$udfScript = @@
+import functools
+def Len(key, input):
+ return {"total":functools.reduce(lambda x,y: x + 1, input, 0)}
+@@;
+
+$udf = Python::Len(Callable<(String, Stream<String>)->Struct<total:Uint32>>, $udfScript);
+
+--INSERT INTO Output
+REDUCE Input1 ON key USING $udf(value) WHERE cast(value as int) > 1 HAVING total > 3;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_having.cfg b/yt/yql/tests/sql/suites/produce/reduce_with_python_having.cfg
new file mode 100644
index 0000000000..13bb8734c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_having.cfg
@@ -0,0 +1,3 @@
+in Input1 input1.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_having.sql b/yt/yql/tests/sql/suites/produce/reduce_with_python_having.sql
new file mode 100644
index 0000000000..b226e6f399
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_having.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+
+$udfScript = @@
+import functools
+def Len(key, input):
+ return {"count":functools.reduce(lambda x,y: x + 1, input, 0)}
+@@;
+
+$udf = Python::Len(Callable<(String, Stream<String>)->Struct<count:Uint32>>, $udfScript);
+
+--INSERT INTO Output
+REDUCE Input1 ON key USING $udf(value) HAVING count > 4;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_input_stream.cfg b/yt/yql/tests/sql/suites/produce/reduce_with_python_input_stream.cfg
new file mode 100644
index 0000000000..c426164726
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_input_stream.cfg
@@ -0,0 +1,4 @@
+xfail
+in Input1 input1.txt
+udf python3_udf
+providers dq
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_input_stream.sql b/yt/yql/tests/sql/suites/produce/reduce_with_python_input_stream.sql
new file mode 100644
index 0000000000..68bf6c7d72
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_input_stream.sql
@@ -0,0 +1,14 @@
+/* custom error: Cannot execute ScriptUdf over stream/flow inside DQ stage */
+USE plato;
+
+$udfScript = @@
+import functools
+def Len(key, input):
+ return {"value":functools.reduce(lambda x,y: x + 1, input, 0)}
+@@;
+
+$udf = Python::Len(Callable<(String, Stream<String>)->Struct<value:Uint32>>, $udfScript);
+
+$res = (REDUCE Input1 ON key USING $udf(value));
+
+select * from $res order by value;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_presort.cfg b/yt/yql/tests/sql/suites/produce/reduce_with_python_presort.cfg
new file mode 100644
index 0000000000..13bb8734c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_presort.cfg
@@ -0,0 +1,3 @@
+in Input1 input1.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_presort.sql b/yt/yql/tests/sql/suites/produce/reduce_with_python_presort.sql
new file mode 100644
index 0000000000..fa55b8bce2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_presort.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+
+$udfScript = @@
+def Len(val_key, input):
+ return {"joined": {val_key: b", ".join(input)}}
+@@;
+
+$udf = Python3::Len(Callable<(String, Stream<String>)->Struct<joined:Dict<String, String>>>, $udfScript);
+
+--INSERT INTO Output
+$res = (REDUCE Input1 PRESORT value DESC ON key USING $udf(subkey));
+
+select * from $res order by Yql::ToOptional(Yql::DictKeys(joined));
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_presort_stream.cfg b/yt/yql/tests/sql/suites/produce/reduce_with_python_presort_stream.cfg
new file mode 100644
index 0000000000..13bb8734c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_presort_stream.cfg
@@ -0,0 +1,3 @@
+in Input1 input1.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_presort_stream.sql b/yt/yql/tests/sql/suites/produce/reduce_with_python_presort_stream.sql
new file mode 100644
index 0000000000..276c70136c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_presort_stream.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+
+$udfScript = @@
+def Len(val_key, input):
+ return {"joined": {val_key: b", ".join(input)}}
+@@;
+
+$udf = Python::Len(Callable<(String, Stream<String>)->Struct<joined:Dict<String, String>>>, $udfScript);
+
+--INSERT INTO Output
+$res = (REDUCE Input1 PRESORT value DESC ON key USING $udf(subkey));
+
+select * from $res order by DictKeys(joined);
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_row.cfg b/yt/yql/tests/sql/suites/produce/reduce_with_python_row.cfg
new file mode 100644
index 0000000000..13bb8734c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_row.cfg
@@ -0,0 +1,3 @@
+in Input1 input1.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_row.sql b/yt/yql/tests/sql/suites/produce/reduce_with_python_row.sql
new file mode 100644
index 0000000000..6d3371d649
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_row.sql
@@ -0,0 +1,17 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$udfScript = @@
+import functools
+
+def Len(key, input):
+ return {"sumByVal": functools.reduce(lambda x,y: x + int(y.value), input, 0)}
+@@;
+
+$udf = Python3::Len(Callable<(String, Stream<Struct<key:String,subkey:String,value:String>>)->Struct<sumByVal:Uint32>>, $udfScript);
+
+--INSERT INTO Output
+$res = (REDUCE Input1 ON key USING $udf(TableRow()));
+
+select * from $res order by sumByVal;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_row_repack.cfg b/yt/yql/tests/sql/suites/produce/reduce_with_python_row_repack.cfg
new file mode 100644
index 0000000000..13bb8734c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_row_repack.cfg
@@ -0,0 +1,3 @@
+in Input1 input1.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_python_row_repack.sql b/yt/yql/tests/sql/suites/produce/reduce_with_python_row_repack.sql
new file mode 100644
index 0000000000..1eba13ec1f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_python_row_repack.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$udfScript = @@
+import functools
+def Len(key, input):
+ return {"sumByValAndKeyLen":functools.reduce(lambda x,y: x + int(y.value) + len(y.key), input, 0)}
+@@;
+
+$udf = Python::Len(Callable<(String, Stream<Struct<key:String,value:String>>)->Struct<sumByValAndKeyLen:Uint32>>, $udfScript);
+
+--INSERT INTO Output
+$res = (REDUCE Input1 ON key USING $udf(AsStruct(TableRow().value as value, TableRow().subkey as key)));
+
+select * from $res order by sumByValAndKeyLen;
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_trivial_remaps.cfg b/yt/yql/tests/sql/suites/produce/reduce_with_trivial_remaps.cfg
new file mode 100644
index 0000000000..1516335c81
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_trivial_remaps.cfg
@@ -0,0 +1,3 @@
+in Input1 sorted1.txt
+in Input2 sorted2.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/produce/reduce_with_trivial_remaps.sql b/yt/yql/tests/sql/suites/produce/reduce_with_trivial_remaps.sql
new file mode 100644
index 0000000000..65e70e8715
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/reduce_with_trivial_remaps.sql
@@ -0,0 +1,15 @@
+use plato;
+pragma warning("disable", "4510");
+
+$udf = ($_key, $stream) -> {
+ $init = ($item) -> (AsStruct(1u as cnt, $item as row));
+ $switch = ($_item, $_state) -> (false);
+ $update = ($item, $state) -> (AsStruct($state.cnt + 1u as cnt,
+ if(($item.value > $state.row.value) ?? false, $item, $state.row) as row));
+ $state = YQL::Collect(YQL::Condense1($stream, $init, $switch, $update));
+ return $state;
+};
+
+REDUCE CONCAT(Input1,Input2)
+presort subkey
+ON key USING $udf(TableRow());
diff --git a/yt/yql/tests/sql/suites/produce/sorted.txt.attr b/yt/yql/tests/sql/suites/produce/sorted.txt.attr
new file mode 100644
index 0000000000..391c1a05f6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/sorted.txt.attr
@@ -0,0 +1,11 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1;1;1;];
+ "SortedBy"=["key";"subkey";"value";];
+ "SortedByTypes"=[["DataType";"String";];["DataType";"String";];["DataType";"String";];];
+ "SortMembers"=["key";"subkey";"value";];
+}}
diff --git a/yt/yql/tests/sql/suites/produce/sorted1.txt.attr b/yt/yql/tests/sql/suites/produce/sorted1.txt.attr
new file mode 100644
index 0000000000..391c1a05f6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/sorted1.txt.attr
@@ -0,0 +1,11 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1;1;1;];
+ "SortedBy"=["key";"subkey";"value";];
+ "SortedByTypes"=[["DataType";"String";];["DataType";"String";];["DataType";"String";];];
+ "SortMembers"=["key";"subkey";"value";];
+}}
diff --git a/yt/yql/tests/sql/suites/produce/sorted2.txt.attr b/yt/yql/tests/sql/suites/produce/sorted2.txt.attr
new file mode 100644
index 0000000000..5d3821a576
--- /dev/null
+++ b/yt/yql/tests/sql/suites/produce/sorted2.txt.attr
@@ -0,0 +1,11 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"Utf8"]]
+ ]];
+ "SortDirections"=[1;1;1;];
+ "SortedBy"=["key";"subkey";"value";];
+ "SortedByTypes"=[["DataType";"String";];["DataType";"String";];["DataType";"Utf8";];];
+ "SortMembers"=["key";"subkey";"value";];
+}}
diff --git a/yt/yql/tests/sql/suites/result_types/containers.sql b/yt/yql/tests/sql/suites/result_types/containers.sql
new file mode 100644
index 0000000000..8993440e99
--- /dev/null
+++ b/yt/yql/tests/sql/suites/result_types/containers.sql
@@ -0,0 +1,45 @@
+$f = ($value) -> {
+ return <|
+ "plain":$value,
+ "opt_1+":just($value),
+ "opt_1-":nothing(optionaltype(typeof($value))),
+ "opt_2++":just(just($value)),
+ "opt_2+-":just(nothing(optionaltype(typeof($value)))),
+ "opt_2--":nothing(optionaltype(optionaltype(typeof($value)))),
+ "tuple":($value,),
+ |>;
+};
+
+$data = <|
+ "list0": ListCreate(int32),
+ "list1": [1],
+ "list2": [1,2],
+ "tuple0": (),
+ "tuple1": (1,),
+ "tuple2": (1,"foo"),
+ "struct0": <||>,
+ "struct1": <|a:1|>,
+ "struct2": <|a:1,b:"foo"|>,
+ "vartuple1": Variant(1,"0",Variant<Int32>),
+ "vartuple2a": Variant(1,"0",Variant<Int32,String>),
+ "vartuple2b": Variant("foo","1",Variant<Int32,String>),
+ "varstruct1": Variant(1,"a",Variant<a:Int32>),
+ "varstruct2a": Variant(1,"a",Variant<a:Int32,b:String>),
+ "varstruct2b": Variant("foo","b",Variant<a:Int32,b:String>),
+ "enum1": AsEnum("foo"),
+ "enum2a": Enum("foo",Enum<"foo","bar">),
+ "enum2b": Enum("bar",Enum<"foo","bar">),
+ "tag": AsTagged(1,'foo'),
+ "dict0": DictCreate(int32, string),
+ "dict1": {1:"foo"},
+ "dict2": {1:"foo",2:"bar"},
+ "set0": SetCreate(int32),
+ "set1": {1},
+ "set2": {1,2},
+|>;
+
+evaluate for $name in StructMembers($data) do begin
+select * from (
+ select $f($data.$name)
+) flatten columns into result $name;
+end do;
diff --git a/yt/yql/tests/sql/suites/result_types/data.sql b/yt/yql/tests/sql/suites/result_types/data.sql
new file mode 100644
index 0000000000..4f544d4209
--- /dev/null
+++ b/yt/yql/tests/sql/suites/result_types/data.sql
@@ -0,0 +1,56 @@
+--pragma config.flags("LLVM_OFF");
+
+$f = ($value) -> {
+ return <|
+ "plain":$value,
+ "opt_1+":just($value),
+ "opt_1-":nothing(optionaltype(typeof($value))),
+ "opt_2++":just(just($value)),
+ "opt_2+-":just(nothing(optionaltype(typeof($value)))),
+ "opt_2--":nothing(optionaltype(optionaltype(typeof($value)))),
+ "tuple":($value,),
+ |>;
+};
+
+$data = <|
+ "bool": true,
+ "int8": Int8('1'),
+ "uint8": Uint8('2'),
+ "int16": Int16('3'),
+ "uint16": Uint16('4'),
+ "int32": Int32('5'),
+ "uint32": Uint32('6'),
+ "int64": Int64('7'),
+ "uint64": Uint64('8'),
+ "float": Float('9'),
+ "double": Double('10'),
+ "decimal": Decimal('11.3',5,1),
+ "string": "a",
+ "utf8": "b"u,
+ "yson": "{}"y,
+ "json": "[]"j,
+ "jsondocument": jsondocument('{"a":1}'),
+ "uuid": uuid("487120b0-a07f-45be-8d8d-77f727a097a2"),
+ "dynumber": dynumber("12.4"),
+ "date": date("2000-01-02"),
+ "datetime": datetime("2000-01-02T03:04:05Z"),
+ "timestamp": timestamp("2000-01-02T03:04:05.6789012Z"),
+ "interval": interval("P1D"),
+ "tzdate": tzdate("2000-01-02,Europe/Moscow"),
+ "tzdatetime": tzdatetime("2000-01-02T03:04:05,Europe/Moscow"),
+ "tztimestamp": tztimestamp("2000-01-02T03:04:05.6789012,Europe/Moscow"),
+ "date32": date32("1900-01-02"),
+ "datetime64": datetime64("1900-01-02T03:04:05Z"),
+ "timestamp64": timestamp64("1900-01-02T03:04:05.6789012Z"),
+ "interval64": interval64("P1D"),
+ "tzdate32": tzdate32("1900-01-02,Europe/Moscow"),
+ "tzdatetime64": tzdatetime64("1900-01-02T03:04:05,Europe/Moscow"),
+ "tztimestamp64": tztimestamp64("1900-01-02T03:04:05.6789012,Europe/Moscow"),
+|>;
+
+evaluate for $name in StructMembers($data) do begin
+select * from (
+ select $f($data.$name)
+) flatten columns into result $name;
+end do;
+
diff --git a/yt/yql/tests/sql/suites/result_types/default.cfg b/yt/yql/tests/sql/suites/result_types/default.cfg
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/result_types/default.cfg
diff --git a/yt/yql/tests/sql/suites/result_types/pg.sql b/yt/yql/tests/sql/suites/result_types/pg.sql
new file mode 100644
index 0000000000..1e9ee61263
--- /dev/null
+++ b/yt/yql/tests/sql/suites/result_types/pg.sql
@@ -0,0 +1,33 @@
+$f = ($value) -> {
+ return <|
+ "plain":$value,
+ "missing":nothing(typeof($value)),
+ "opt_1+":just($value),
+ "opt_1-":nothing(optionaltype(typeof($value))),
+ "opt_2++":just(just($value)),
+ "opt_2+-":just(nothing(optionaltype(typeof($value)))),
+ "opt_2--":nothing(optionaltype(optionaltype(typeof($value)))),
+ "tuple":($value,),
+ |>;
+};
+
+$data = <|
+ "pgint2": pgint2("1"),
+ "pgint4": pgint2("2"),
+ "pgint8": pgint2("3"),
+ "pgfloat4": pgfloat4("4"),
+ "pgfloat8": pgfloat8("5"),
+ "pgtext": pgtext("a"),
+ "pgvarchar": pgtext("b"),
+ "pgbytea": pgbytea("c"),
+ "pgcstring": pgbytea("d"),
+ "pgdate": pgdate("2001-02-03"),
+ "pgname": pgname("e"),
+|>;
+
+evaluate for $name in StructMembers($data) do begin
+select * from (
+ select $f($data.$name)
+) flatten columns into result $name;
+end do;
+
diff --git a/yt/yql/tests/sql/suites/result_types/singular.sql b/yt/yql/tests/sql/suites/result_types/singular.sql
new file mode 100644
index 0000000000..8990099b5e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/result_types/singular.sql
@@ -0,0 +1,24 @@
+$f = ($value) -> {
+ return <|
+ "plain":$value,
+ "opt_1+":just($value),
+ "opt_1-":nothing(optionaltype(typeof($value))),
+ "opt_2++":just(just($value)),
+ "opt_2+-":just(nothing(optionaltype(typeof($value)))),
+ "opt_2--":nothing(optionaltype(optionaltype(typeof($value)))),
+ "tuple":($value,),
+ |>;
+};
+
+$data = <|
+ "void": Void(),
+ "null": null,
+ "emptylist": [],
+ "emptydict": {},
+|>;
+
+evaluate for $name in StructMembers($data) do begin
+select * from (
+ select $f($data.$name)
+) flatten columns into result $name;
+end do;
diff --git a/yt/yql/tests/sql/suites/sampling/bind_default.sql b/yt/yql/tests/sql/suites/sampling/bind_default.sql
new file mode 100644
index 0000000000..5a726083f9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/bind_default.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+USE plato;
+
+$var = SELECT * FROM Input;
+
+SELECT * FROM $var TABLESAMPLE BERNOULLI(50);
diff --git a/yt/yql/tests/sql/suites/sampling/bind_expr.sql b/yt/yql/tests/sql/suites/sampling/bind_expr.sql
new file mode 100644
index 0000000000..a5cdb40f95
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/bind_expr.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+USE plato;
+
+$count = SELECT COUNT(*) FROM Input; -- $count = 10
+
+$var = SELECT * FROM Input;
+
+SELECT * FROM $var TABLESAMPLE BERNOULLI(5 * $count);
diff --git a/yt/yql/tests/sql/suites/sampling/bind_expr_subquery.sql b/yt/yql/tests/sql/suites/sampling/bind_expr_subquery.sql
new file mode 100644
index 0000000000..a734691f70
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/bind_expr_subquery.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+USE plato;
+
+$rc = (select count(*) from Input);
+$sample_size = 10;
+
+select * from Input tablesample bernoulli(MIN_OF($sample_size * 100.0 / $rc, 100.0)) order by key;
diff --git a/yt/yql/tests/sql/suites/sampling/bind_expr_udf.cfg b/yt/yql/tests/sql/suites/sampling/bind_expr_udf.cfg
new file mode 100644
index 0000000000..7b2051c1bb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/bind_expr_udf.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+udf math_udf
+res result.txt
diff --git a/yt/yql/tests/sql/suites/sampling/bind_expr_udf.sql b/yt/yql/tests/sql/suites/sampling/bind_expr_udf.sql
new file mode 100644
index 0000000000..4a5bbf945b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/bind_expr_udf.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$percent = Math::Ceil(0.2);
+
+SELECT * FROM Input TABLESAMPLE BERNOULLI(Math::Ceil(100 * $percent)) ORDER BY key; -- 100% sample
diff --git a/yt/yql/tests/sql/suites/sampling/bind_join_left.sql b/yt/yql/tests/sql/suites/sampling/bind_join_left.sql
new file mode 100644
index 0000000000..2d1fdf3e10
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/bind_join_left.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+/* hybridfile can not YQL-17764 */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 3 */
+
+use plato;
+pragma DisableSimpleColumns;
+
+$a = select * from Input where key > "199" and value != "bbb";
+
+select * from (select a.value, b.value from $a as a inner join Input as b using(subkey)) tablesample bernoulli(25);
diff --git a/yt/yql/tests/sql/suites/sampling/bind_join_right.sql b/yt/yql/tests/sql/suites/sampling/bind_join_right.sql
new file mode 100644
index 0000000000..2f40997895
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/bind_join_right.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+/* hybridfile can not YQL-17764 */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 3 */
+
+use plato;
+pragma DisableSimpleColumns;
+
+$a = select * from Input where key > "199" and value != "bbb";
+
+select * from (select a.value from Input as a inner join $a as b using(subkey)) tablesample bernoulli(40);
diff --git a/yt/yql/tests/sql/suites/sampling/bind_multiple_sample.sql b/yt/yql/tests/sql/suites/sampling/bind_multiple_sample.sql
new file mode 100644
index 0000000000..7c7628d0c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/bind_multiple_sample.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 20 */
+USE plato;
+
+$var = SELECT * FROM Input;
+
+INSERT INTO @tmp
+SELECT * FROM $var TABLESAMPLE BERNOULLI(100);
+
+INSERT INTO @tmp
+SELECT * FROM $var TABLESAMPLE BERNOULLI(50);
+
+COMMIT;
+
+SELECT * FROM @tmp;
diff --git a/yt/yql/tests/sql/suites/sampling/bind_small_rate.sql b/yt/yql/tests/sql/suites/sampling/bind_small_rate.sql
new file mode 100644
index 0000000000..410591fe2e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/bind_small_rate.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 2 */
+
+$a = select * from plato.Input;
+
+select * from $a tablesample bernoulli(0.1)
diff --git a/yt/yql/tests/sql/suites/sampling/bind_topsort.sql b/yt/yql/tests/sql/suites/sampling/bind_topsort.sql
new file mode 100644
index 0000000000..a2e1dc2725
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/bind_topsort.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+
+$var = SELECT key, value FROM plato.Input;
+
+SELECT * FROM $var TABLESAMPLE BERNOULLI(10) ORDER BY key ASC, value LIMIT 10;
diff --git a/yt/yql/tests/sql/suites/sampling/default.cfg b/yt/yql/tests/sql/suites/sampling/default.cfg
new file mode 100644
index 0000000000..6f99339756
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/default.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/sampling/direct_read-dynamic.cfg b/yt/yql/tests/sql/suites/sampling/direct_read-dynamic.cfg
new file mode 100644
index 0000000000..1908d503d1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/direct_read-dynamic.cfg
@@ -0,0 +1,2 @@
+in Input dynamic.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/sampling/direct_read.cfg b/yt/yql/tests/sql/suites/sampling/direct_read.cfg
new file mode 100644
index 0000000000..6f99339756
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/direct_read.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/sampling/direct_read.sql b/yt/yql/tests/sql/suites/sampling/direct_read.sql
new file mode 100644
index 0000000000..e3edc0dba6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/direct_read.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+pragma direct_read;
+SELECT * FROM plato.Input TABLESAMPLE BERNOULLI(30) REPEATABLE(1);
diff --git a/yt/yql/tests/sql/suites/sampling/dynamic.txt.attr b/yt/yql/tests/sql/suites/sampling/dynamic.txt.attr
new file mode 100644
index 0000000000..9e3c33c4cb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/dynamic.txt.attr
@@ -0,0 +1,33 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key"; ["DataType"; "String"]];
+ ["subkey"; ["DataType"; "String"]];
+ ["value"; ["DataType"; "String"]];
+ ]];
+ "SortMembers"=["key"; "subkey"];
+ "SortedBy"=["key"; "subkey"];
+ "SortDirections"=[1; 1];
+ "SortedByTypes"=[["DataType";"String"]; ["DataType";"String"]]
+ };
+ "_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/sampling/insert.cfg b/yt/yql/tests/sql/suites/sampling/insert.cfg
new file mode 100644
index 0000000000..6f99339756
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/insert.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/sampling/insert.sql b/yt/yql/tests/sql/suites/sampling/insert.sql
new file mode 100644
index 0000000000..e08c85eba0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/insert.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+USE plato;
+
+INSERT INTO @tmp
+SELECT * FROM Input TABLESAMPLE BERNOULLI(30) REPEATABLE(1);
+
+COMMIT;
+
+SELECT * FROM @tmp;
diff --git a/yt/yql/tests/sql/suites/sampling/join_left_sample.sql b/yt/yql/tests/sql/suites/sampling/join_left_sample.sql
new file mode 100644
index 0000000000..61d1860ded
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/join_left_sample.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+/* ignore plan diff */
+use plato;
+pragma DisableSimpleColumns;
+
+select * from plato.Input as a SAMPLE 0.3
+inner join plato.Input as b
+on a.key = b.key;
diff --git a/yt/yql/tests/sql/suites/sampling/join_right_sample.sql b/yt/yql/tests/sql/suites/sampling/join_right_sample.sql
new file mode 100644
index 0000000000..be3d814ace
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/join_right_sample.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+/* syntax version 1 */
+use plato;
+pragma DisableSimpleColumns;
+
+select * from plato.Input as a
+inner join plato.Input as b SAMPLE 0.3
+on a.key = b.key;
diff --git a/yt/yql/tests/sql/suites/sampling/map-dynamic.cfg b/yt/yql/tests/sql/suites/sampling/map-dynamic.cfg
new file mode 100644
index 0000000000..1908d503d1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/map-dynamic.cfg
@@ -0,0 +1,2 @@
+in Input dynamic.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/sampling/map-keyfilter.cfg b/yt/yql/tests/sql/suites/sampling/map-keyfilter.cfg
new file mode 100644
index 0000000000..3f5bebb5a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/map-keyfilter.cfg
@@ -0,0 +1,2 @@
+in Input sorted.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/sampling/map.cfg b/yt/yql/tests/sql/suites/sampling/map.cfg
new file mode 100644
index 0000000000..6f99339756
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/map.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/sampling/map.sql b/yt/yql/tests/sql/suites/sampling/map.sql
new file mode 100644
index 0000000000..35f784a3cb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/map.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 8 */
+SELECT * FROM plato.Input TABLESAMPLE BERNOULLI(30) REPEATABLE(1) WHERE subkey > "1";
diff --git a/yt/yql/tests/sql/suites/sampling/mapjoin_left_sample.sql b/yt/yql/tests/sql/suites/sampling/mapjoin_left_sample.sql
new file mode 100644
index 0000000000..e05a877bfb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/mapjoin_left_sample.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+use plato;
+pragma DisableSimpleColumns;
+pragma yt.MapJoinLimit="1m";
+
+select * from plato.Input as a SAMPLE 0.3
+inner join plato.Input as b
+on a.key = b.key;
diff --git a/yt/yql/tests/sql/suites/sampling/mapjoin_right_sample.sql b/yt/yql/tests/sql/suites/sampling/mapjoin_right_sample.sql
new file mode 100644
index 0000000000..8490d55c65
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/mapjoin_right_sample.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+/* syntax version 1 */
+use plato;
+pragma yt.MapJoinLimit="1m";
+pragma DisableSimpleColumns;
+
+select * from plato.Input as a
+inner join plato.Input as b SAMPLE 0.3
+on a.key = b.key;
diff --git a/yt/yql/tests/sql/suites/sampling/orderedjoin_left_sample.sql b/yt/yql/tests/sql/suites/sampling/orderedjoin_left_sample.sql
new file mode 100644
index 0000000000..5c28981d3d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/orderedjoin_left_sample.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+/* ignore plan diff */
+/* syntax version 1 */
+use plato;
+pragma yt.JoinMergeTablesLimit="2";
+pragma DisableSimpleColumns;
+
+select * from plato.Input as a SAMPLE 0.3
+inner join plato.Input as b
+on a.key = b.key;
diff --git a/yt/yql/tests/sql/suites/sampling/orderedjoin_right_sample.sql b/yt/yql/tests/sql/suites/sampling/orderedjoin_right_sample.sql
new file mode 100644
index 0000000000..8104b64e5d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/orderedjoin_right_sample.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+/* ignore plan diff */
+/* syntax version 1 */
+use plato;
+pragma yt.JoinMergeTablesLimit="2";
+pragma DisableSimpleColumns;
+
+select * from plato.Input as a
+inner join plato.Input as b SAMPLE 0.3
+on a.key = b.key;
diff --git a/yt/yql/tests/sql/suites/sampling/read-dynamic.cfg b/yt/yql/tests/sql/suites/sampling/read-dynamic.cfg
new file mode 100644
index 0000000000..1908d503d1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/read-dynamic.cfg
@@ -0,0 +1,2 @@
+in Input dynamic.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/sampling/read.cfg b/yt/yql/tests/sql/suites/sampling/read.cfg
new file mode 100644
index 0000000000..6f99339756
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/read.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/sampling/read.sql b/yt/yql/tests/sql/suites/sampling/read.sql
new file mode 100644
index 0000000000..86381aef3a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/read.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+SELECT * FROM plato.Input TABLESAMPLE BERNOULLI(30) REPEATABLE(1);
diff --git a/yt/yql/tests/sql/suites/sampling/reduce-with_premap.cfg b/yt/yql/tests/sql/suites/sampling/reduce-with_premap.cfg
new file mode 100644
index 0000000000..dd593f12f9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/reduce-with_premap.cfg
@@ -0,0 +1,3 @@
+in Input sorted_desc.txt
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/sampling/reduce.cfg b/yt/yql/tests/sql/suites/sampling/reduce.cfg
new file mode 100644
index 0000000000..2c31ed76e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/reduce.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/sampling/reduce.sql b/yt/yql/tests/sql/suites/sampling/reduce.sql
new file mode 100644
index 0000000000..0536570115
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/reduce.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 8 */
+USE plato;
+
+$udf = YQL::@@(lambda '(key stream) (AsStruct
+ '('key key) '('summ (Collect (Condense stream (Uint32 '0) (lambda '(item state) (Bool 'False)) (lambda '(item state) (Add state item)))))
+))@@;
+
+$res = (REDUCE Input TABLESAMPLE BERNOULLI(30) REPEATABLE(1) ON key USING $udf(cast(value as uint32) ?? 0));
+
+select * from $res order by key;
diff --git a/yt/yql/tests/sql/suites/sampling/reduce_with_presort.cfg b/yt/yql/tests/sql/suites/sampling/reduce_with_presort.cfg
new file mode 100644
index 0000000000..eb1992232a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/reduce_with_presort.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+res result.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/sampling/reduce_with_presort.sql b/yt/yql/tests/sql/suites/sampling/reduce_with_presort.sql
new file mode 100644
index 0000000000..b698b6fe87
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/reduce_with_presort.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 8 */
+USE plato;
+
+$udf = YQL::@@(lambda '(key stream) (AsStruct
+ '('key key) '('summ (Collect (Condense stream (Uint32 '0) (lambda '(item state) (Bool 'False)) (lambda '(item state) (Add state item)))))
+))@@;
+
+$res = (REDUCE Input TABLESAMPLE BERNOULLI(30) REPEATABLE(1) PRESORT key || subkey ON key USING $udf(cast(value as uint32) ?? 0));
+
+select * from $res order by key;
diff --git a/yt/yql/tests/sql/suites/sampling/sample.sql b/yt/yql/tests/sql/suites/sampling/sample.sql
new file mode 100644
index 0000000000..6dd6d7ee31
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/sample.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT * FROM (SELECT* from Input)
+SAMPLE(0.5)
+ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/sampling/sort.sql b/yt/yql/tests/sql/suites/sampling/sort.sql
new file mode 100644
index 0000000000..a245b72745
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/sort.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+SELECT * FROM plato.Input TABLESAMPLE BERNOULLI(30) REPEATABLE(1) ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/sampling/sorted.txt.attr b/yt/yql/tests/sql/suites/sampling/sorted.txt.attr
new file mode 100644
index 0000000000..1d2e02ee20
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/sorted.txt.attr
@@ -0,0 +1,13 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key"; ["DataType"; "String"]];
+ ["subkey"; ["DataType"; "String"]];
+ ["value"; ["DataType"; "String"]];
+ ]];
+ "SortMembers"=["subkey"];
+ "SortedBy"=["subkey"];
+ "SortDirections"=[1];
+ "SortedByTypes"=[["DataType";"String"]]
+ };
+}
diff --git a/yt/yql/tests/sql/suites/sampling/sorted_desc.txt.attr b/yt/yql/tests/sql/suites/sampling/sorted_desc.txt.attr
new file mode 100644
index 0000000000..5a6ca5761e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/sorted_desc.txt.attr
@@ -0,0 +1,47 @@
+{
+ "_yql_row_spec" = {
+ "SortMembers" = [
+ "key"
+ ];
+ "SortDirections" = [
+ 0
+ ];
+ "UniqueKeys" = %false;
+ "SortedByTypes" = [
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ "StrictSchema" = %true;
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ];
+ "SortedBy" = [
+ "_yql_column_0"
+ ]
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/sampling/subquery_default.sql b/yt/yql/tests/sql/suites/sampling/subquery_default.sql
new file mode 100644
index 0000000000..767979a16b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/subquery_default.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+
+SELECT * FROM (SELECT * FROM plato.Input) TABLESAMPLE BERNOULLI(50);
diff --git a/yt/yql/tests/sql/suites/sampling/subquery_expr.sql b/yt/yql/tests/sql/suites/sampling/subquery_expr.sql
new file mode 100644
index 0000000000..95c67024ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/subquery_expr.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+
+$count = SELECT COUNT(*) FROM plato.Input; -- $count = 10
+
+SELECT * FROM (SELECT * FROM plato.Input) TABLESAMPLE BERNOULLI(5 * $count);
diff --git a/yt/yql/tests/sql/suites/sampling/subquery_filter.sql b/yt/yql/tests/sql/suites/sampling/subquery_filter.sql
new file mode 100644
index 0000000000..d7942f2fed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/subquery_filter.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 8 */
+
+select * from (select key from plato.Input where subkey != "1") tablesample bernoulli(44) where key > "50";
diff --git a/yt/yql/tests/sql/suites/sampling/subquery_limit.sql b/yt/yql/tests/sql/suites/sampling/subquery_limit.sql
new file mode 100644
index 0000000000..3d8930952a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/subquery_limit.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 6 */
+
+select * from (select * from plato.Input) tablesample bernoulli(80) limit 5;
diff --git a/yt/yql/tests/sql/suites/sampling/subquery_mapjoin.sql b/yt/yql/tests/sql/suites/sampling/subquery_mapjoin.sql
new file mode 100644
index 0000000000..d8eebf7bc6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/subquery_mapjoin.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+/* hybridfile can not YQL-17764 */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+use plato;
+
+pragma DisableSimpleColumns;
+pragma yt.MapJoinLimit="1m";
+
+select * from(
+select * from plato.Input as a
+inner join plato.Input as b
+on a.key = b.key
+) tablesample bernoulli(30);
diff --git a/yt/yql/tests/sql/suites/sampling/subquery_multiple_sample.sql b/yt/yql/tests/sql/suites/sampling/subquery_multiple_sample.sql
new file mode 100644
index 0000000000..c0aa4c9471
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/subquery_multiple_sample.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+
+SELECT * FROM (SELECT * FROM plato.Input TABLESAMPLE BERNOULLI(50)) TABLESAMPLE BERNOULLI(30);
diff --git a/yt/yql/tests/sql/suites/sampling/subquery_sort.sql b/yt/yql/tests/sql/suites/sampling/subquery_sort.sql
new file mode 100644
index 0000000000..056ddbf4d5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/subquery_sort.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+
+select key from (select key, value from plato.Input) tablesample bernoulli(33) order by key;
+
diff --git a/yt/yql/tests/sql/suites/sampling/system_sampling-io_block_size.cfg b/yt/yql/tests/sql/suites/sampling/system_sampling-io_block_size.cfg
new file mode 100644
index 0000000000..7544cd7111
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/system_sampling-io_block_size.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+out Output output.txt
+res result.txt
+pragma yt.SamplingIoBlockSize="32M"
+providers yt
diff --git a/yt/yql/tests/sql/suites/sampling/system_sampling.cfg b/yt/yql/tests/sql/suites/sampling/system_sampling.cfg
new file mode 100644
index 0000000000..5d963ebb21
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/system_sampling.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+out Output output.txt
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/sampling/system_sampling.sql b/yt/yql/tests/sql/suites/sampling/system_sampling.sql
new file mode 100644
index 0000000000..56f5e5a1f0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/system_sampling.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 100 */
+/* syntax version 1 */
+USE plato;
+
+EVALUATE FOR $_i IN ListFromRange(0, 10) DO BEGIN
+ INSERT INTO Output
+ SELECT * FROM Input;
+ COMMIT;
+END DO;
+
+SELECT * FROM Output TABLESAMPLE SYSTEM(10);
diff --git a/yt/yql/tests/sql/suites/sampling/table_content.cfg b/yt/yql/tests/sql/suites/sampling/table_content.cfg
new file mode 100644
index 0000000000..6f99339756
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/table_content.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/sampling/table_content.sql b/yt/yql/tests/sql/suites/sampling/table_content.sql
new file mode 100644
index 0000000000..c455155fc7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/table_content.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) == 1 */
+use plato;
+
+$key = (select key from plato.Input SAMPLE(0.5));
+
+select * from Input where key = $key;
diff --git a/yt/yql/tests/sql/suites/sampling/take_with_sampling.sql b/yt/yql/tests/sql/suites/sampling/take_with_sampling.sql
new file mode 100644
index 0000000000..1abbb2413b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/take_with_sampling.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+SELECT * FROM plato.Input TABLESAMPLE BERNOULLI(30) REPEATABLE(1) LIMIT 10;
diff --git a/yt/yql/tests/sql/suites/sampling/topsort.sql b/yt/yql/tests/sql/suites/sampling/topsort.sql
new file mode 100644
index 0000000000..7bc0db6910
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/topsort.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+SELECT * FROM plato.Input TABLESAMPLE BERNOULLI(30) REPEATABLE(1) ORDER BY key LIMIT 10;
diff --git a/yt/yql/tests/sql/suites/sampling/yql-14664_deps.sql b/yt/yql/tests/sql/suites/sampling/yql-14664_deps.sql
new file mode 100644
index 0000000000..f6f73a0337
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/yql-14664_deps.sql
@@ -0,0 +1,20 @@
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 10 */
+USE plato;
+
+INSERT INTO @a
+SELECT
+ *
+FROM Input
+WHERE key > "020";
+
+COMMIT;
+
+SELECT
+ *
+FROM (
+ SELECT
+ *
+ FROM @a
+ TABLESAMPLE BERNOULLI(50.0) REPEATABLE(1)
+) LIMIT 10
diff --git a/yt/yql/tests/sql/suites/sampling/zero_percentage.cfg b/yt/yql/tests/sql/suites/sampling/zero_percentage.cfg
new file mode 100644
index 0000000000..3f5bebb5a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/zero_percentage.cfg
@@ -0,0 +1,2 @@
+in Input sorted.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/sampling/zero_percentage.sql b/yt/yql/tests/sql/suites/sampling/zero_percentage.sql
new file mode 100644
index 0000000000..43693ecd77
--- /dev/null
+++ b/yt/yql/tests/sql/suites/sampling/zero_percentage.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+SELECT * FROM plato.Input TABLESAMPLE BERNOULLI(0) ORDER BY subkey;
diff --git a/yt/yql/tests/sql/suites/schema/append_to_desc.cfg b/yt/yql/tests/sql/suites/schema/append_to_desc.cfg
new file mode 100644
index 0000000000..96bf89fe0a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/append_to_desc.cfg
@@ -0,0 +1,2 @@
+in Input descending.txt
+out Output descending.txt
diff --git a/yt/yql/tests/sql/suites/schema/append_to_desc.sql b/yt/yql/tests/sql/suites/schema/append_to_desc.sql
new file mode 100644
index 0000000000..61480975cb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/append_to_desc.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+USE plato;
+
+insert into Output
+select * from Input
+order by key desc, subkey desc; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/schema/append_to_desc_with_remap.cfg b/yt/yql/tests/sql/suites/schema/append_to_desc_with_remap.cfg
new file mode 100644
index 0000000000..96bf89fe0a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/append_to_desc_with_remap.cfg
@@ -0,0 +1,2 @@
+in Input descending.txt
+out Output descending.txt
diff --git a/yt/yql/tests/sql/suites/schema/append_to_desc_with_remap.sql b/yt/yql/tests/sql/suites/schema/append_to_desc_with_remap.sql
new file mode 100644
index 0000000000..0b315899d9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/append_to_desc_with_remap.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+USE plato;
+
+insert into Output
+select * from Input
+where key > "000"
+order by key desc, subkey desc; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/schema/concat.cfg b/yt/yql/tests/sql/suites/schema/concat.cfg
new file mode 100644
index 0000000000..a9740fa8b6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/concat.cfg
@@ -0,0 +1,2 @@
+in InputGood input_good.txt
+in InputBad input_bad.txt
diff --git a/yt/yql/tests/sql/suites/schema/concat.sql b/yt/yql/tests/sql/suites/schema/concat.sql
new file mode 100644
index 0000000000..4e6fe0fddd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/concat.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+USE plato;
+
+SELECT id1 FROM CONCAT(InputGood, InputBad);
diff --git a/yt/yql/tests/sql/suites/schema/copy-other.cfg b/yt/yql/tests/sql/suites/schema/copy-other.cfg
new file mode 100644
index 0000000000..5529b28815
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/copy-other.cfg
@@ -0,0 +1,2 @@
+in Input read_schema_other.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/schema/copy-read_schema.cfg b/yt/yql/tests/sql/suites/schema/copy-read_schema.cfg
new file mode 100644
index 0000000000..3ebcb3bb45
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/copy-read_schema.cfg
@@ -0,0 +1,2 @@
+in Input read_schema.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/schema/copy-schema.cfg b/yt/yql/tests/sql/suites/schema/copy-schema.cfg
new file mode 100644
index 0000000000..80ffec4b32
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/copy-schema.cfg
@@ -0,0 +1,2 @@
+in Input schema.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/schema/copy-yamred_dsv_raw.cfg b/yt/yql/tests/sql/suites/schema/copy-yamred_dsv_raw.cfg
new file mode 100644
index 0000000000..0cad3cec7d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/copy-yamred_dsv_raw.cfg
@@ -0,0 +1,2 @@
+in Input yamred_dsv_raw.txt yamred_dsv
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/schema/copy.sql b/yt/yql/tests/sql/suites/schema/copy.sql
new file mode 100644
index 0000000000..90d80ae84a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/copy.sql
@@ -0,0 +1,3 @@
+insert into plato.Output
+select * from plato.Input
+limit 100;
diff --git a/yt/yql/tests/sql/suites/schema/def_values.cfg b/yt/yql/tests/sql/suites/schema/def_values.cfg
new file mode 100644
index 0000000000..2578259926
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/def_values.cfg
@@ -0,0 +1 @@
+in Input def_values.txt
diff --git a/yt/yql/tests/sql/suites/schema/def_values.sql b/yt/yql/tests/sql/suites/schema/def_values.sql
new file mode 100644
index 0000000000..327a664434
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/def_values.sql
@@ -0,0 +1 @@
+select key, subkey, value from plato.Input;
diff --git a/yt/yql/tests/sql/suites/schema/def_values.txt.attr b/yt/yql/tests/sql/suites/schema/def_values.txt.attr
new file mode 100644
index 0000000000..c54e9fca8f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/def_values.txt.attr
@@ -0,0 +1,19 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]];
+ ]];
+ "DefaultValues"={
+ "key"="\"def_key\"";
+ "subkey"="\"def_subkey\"";
+ "value"="\"def_value\"";
+ };
+ };
+ "schema"=<"strict" = %true> [
+ {"type"="string"; "name"="key"};
+ {"type"="string"; "name"="subkey"};
+ {"type"="string"; "name"="value"}
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/schema/def_values_job.cfg b/yt/yql/tests/sql/suites/schema/def_values_job.cfg
new file mode 100644
index 0000000000..2578259926
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/def_values_job.cfg
@@ -0,0 +1 @@
+in Input def_values.txt
diff --git a/yt/yql/tests/sql/suites/schema/def_values_job.sql b/yt/yql/tests/sql/suites/schema/def_values_job.sql
new file mode 100644
index 0000000000..7165961a6f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/def_values_job.sql
@@ -0,0 +1 @@
+select key, subkey, value from plato.Input where key != "fake";
diff --git a/yt/yql/tests/sql/suites/schema/default.cfg b/yt/yql/tests/sql/suites/schema/default.cfg
new file mode 100644
index 0000000000..86c772ae1c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/default.cfg
@@ -0,0 +1 @@
+in Input read_schema.txt
diff --git a/yt/yql/tests/sql/suites/schema/descending.txt.attr b/yt/yql/tests/sql/suites/schema/descending.txt.attr
new file mode 100644
index 0000000000..7024a9fc9c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/descending.txt.attr
@@ -0,0 +1,21 @@
+{
+ "schema"=<
+ "strict" = %true;
+ "unique_keys" = %false
+ >[
+ {
+ "name" = "key";
+ "type" = "string";
+ "sort_order" = "descending";
+ };
+ {
+ "name" = "subkey";
+ "type" = "string";
+ "sort_order" = "descending";
+ };
+ {
+ "name" = "value";
+ "type" = "string";
+ };
+ ]
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/schema/diffrerent_schemas.cfg b/yt/yql/tests/sql/suites/schema/diffrerent_schemas.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/diffrerent_schemas.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/schema/diffrerent_schemas.sql b/yt/yql/tests/sql/suites/schema/diffrerent_schemas.sql
new file mode 100644
index 0000000000..407dff9475
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/diffrerent_schemas.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+USE plato;
+SELECT * FROM Input WITH SCHEMA Struct<key:String, subkey:String>;
+SELECT * FROM Input WITH SCHEMA Struct<key:String, value:String>;
+
diff --git a/yt/yql/tests/sql/suites/schema/empty.txt.attr b/yt/yql/tests/sql/suites/schema/empty.txt.attr
new file mode 100644
index 0000000000..ada1f836f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/empty.txt.attr
@@ -0,0 +1,3 @@
+{
+ "infer_schema"=%true
+}
diff --git a/yt/yql/tests/sql/suites/schema/empty_no_schema.txt.attr b/yt/yql/tests/sql/suites/schema/empty_no_schema.txt.attr
new file mode 100644
index 0000000000..ada1f836f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/empty_no_schema.txt.attr
@@ -0,0 +1,3 @@
+{
+ "infer_schema"=%true
+}
diff --git a/yt/yql/tests/sql/suites/schema/fake_column.sql b/yt/yql/tests/sql/suites/schema/fake_column.sql
new file mode 100644
index 0000000000..21c745b27e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/fake_column.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+USE plato;
+
+insert into @tmp
+select * from (
+ select <||> as a
+) flatten columns;
+
+commit;
+
+select 1 as a from @tmp;
diff --git a/yt/yql/tests/sql/suites/schema/inferschema.txt.attr b/yt/yql/tests/sql/suites/schema/inferschema.txt.attr
new file mode 100644
index 0000000000..ada1f836f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/inferschema.txt.attr
@@ -0,0 +1,3 @@
+{
+ "infer_schema"=%true
+}
diff --git a/yt/yql/tests/sql/suites/schema/inferschema2.txt.attr b/yt/yql/tests/sql/suites/schema/inferschema2.txt.attr
new file mode 100644
index 0000000000..ada1f836f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/inferschema2.txt.attr
@@ -0,0 +1,3 @@
+{
+ "infer_schema"=%true
+}
diff --git a/yt/yql/tests/sql/suites/schema/inferschema_extra_field.txt.attr b/yt/yql/tests/sql/suites/schema/inferschema_extra_field.txt.attr
new file mode 100644
index 0000000000..ada1f836f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/inferschema_extra_field.txt.attr
@@ -0,0 +1,3 @@
+{
+ "infer_schema"=%true
+}
diff --git a/yt/yql/tests/sql/suites/schema/inferschema_no_fields.txt.attr b/yt/yql/tests/sql/suites/schema/inferschema_no_fields.txt.attr
new file mode 100644
index 0000000000..ada1f836f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/inferschema_no_fields.txt.attr
@@ -0,0 +1,3 @@
+{
+ "infer_schema"=%true
+}
diff --git a/yt/yql/tests/sql/suites/schema/input_bad.txt.attr b/yt/yql/tests/sql/suites/schema/input_bad.txt.attr
new file mode 100644
index 0000000000..c858a649c4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/input_bad.txt.attr
@@ -0,0 +1,6 @@
+{
+ "schema" = [
+ {"required"=%false; "type"="any"; "name"="dates"};
+ {"required"=%false; "type"="string"; "name"="id1"};
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/schema/input_good.txt.attr b/yt/yql/tests/sql/suites/schema/input_good.txt.attr
new file mode 100644
index 0000000000..431dd78c84
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/input_good.txt.attr
@@ -0,0 +1,15 @@
+{
+ "_yql_row_spec" = {
+ "StrictSchema"=%true;
+ "Type"=["StructType";[
+ ["IsValid";["DataType";"Bool"]];
+ ["dates";["ListType";["DataType";"String"]]];
+ ["id1";["OptionalType";["DataType";"String"]]];
+ ]];
+ };
+ "schema" = [
+ {"required"=%false; "type"="any"; "name"="dates"};
+ {"required"=%false; "type"="string"; "name"="id1"};
+ {"required"=%true; "type"="boolean"; "name"="IsValid"};
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/schema/input_no_schema.txt.attr b/yt/yql/tests/sql/suites/schema/input_no_schema.txt.attr
new file mode 100644
index 0000000000..ada1f836f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/input_no_schema.txt.attr
@@ -0,0 +1,3 @@
+{
+ "infer_schema"=%true
+}
diff --git a/yt/yql/tests/sql/suites/schema/insert-read_schema.cfg b/yt/yql/tests/sql/suites/schema/insert-read_schema.cfg
new file mode 100644
index 0000000000..3ebcb3bb45
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/insert-read_schema.cfg
@@ -0,0 +1,2 @@
+in Input read_schema.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/schema/insert-row_spec.cfg b/yt/yql/tests/sql/suites/schema/insert-row_spec.cfg
new file mode 100644
index 0000000000..82e876ad52
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/insert-row_spec.cfg
@@ -0,0 +1,2 @@
+in Input row_spec.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/schema/insert-schema.cfg b/yt/yql/tests/sql/suites/schema/insert-schema.cfg
new file mode 100644
index 0000000000..80ffec4b32
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/insert-schema.cfg
@@ -0,0 +1,2 @@
+in Input schema.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/schema/insert.sql b/yt/yql/tests/sql/suites/schema/insert.sql
new file mode 100644
index 0000000000..0ea3cadf0e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/insert.sql
@@ -0,0 +1,4 @@
+/* multirun can not */
+insert into plato.Output select * from plato.Input where a is not null;
+commit;
+select * from plato.Output;
diff --git a/yt/yql/tests/sql/suites/schema/insert_sorted-read_schema.cfg b/yt/yql/tests/sql/suites/schema/insert_sorted-read_schema.cfg
new file mode 100644
index 0000000000..3ebcb3bb45
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/insert_sorted-read_schema.cfg
@@ -0,0 +1,2 @@
+in Input read_schema.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/schema/insert_sorted-row_spec.cfg b/yt/yql/tests/sql/suites/schema/insert_sorted-row_spec.cfg
new file mode 100644
index 0000000000..82e876ad52
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/insert_sorted-row_spec.cfg
@@ -0,0 +1,2 @@
+in Input row_spec.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/schema/insert_sorted-schema.cfg b/yt/yql/tests/sql/suites/schema/insert_sorted-schema.cfg
new file mode 100644
index 0000000000..80ffec4b32
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/insert_sorted-schema.cfg
@@ -0,0 +1,2 @@
+in Input schema.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/schema/insert_sorted.sql b/yt/yql/tests/sql/suites/schema/insert_sorted.sql
new file mode 100644
index 0000000000..f93a54e166
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/insert_sorted.sql
@@ -0,0 +1,4 @@
+/* multirun can not */
+insert into plato.Output select * from plato.Input order by d, a, b, c;
+commit;
+select * from plato.Output;
diff --git a/yt/yql/tests/sql/suites/schema/limit_directread.cfg b/yt/yql/tests/sql/suites/schema/limit_directread.cfg
new file mode 100644
index 0000000000..86c772ae1c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/limit_directread.cfg
@@ -0,0 +1 @@
+in Input read_schema.txt
diff --git a/yt/yql/tests/sql/suites/schema/limit_directread.sql b/yt/yql/tests/sql/suites/schema/limit_directread.sql
new file mode 100644
index 0000000000..f083e0bbc0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/limit_directread.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+use plato;
+pragma directread;
+select * from `Input` limit 3;
diff --git a/yt/yql/tests/sql/suites/schema/limit_simple.cfg b/yt/yql/tests/sql/suites/schema/limit_simple.cfg
new file mode 100644
index 0000000000..128536d9eb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/limit_simple.cfg
@@ -0,0 +1 @@
+in Input read_schema_no_any.txt
diff --git a/yt/yql/tests/sql/suites/schema/limit_simple.sql b/yt/yql/tests/sql/suites/schema/limit_simple.sql
new file mode 100644
index 0000000000..b9eeaad952
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/limit_simple.sql
@@ -0,0 +1,2 @@
+use plato;
+select a from Input limit 3;
diff --git a/yt/yql/tests/sql/suites/schema/other.cfg b/yt/yql/tests/sql/suites/schema/other.cfg
new file mode 100644
index 0000000000..4035425a79
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/other.cfg
@@ -0,0 +1,3 @@
+in Input1 other1.txt
+in Input2 other2.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/schema/other.sql b/yt/yql/tests/sql/suites/schema/other.sql
new file mode 100644
index 0000000000..1412b0692f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/other.sql
@@ -0,0 +1 @@
+select key, _other from plato.range(``, Input1, Input2); \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/schema/other1.txt.attr b/yt/yql/tests/sql/suites/schema/other1.txt.attr
new file mode 100644
index 0000000000..49d98771a8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/other1.txt.attr
@@ -0,0 +1,17 @@
+{
+ "_read_schema" = <"strict" = %false>[
+ {"type"="string";"name"="key"};
+ {"type"="string";"name"="subkey"};
+ ];
+ "schema" = <"strict" = %false; "unique_keys" = %false>
+ [
+ {
+ "name" = "key";
+ "type" = "string"
+ };
+ {
+ "name" = "subkey";
+ "type" = "string"
+ }
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/schema/other2.txt.attr b/yt/yql/tests/sql/suites/schema/other2.txt.attr
new file mode 100644
index 0000000000..49d98771a8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/other2.txt.attr
@@ -0,0 +1,17 @@
+{
+ "_read_schema" = <"strict" = %false>[
+ {"type"="string";"name"="key"};
+ {"type"="string";"name"="subkey"};
+ ];
+ "schema" = <"strict" = %false; "unique_keys" = %false>
+ [
+ {
+ "name" = "key";
+ "type" = "string"
+ };
+ {
+ "name" = "subkey";
+ "type" = "string"
+ }
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/schema/other_job.cfg b/yt/yql/tests/sql/suites/schema/other_job.cfg
new file mode 100644
index 0000000000..4035425a79
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/other_job.cfg
@@ -0,0 +1,3 @@
+in Input1 other1.txt
+in Input2 other2.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/schema/other_job.sql b/yt/yql/tests/sql/suites/schema/other_job.sql
new file mode 100644
index 0000000000..22dc1e1bae
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/other_job.sql
@@ -0,0 +1 @@
+select key, _other from plato.range(``, Input1, Input2) where key != "fake";
diff --git a/yt/yql/tests/sql/suites/schema/patched1.txt.attr b/yt/yql/tests/sql/suites/schema/patched1.txt.attr
new file mode 100644
index 0000000000..4590bb2e0a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/patched1.txt.attr
@@ -0,0 +1,11 @@
+{
+ "schema"=<"strict"=%true; "unique_keys"=%false>[
+ {"name"="key";"type"="string"};
+ {"name"="subkey";"type"="string"};
+ {"name"="value";"type"="string"};
+ ];
+ "_yql_row_spec"={
+ "TypePatch"=["StructType";[
+ ]];
+ };
+}
diff --git a/yt/yql/tests/sql/suites/schema/patched2.txt.attr b/yt/yql/tests/sql/suites/schema/patched2.txt.attr
new file mode 100644
index 0000000000..2ee1e38628
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/patched2.txt.attr
@@ -0,0 +1,11 @@
+{
+ "schema"=<"strict"=%true; "unique_keys"=%false>[
+ {"name"="key";"type"="string";"required"=%true;"sort_order"="ascending"};
+ {"name"="subkey";"type"="string";"required"=%true;"sort_order"="ascending"};
+ {"name"="value";"type"="string";"required"=%true};
+ ];
+ "_yql_row_spec"={
+ "TypePatch"=["StructType";[
+ ]];
+ };
+}
diff --git a/yt/yql/tests/sql/suites/schema/patched3.txt.attr b/yt/yql/tests/sql/suites/schema/patched3.txt.attr
new file mode 100644
index 0000000000..5712df5e2d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/patched3.txt.attr
@@ -0,0 +1,15 @@
+{
+ "schema"=<"strict"=%true; "unique_keys"=%false>[
+ {"name"="key";"type"="string";"required"=%true;"sort_order"="ascending"};
+ {"name"="subkey";"type"="string";"required"=%true;"sort_order"="ascending"};
+ {"name"="value";"type"="string";"required"=%true};
+ ];
+ "_yql_row_spec"={
+ "TypePatch"=["StructType";[
+ ]];
+ "SortedBy"=["key"];
+ "SortDirections"=[1];
+ "SortMembers"=["key"];
+ "SortedByTypes"=[["DataType";"String"]];
+ };
+}
diff --git a/yt/yql/tests/sql/suites/schema/patched4.txt.attr b/yt/yql/tests/sql/suites/schema/patched4.txt.attr
new file mode 100644
index 0000000000..8002bb3a8d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/patched4.txt.attr
@@ -0,0 +1,15 @@
+{
+ "schema"=<"strict"=%true; "unique_keys"=%false>[
+ {"name"="_yql_column_0";"type"="string";"required"=%true;"sort_order"="ascending"};
+ {"name"="key";"type"="string";"required"=%true};
+ {"name"="subkey";"type"="string";"required"=%true};
+ {"name"="value";"type"="string";"required"=%true};
+ ];
+ "_yql_row_spec"={
+ "TypePatch"=["StructType";[]];
+ "SortMembers"=["key"];
+ "SortedBy"=["_yql_column_0"];
+ "SortDirections"=[0];
+ "SortedByTypes"=[["DataType";"String"]];
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/schema/patched5.txt.attr b/yt/yql/tests/sql/suites/schema/patched5.txt.attr
new file mode 100644
index 0000000000..9d5ab09f10
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/patched5.txt.attr
@@ -0,0 +1,22 @@
+{
+ "schema"=<"strict" = %true;"unique_keys" = %false;>[
+ {"type" = "any";"required" = %false;"name" = "any_column";};
+ {"type" = "boolean";"required" = %true;"name" = "boolean_column";};
+ {"type" = "uint16";"required" = %true;"name" = "date_column";};
+ {"type" = "double";"required" = %true;"name" = "double_column";};
+ {"type" = "int64";"required" = %true;"name" = "int64_column";};
+ {"type" = "int64";"required" = %true;"name" = "interval_column";};
+ {"type" = "any";"required" = %false;"name" = "list_column";};
+ {"type" = "any";"required" = %false;"name" = "null_column";};
+ {"type" = "utf8";"required" = %false;"name" = "optional_column";};
+ {"type" = "string";"required" = %true;"name" = "string_column";};
+ ];
+ "_yql_row_spec"={
+ "TypePatch"=["StructType";[
+ ["null_column";["NullType";];];
+ ["list_column";["ListType";["DataType";"Bool"]];];
+ ["interval_column";["DataType";"Interval";];];
+ ["date_column";["DataType";"Date";];];
+ ]];
+ };
+}
diff --git a/yt/yql/tests/sql/suites/schema/patched6.txt.attr b/yt/yql/tests/sql/suites/schema/patched6.txt.attr
new file mode 100644
index 0000000000..75ac5aeb7d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/patched6.txt.attr
@@ -0,0 +1,15 @@
+{
+ "schema"=<"strict"=%true; "unique_keys"=%false>[
+ {"name"="_yql_column_0";"type"="string";"required"=%true;"sort_order"="ascending"};
+ {"name"="key";"type"="string";"required"=%true;"sort_order"="ascending"};
+ {"name"="subkey";"type"="string";"required"=%true};
+ {"name"="value";"type"="string";"required"=%true};
+ ];
+ "_yql_row_spec"={
+ "TypePatch"=["StructType";[]];
+ "SortMembers"=[];
+ "SortedBy"=["_yql_column_0";"key"];
+ "SortDirections"=[1; 1];
+ "SortedByTypes"=[["DataType";"String"];["DataType";"String"]];
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/schema/patchtype.cfg b/yt/yql/tests/sql/suites/schema/patchtype.cfg
new file mode 100644
index 0000000000..f623e8ac73
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/patchtype.cfg
@@ -0,0 +1,6 @@
+in Input1 patched1.txt
+in Input2 patched2.txt
+in Input3 patched3.txt
+in Input4 patched4.txt
+in Input5 patched5.txt
+in Input6 patched6.txt
diff --git a/yt/yql/tests/sql/suites/schema/patchtype.sql b/yt/yql/tests/sql/suites/schema/patchtype.sql
new file mode 100644
index 0000000000..637cdfbebf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/patchtype.sql
@@ -0,0 +1,8 @@
+USE plato;
+
+SELECT key, subkey, value FROM Input1;
+SELECT key, subkey, value FROM Input2;
+SELECT key, subkey, value FROM Input3;
+SELECT key, subkey, value FROM Input4;
+SELECT any_column, boolean_column, date_column, double_column, int64_column, interval_column, list_column, null_column, optional_column, string_column FROM Input5;
+SELECT key, subkey, value FROM Input6;
diff --git a/yt/yql/tests/sql/suites/schema/read_schema.txt.attr b/yt/yql/tests/sql/suites/schema/read_schema.txt.attr
new file mode 100644
index 0000000000..3176be619e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/read_schema.txt.attr
@@ -0,0 +1,3 @@
+{
+ "_read_schema"=[{"type"="int64";"name"="a"};{"type"="uint64";"name"="b"};{"type"="double";"name"="c"};{"type"="string";"name"="d"};{"type"="boolean";name="e"};{"type"="any";"name"="f"}]
+}
diff --git a/yt/yql/tests/sql/suites/schema/read_schema_change_other.cfg b/yt/yql/tests/sql/suites/schema/read_schema_change_other.cfg
new file mode 100644
index 0000000000..2ab8a973ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/read_schema_change_other.cfg
@@ -0,0 +1,2 @@
+xfail
+in Input read_schema_other.txt
diff --git a/yt/yql/tests/sql/suites/schema/read_schema_change_other.sql b/yt/yql/tests/sql/suites/schema/read_schema_change_other.sql
new file mode 100644
index 0000000000..eb96315c2a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/read_schema_change_other.sql
@@ -0,0 +1,2 @@
+/* custom error:It is forbidden to specify the column '_other'*/
+select * from plato.Input with schema Struct<_other:Yson>;
diff --git a/yt/yql/tests/sql/suites/schema/read_schema_no_any.txt.attr b/yt/yql/tests/sql/suites/schema/read_schema_no_any.txt.attr
new file mode 100644
index 0000000000..0d717f80ae
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/read_schema_no_any.txt.attr
@@ -0,0 +1,3 @@
+{
+ "_read_schema"=[{"type"="int64";"name"="a"};{"type"="uint64";"name"="b"};{"type"="double";"name"="c"};{"type"="string";"name"="d"};{"type"="boolean";name="e"}]
+}
diff --git a/yt/yql/tests/sql/suites/schema/read_schema_other.cfg b/yt/yql/tests/sql/suites/schema/read_schema_other.cfg
new file mode 100644
index 0000000000..64822f8de1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/read_schema_other.cfg
@@ -0,0 +1 @@
+in Input read_schema_other.txt
diff --git a/yt/yql/tests/sql/suites/schema/read_schema_other.sql b/yt/yql/tests/sql/suites/schema/read_schema_other.sql
new file mode 100644
index 0000000000..87b80f3c30
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/read_schema_other.sql
@@ -0,0 +1 @@
+select ListSort(DictItems(_other)) as other from plato.Input order by other;
diff --git a/yt/yql/tests/sql/suites/schema/read_schema_other.txt.attr b/yt/yql/tests/sql/suites/schema/read_schema_other.txt.attr
new file mode 100644
index 0000000000..8a1a87469b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/read_schema_other.txt.attr
@@ -0,0 +1,3 @@
+{
+ "_read_schema"=<"strict" = "false";>[{"type"="int64";"name"="a"};{"type"="uint64";"name"="b"};{"type"="double";"name"="c"};{"type"="string";"name"="d"};{"type"="boolean";name="e"};{"type"="any";"name"="f"}]
+}
diff --git a/yt/yql/tests/sql/suites/schema/read_schema_partial.txt.attr b/yt/yql/tests/sql/suites/schema/read_schema_partial.txt.attr
new file mode 100644
index 0000000000..dd019afccd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/read_schema_partial.txt.attr
@@ -0,0 +1,6 @@
+{
+ "_read_schema"=[
+ {"name"="key";"type"="string"};
+ {"name"="value";"type"="string"};
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/schema/remap_desc.cfg b/yt/yql/tests/sql/suites/schema/remap_desc.cfg
new file mode 100644
index 0000000000..27e2b96813
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/remap_desc.cfg
@@ -0,0 +1 @@
+in Input descending.txt
diff --git a/yt/yql/tests/sql/suites/schema/remap_desc.sql b/yt/yql/tests/sql/suites/schema/remap_desc.sql
new file mode 100644
index 0000000000..23f8492ae2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/remap_desc.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+USE plato;
+
+select TableName() as tn, t.*
+from concat(Input, Input) as t;
diff --git a/yt/yql/tests/sql/suites/schema/row_spec.txt.attr b/yt/yql/tests/sql/suites/schema/row_spec.txt.attr
new file mode 100644
index 0000000000..d2878eb9a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/row_spec.txt.attr
@@ -0,0 +1,3 @@
+{
+ "_yql_row_spec"={"Type"=["StructType";[["a"; ["OptionalType"; ["DataType"; "Int64"]]]; ["b"; ["OptionalType"; ["DataType"; "Uint64"]]]; ["c"; ["OptionalType"; ["DataType"; "Double"]]]; ["d"; ["OptionalType"; ["DataType"; "String"]]]; ["e"; ["OptionalType"; ["DataType"; "Bool"]]]; ["f"; ["OptionalType"; ["DataType"; "Yson"]]]]]; "UniqueKeys"=%false}
+}
diff --git a/yt/yql/tests/sql/suites/schema/row_spec_diff_sort.txt.attr b/yt/yql/tests/sql/suites/schema/row_spec_diff_sort.txt.attr
new file mode 100644
index 0000000000..86ef9822bb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/row_spec_diff_sort.txt.attr
@@ -0,0 +1,18 @@
+{
+ "schema"=<"strict"=%true; "unique_keys"=%false>[
+ {"name"="key";"type"="string";"required"=%true;"sort_order"="ascending"};
+ {"name"="subkey";"type"="string";"required"=%true};
+ {"name"="value";"type"="string";"required"=%true};
+ ];
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]];
+ ]];
+ "SortedBy"=["key";"subkey"];
+ "SortDirections"=[1;1];
+ "SortMembers"=["key";"subkey"];
+ "SortedByTypes"=[["DataType";"String"];["DataType";"String"]];
+ };
+}
diff --git a/yt/yql/tests/sql/suites/schema/row_spec_diff_sort2.txt.attr b/yt/yql/tests/sql/suites/schema/row_spec_diff_sort2.txt.attr
new file mode 100644
index 0000000000..633e8fe403
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/row_spec_diff_sort2.txt.attr
@@ -0,0 +1,19 @@
+{
+ "schema"=<"strict"=%true; "unique_keys"=%false>[
+ {"name"="subkey";"type"="string";"required"=%true;"sort_order"="ascending"};
+ {"name"="key";"type"="string";"required"=%true};
+ {"name"="value";"type"="string";"required"=%true};
+ ];
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]];
+ ]];
+ "TypePatch"=["StructType";[]];
+ "SortedBy"=["key";"subkey"];
+ "SortDirections"=[1;1];
+ "SortMembers"=["key";"subkey"];
+ "SortedByTypes"=[["DataType";"String"];["DataType";"String"]];
+ };
+}
diff --git a/yt/yql/tests/sql/suites/schema/row_spec_diff_sort_desc.txt.attr b/yt/yql/tests/sql/suites/schema/row_spec_diff_sort_desc.txt.attr
new file mode 100644
index 0000000000..6e70786e68
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/row_spec_diff_sort_desc.txt.attr
@@ -0,0 +1,25 @@
+{
+ "schema"=<"strict"=%true; "unique_keys"=%false>[
+ {"name"="key";"type"="string";"required"=%true;"sort_order"="ascending"};
+ {"name"="subkey";"type"="string";"required"=%true};
+ {"name"="value";"type"="string";"required"=%true};
+ {"name"="_yql_column_0";"type"="string";"required"=%true};
+ ];
+ "_yql_row_spec" = {
+ "SortMembers" = ["key"];
+ "SortDirections" = [0];
+ "UniqueKeys" = %false;
+ "Type" = ["StructType";[
+ ["key"; ["DataType";"String"]];
+ ["subkey"; ["DataType";"String"]];
+ ["value"; ["DataType";"String"]];
+ ]];
+ "TypePath" = ["StructType";[]];
+ "SortedByTypes" = [
+ ["DataType";"String"]
+ ];
+ "SortedBy" = [
+ "_yql_column_0"
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/schema/row_spec_extra_sort.txt.attr b/yt/yql/tests/sql/suites/schema/row_spec_extra_sort.txt.attr
new file mode 100644
index 0000000000..aefafb171b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/row_spec_extra_sort.txt.attr
@@ -0,0 +1,18 @@
+{
+ "schema"=<"strict"=%true; "unique_keys"=%false>[
+ {"name"="key";"type"="string";"required"=%true};
+ {"name"="subkey";"type"="string";"required"=%true};
+ {"name"="value";"type"="string";"required"=%true};
+ ];
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]];
+ ]];
+ "SortedBy"=["key"];
+ "SortDirections"=[1];
+ "SortMembers"=["key"];
+ "SortedByTypes"=[["DataType";"String"]];
+ };
+}
diff --git a/yt/yql/tests/sql/suites/schema/row_spec_hide_sort.txt.attr b/yt/yql/tests/sql/suites/schema/row_spec_hide_sort.txt.attr
new file mode 100644
index 0000000000..f1cc5f542d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/row_spec_hide_sort.txt.attr
@@ -0,0 +1,12 @@
+{
+ "schema"=<"strict"=%false; "schema_mode"="weak"; "unique_keys"=%false>[
+ {"name"="key";"type"="any";"required"=%false;"sort_order"="ascending"};
+ ];
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]];
+ ]];
+ };
+}
diff --git a/yt/yql/tests/sql/suites/schema/row_spec_part.txt.attr b/yt/yql/tests/sql/suites/schema/row_spec_part.txt.attr
new file mode 100644
index 0000000000..6216178a50
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/row_spec_part.txt.attr
@@ -0,0 +1,12 @@
+{
+ "schema"=<"strict"=%true; "unique_keys"=%false>[
+ {"name"="key";"type"="string";"required"=%true};
+ {"name"="subkey";"type"="string";"required"=%true};
+ {"name"="value";"type"="string";"required"=%true};
+ ];
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ]];
+ };
+}
diff --git a/yt/yql/tests/sql/suites/schema/row_spec_with_default_values.cfg b/yt/yql/tests/sql/suites/schema/row_spec_with_default_values.cfg
new file mode 100644
index 0000000000..00014cad5b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/row_spec_with_default_values.cfg
@@ -0,0 +1 @@
+in Input row_spec_with_default_values.txt
diff --git a/yt/yql/tests/sql/suites/schema/row_spec_with_default_values.sql b/yt/yql/tests/sql/suites/schema/row_spec_with_default_values.sql
new file mode 100644
index 0000000000..684733fe7b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/row_spec_with_default_values.sql
@@ -0,0 +1 @@
+select * from plato.Input;
diff --git a/yt/yql/tests/sql/suites/schema/row_spec_with_default_values.txt.attr b/yt/yql/tests/sql/suites/schema/row_spec_with_default_values.txt.attr
new file mode 100644
index 0000000000..c59e495acf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/row_spec_with_default_values.txt.attr
@@ -0,0 +1,19 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String";];];
+ ["subkey";["DataType";"String";];];
+ ["value";["DataType";"String";];];
+ ]];
+ "SortedBy"=["key";"subkey";];
+ "SortDirections"=[1;1;];
+ "SortMembers"=["key";"subkey";];
+ "SortedByTypes"=[["DataType";"String";];["DataType";"String";];];
+ "DefaultValues"={"key"="\"\"";"subkey"="\"\"";"value"="\"\"";};
+ };
+ "schema"=<"strict" = %true> [
+ {"type"="string"; "name"="key"; "sort_order"="ascending"};
+ {"type"="string"; "name"="subkey"; "sort_order"="ascending"};
+ {"type"="string"; "name"="value"}
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/schema/schema.txt.attr b/yt/yql/tests/sql/suites/schema/schema.txt.attr
new file mode 100644
index 0000000000..ec236b37ae
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/schema.txt.attr
@@ -0,0 +1,3 @@
+{
+ "schema"=[{"type"="int64";"name"="a"};{"type"="uint64";"name"="b"};{"type"="double";"name"="c"};{"type"="string";"name"="d"};{"type"="boolean";name="e"};{"type"="any";"name"="f"}]
+}
diff --git a/yt/yql/tests/sql/suites/schema/select_all-read_schema.cfg b/yt/yql/tests/sql/suites/schema/select_all-read_schema.cfg
new file mode 100644
index 0000000000..86c772ae1c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all-read_schema.cfg
@@ -0,0 +1 @@
+in Input read_schema.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all-row_spec.cfg b/yt/yql/tests/sql/suites/schema/select_all-row_spec.cfg
new file mode 100644
index 0000000000..32ba245472
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all-row_spec.cfg
@@ -0,0 +1 @@
+in Input row_spec.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all-row_spec_diff_sort.cfg b/yt/yql/tests/sql/suites/schema/select_all-row_spec_diff_sort.cfg
new file mode 100644
index 0000000000..6ddab148ab
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all-row_spec_diff_sort.cfg
@@ -0,0 +1 @@
+in Input row_spec_diff_sort.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all-row_spec_diff_sort2.cfg b/yt/yql/tests/sql/suites/schema/select_all-row_spec_diff_sort2.cfg
new file mode 100644
index 0000000000..65f896224f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all-row_spec_diff_sort2.cfg
@@ -0,0 +1 @@
+in Input row_spec_diff_sort2.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all-row_spec_diff_sort_desc.cfg b/yt/yql/tests/sql/suites/schema/select_all-row_spec_diff_sort_desc.cfg
new file mode 100644
index 0000000000..5c62b38d77
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all-row_spec_diff_sort_desc.cfg
@@ -0,0 +1 @@
+in Input row_spec_diff_sort_desc.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all-row_spec_extra_sort.cfg b/yt/yql/tests/sql/suites/schema/select_all-row_spec_extra_sort.cfg
new file mode 100644
index 0000000000..69bdda2fb5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all-row_spec_extra_sort.cfg
@@ -0,0 +1 @@
+in Input row_spec_extra_sort.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all-row_spec_hide_sort.cfg b/yt/yql/tests/sql/suites/schema/select_all-row_spec_hide_sort.cfg
new file mode 100644
index 0000000000..53f9c737ea
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all-row_spec_hide_sort.cfg
@@ -0,0 +1 @@
+in Input row_spec_hide_sort.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all-row_spec_part.cfg b/yt/yql/tests/sql/suites/schema/select_all-row_spec_part.cfg
new file mode 100644
index 0000000000..f55b54f2a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all-row_spec_part.cfg
@@ -0,0 +1 @@
+in Input row_spec_part.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all-schema.cfg b/yt/yql/tests/sql/suites/schema/select_all-schema.cfg
new file mode 100644
index 0000000000..4e26fdc668
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all-schema.cfg
@@ -0,0 +1 @@
+in Input schema.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all-yamred_dsv.cfg b/yt/yql/tests/sql/suites/schema/select_all-yamred_dsv.cfg
new file mode 100644
index 0000000000..ea928dac01
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all-yamred_dsv.cfg
@@ -0,0 +1 @@
+in Input yamred_dsv.txt yamred_dsv
diff --git a/yt/yql/tests/sql/suites/schema/select_all-yamred_dsv_raw.cfg b/yt/yql/tests/sql/suites/schema/select_all-yamred_dsv_raw.cfg
new file mode 100644
index 0000000000..f3f737a2ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all-yamred_dsv_raw.cfg
@@ -0,0 +1 @@
+in Input yamred_dsv_raw.txt yamred_dsv
diff --git a/yt/yql/tests/sql/suites/schema/select_all.sql b/yt/yql/tests/sql/suites/schema/select_all.sql
new file mode 100644
index 0000000000..684733fe7b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all.sql
@@ -0,0 +1 @@
+select * from plato.Input;
diff --git a/yt/yql/tests/sql/suites/schema/select_all_forceinferschema.cfg b/yt/yql/tests/sql/suites/schema/select_all_forceinferschema.cfg
new file mode 100644
index 0000000000..eeacd081d3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_forceinferschema.cfg
@@ -0,0 +1,4 @@
+in Input inferschema2.txt
+in Input2 inferschema2.txt
+in Input3 inferschema2.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/schema/select_all_forceinferschema.sql b/yt/yql/tests/sql/suites/schema/select_all_forceinferschema.sql
new file mode 100644
index 0000000000..797cbb1364
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_forceinferschema.sql
@@ -0,0 +1,3 @@
+select * from plato.Input with forceinferschema;
+select * from plato.Input2 with forceinferschema="2";
+select * from plato.Input3 with forceinferschema="3";
diff --git a/yt/yql/tests/sql/suites/schema/select_all_inferschema-extra_field.cfg b/yt/yql/tests/sql/suites/schema/select_all_inferschema-extra_field.cfg
new file mode 100644
index 0000000000..312ba32bff
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_inferschema-extra_field.cfg
@@ -0,0 +1 @@
+in Input inferschema_extra_field.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all_inferschema-no_fields.cfg-disabled b/yt/yql/tests/sql/suites/schema/select_all_inferschema-no_fields.cfg-disabled
new file mode 100644
index 0000000000..baf0c61076
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_inferschema-no_fields.cfg-disabled
@@ -0,0 +1 @@
+in Input inferschema_no_fields.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all_inferschema.cfg b/yt/yql/tests/sql/suites/schema/select_all_inferschema.cfg
new file mode 100644
index 0000000000..0d7add8b04
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_inferschema.cfg
@@ -0,0 +1 @@
+in Input inferschema.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all_inferschema.sql b/yt/yql/tests/sql/suites/schema/select_all_inferschema.sql
new file mode 100644
index 0000000000..a053d0d08a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_inferschema.sql
@@ -0,0 +1 @@
+select * from plato.Input with inferscheme;
diff --git a/yt/yql/tests/sql/suites/schema/select_all_inferschema2.cfg b/yt/yql/tests/sql/suites/schema/select_all_inferschema2.cfg
new file mode 100644
index 0000000000..80edd303eb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_inferschema2.cfg
@@ -0,0 +1,2 @@
+in Input2 inferschema2.txt
+in Input3 inferschema2.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all_inferschema2.sql b/yt/yql/tests/sql/suites/schema/select_all_inferschema2.sql
new file mode 100644
index 0000000000..79e591518e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_inferschema2.sql
@@ -0,0 +1,2 @@
+select * from plato.Input2 with inferschema="2";
+select * from plato.Input3 with inferschema="3";
diff --git a/yt/yql/tests/sql/suites/schema/select_all_inferschema_limit.cfg b/yt/yql/tests/sql/suites/schema/select_all_inferschema_limit.cfg
new file mode 100644
index 0000000000..0d7add8b04
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_inferschema_limit.cfg
@@ -0,0 +1 @@
+in Input inferschema.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all_inferschema_limit.sql b/yt/yql/tests/sql/suites/schema/select_all_inferschema_limit.sql
new file mode 100644
index 0000000000..dd3951e482
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_inferschema_limit.sql
@@ -0,0 +1 @@
+select * from plato.Input with inferscheme limit 2;
diff --git a/yt/yql/tests/sql/suites/schema/select_all_inferschema_op.cfg b/yt/yql/tests/sql/suites/schema/select_all_inferschema_op.cfg
new file mode 100644
index 0000000000..0d7add8b04
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_inferschema_op.cfg
@@ -0,0 +1 @@
+in Input inferschema.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all_inferschema_op.sql b/yt/yql/tests/sql/suites/schema/select_all_inferschema_op.sql
new file mode 100644
index 0000000000..ad16b10591
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_inferschema_op.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+/* kikimr can not */
+pragma yt.InferSchemaTableCountThreshold="0";
+
+select * from plato.Input with inferscheme;
diff --git a/yt/yql/tests/sql/suites/schema/select_all_inferschema_op_custom_tmp.cfg b/yt/yql/tests/sql/suites/schema/select_all_inferschema_op_custom_tmp.cfg
new file mode 100644
index 0000000000..0d7add8b04
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_inferschema_op_custom_tmp.cfg
@@ -0,0 +1 @@
+in Input inferschema.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all_inferschema_op_custom_tmp.sql b/yt/yql/tests/sql/suites/schema/select_all_inferschema_op_custom_tmp.sql
new file mode 100644
index 0000000000..b1588fd8c3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_inferschema_op_custom_tmp.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* kikimr can not */
+pragma yt.InferSchemaTableCountThreshold="0";
+pragma yt.TmpFolder="custom";
+
+select * from plato.Input with inferscheme;
diff --git a/yt/yql/tests/sql/suites/schema/select_all_inferschema_range.cfg b/yt/yql/tests/sql/suites/schema/select_all_inferschema_range.cfg
new file mode 100644
index 0000000000..e0dbc3b2d9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_inferschema_range.cfg
@@ -0,0 +1,3 @@
+in Input1 inferschema.txt
+in Input2 inferschema.txt
+in Input3 inferschema.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all_inferschema_range.sql b/yt/yql/tests/sql/suites/schema/select_all_inferschema_range.sql
new file mode 100644
index 0000000000..a610f9cedb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_inferschema_range.sql
@@ -0,0 +1,2 @@
+pragma yt.InferSchemaTableCountThreshold="0";
+select * from plato.range(``, Input1, Input3) with inferscheme;
diff --git a/yt/yql/tests/sql/suites/schema/select_all_inferschema_range_empty_fail.cfg b/yt/yql/tests/sql/suites/schema/select_all_inferschema_range_empty_fail.cfg
new file mode 100644
index 0000000000..c2ff0dfe88
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_inferschema_range_empty_fail.cfg
@@ -0,0 +1,4 @@
+xfail
+in Input1 inferschema.txt
+in Input2 empty.txt
+in Input3 inferschema.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_all_inferschema_range_empty_fail.sql b/yt/yql/tests/sql/suites/schema/select_all_inferschema_range_empty_fail.sql
new file mode 100644
index 0000000000..60e0887a84
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_all_inferschema_range_empty_fail.sql
@@ -0,0 +1,3 @@
+/* custom error:Cannot infer schema for table Input2, first 1 row(s) has no columns*/
+pragma yt.InferSchemaTableCountThreshold="0";
+select * from plato.range(``, Input1, Input3) with inferscheme;
diff --git a/yt/yql/tests/sql/suites/schema/select_field-read_schema.cfg b/yt/yql/tests/sql/suites/schema/select_field-read_schema.cfg
new file mode 100644
index 0000000000..86c772ae1c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_field-read_schema.cfg
@@ -0,0 +1 @@
+in Input read_schema.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_field-row_spec.cfg b/yt/yql/tests/sql/suites/schema/select_field-row_spec.cfg
new file mode 100644
index 0000000000..32ba245472
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_field-row_spec.cfg
@@ -0,0 +1 @@
+in Input row_spec.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_field-schema.cfg b/yt/yql/tests/sql/suites/schema/select_field-schema.cfg
new file mode 100644
index 0000000000..4e26fdc668
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_field-schema.cfg
@@ -0,0 +1 @@
+in Input schema.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_field.sql b/yt/yql/tests/sql/suites/schema/select_field.sql
new file mode 100644
index 0000000000..ea246caffb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_field.sql
@@ -0,0 +1 @@
+select a from plato.Input;
diff --git a/yt/yql/tests/sql/suites/schema/select_fields_inferschema.cfg b/yt/yql/tests/sql/suites/schema/select_fields_inferschema.cfg
new file mode 100644
index 0000000000..0d7add8b04
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_fields_inferschema.cfg
@@ -0,0 +1 @@
+in Input inferschema.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_fields_inferschema.sql b/yt/yql/tests/sql/suites/schema/select_fields_inferschema.sql
new file mode 100644
index 0000000000..2a38709e51
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_fields_inferschema.sql
@@ -0,0 +1 @@
+select a, b, d from plato.Input with inferscheme;
diff --git a/yt/yql/tests/sql/suites/schema/select_operate_with_columns_simple.sql b/yt/yql/tests/sql/suites/schema/select_operate_with_columns_simple.sql
new file mode 100644
index 0000000000..5c1e78aac7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_operate_with_columns_simple.sql
@@ -0,0 +1 @@
+select a + b + c from plato.Input;
diff --git a/yt/yql/tests/sql/suites/schema/select_reordered.sql b/yt/yql/tests/sql/suites/schema/select_reordered.sql
new file mode 100644
index 0000000000..38d1ad8ee2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_reordered.sql
@@ -0,0 +1 @@
+select b, c, d, e, a, f from plato.Input;
diff --git a/yt/yql/tests/sql/suites/schema/select_simple.sql b/yt/yql/tests/sql/suites/schema/select_simple.sql
new file mode 100644
index 0000000000..9d081c58a9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_simple.sql
@@ -0,0 +1 @@
+select a as aa, b as bb, c as cc, d as dd, e as ee, f as ff from plato.Input;
diff --git a/yt/yql/tests/sql/suites/schema/select_with_map-partial_read_schema.cfg b/yt/yql/tests/sql/suites/schema/select_with_map-partial_read_schema.cfg
new file mode 100644
index 0000000000..d19bb07754
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_with_map-partial_read_schema.cfg
@@ -0,0 +1 @@
+in Input read_schema_partial.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_with_map-sorted_desc.cfg b/yt/yql/tests/sql/suites/schema/select_with_map-sorted_desc.cfg
new file mode 100644
index 0000000000..2bcea8c52e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_with_map-sorted_desc.cfg
@@ -0,0 +1 @@
+in Input sorted_desc.txt
diff --git a/yt/yql/tests/sql/suites/schema/select_with_map.sql b/yt/yql/tests/sql/suites/schema/select_with_map.sql
new file mode 100644
index 0000000000..701896d6aa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_with_map.sql
@@ -0,0 +1 @@
+select * from plato.Input where key > "100"; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/schema/select_yamr_fields.cfg b/yt/yql/tests/sql/suites/schema/select_yamr_fields.cfg
new file mode 100644
index 0000000000..f3f737a2ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_yamr_fields.cfg
@@ -0,0 +1 @@
+in Input yamred_dsv_raw.txt yamred_dsv
diff --git a/yt/yql/tests/sql/suites/schema/select_yamr_fields.sql b/yt/yql/tests/sql/suites/schema/select_yamr_fields.sql
new file mode 100644
index 0000000000..0447ad6e5a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/select_yamr_fields.sql
@@ -0,0 +1 @@
+select key,subkey from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/schema/skip_complex_type.cfg b/yt/yql/tests/sql/suites/schema/skip_complex_type.cfg
new file mode 100644
index 0000000000..23b45796d2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/skip_complex_type.cfg
@@ -0,0 +1 @@
+in Input skip_complex_type.txt
diff --git a/yt/yql/tests/sql/suites/schema/skip_complex_type.sql b/yt/yql/tests/sql/suites/schema/skip_complex_type.sql
new file mode 100644
index 0000000000..fc573ceb44
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/skip_complex_type.sql
@@ -0,0 +1,5 @@
+pragma DqEngine="disable";
+PRAGMA yt.InferSchema;
+pragma yt.UseNativeYtTypes="1";
+PRAGMA yt.DefaultMaxJobFails="1";
+select boobee, DictLookup(_other, 'boobee') from plato.Input order by boobee;
diff --git a/yt/yql/tests/sql/suites/schema/skip_complex_type.txt.attr b/yt/yql/tests/sql/suites/schema/skip_complex_type.txt.attr
new file mode 100644
index 0000000000..a4e88ede97
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/skip_complex_type.txt.attr
@@ -0,0 +1,3 @@
+{
+ "schema"=<strict=%false>[{name=boobee;required=%true;type=int32;type_v3=int32};{name=xx;required=%false;type=any;type_v3={type_name=optional;item={type_name=variant;elements=[{type=int32};{type=string};{type=double}]}}}]
+}
diff --git a/yt/yql/tests/sql/suites/schema/skip_complex_type2.cfg b/yt/yql/tests/sql/suites/schema/skip_complex_type2.cfg
new file mode 100644
index 0000000000..4848247dcb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/skip_complex_type2.cfg
@@ -0,0 +1 @@
+in Input skip_complex_type2.txt
diff --git a/yt/yql/tests/sql/suites/schema/skip_complex_type2.sql b/yt/yql/tests/sql/suites/schema/skip_complex_type2.sql
new file mode 100644
index 0000000000..fc573ceb44
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/skip_complex_type2.sql
@@ -0,0 +1,5 @@
+pragma DqEngine="disable";
+PRAGMA yt.InferSchema;
+pragma yt.UseNativeYtTypes="1";
+PRAGMA yt.DefaultMaxJobFails="1";
+select boobee, DictLookup(_other, 'boobee') from plato.Input order by boobee;
diff --git a/yt/yql/tests/sql/suites/schema/skip_complex_type2.txt.attr b/yt/yql/tests/sql/suites/schema/skip_complex_type2.txt.attr
new file mode 100644
index 0000000000..7226f6c31c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/skip_complex_type2.txt.attr
@@ -0,0 +1,3 @@
+{
+ "schema"=<strict=%false>[{name=boobee;required=%true;type=int32;type_v3=int32};{name=xx;required=%false;type=any;type_v3={type_name=optional;item={type_name=list;item={type_name=struct;members=[{type=int32;name=bee};{type=int32;name=foo}]}}}}]
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/schema/sorted.txt.attr b/yt/yql/tests/sql/suites/schema/sorted.txt.attr
new file mode 100644
index 0000000000..ed13e20223
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/sorted.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/schema/sorted_desc.txt.attr b/yt/yql/tests/sql/suites/schema/sorted_desc.txt.attr
new file mode 100644
index 0000000000..903b4c7d93
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/sorted_desc.txt.attr
@@ -0,0 +1,46 @@
+{
+ "_yql_row_spec" = {
+ "SortMembers" = [
+ "key"
+ ];
+ "SortDirections" = [
+ 0
+ ];
+ "UniqueKeys" = %false;
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ];
+ "SortedByTypes" = [
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ "SortedBy" = [
+ "_yql_column_0"
+ ]
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/schema/unsorted.txt.attr b/yt/yql/tests/sql/suites/schema/unsorted.txt.attr
new file mode 100644
index 0000000000..3176be619e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/unsorted.txt.attr
@@ -0,0 +1,3 @@
+{
+ "_read_schema"=[{"type"="int64";"name"="a"};{"type"="uint64";"name"="b"};{"type"="double";"name"="c"};{"type"="string";"name"="d"};{"type"="boolean";name="e"};{"type"="any";"name"="f"}]
+}
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_append.cfg b/yt/yql/tests/sql/suites/schema/user_schema_append.cfg
new file mode 100644
index 0000000000..e523b0a1e4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_append.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+out Input input.txt
+xfail
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_append.sql b/yt/yql/tests/sql/suites/schema/user_schema_append.sql
new file mode 100644
index 0000000000..f1b86675c3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_append.sql
@@ -0,0 +1,6 @@
+/* custom error:Table "Input" row type differs from the written row type: Struct<-subkey:String>*/
+USE plato;
+
+INSERT INTO Input
+SELECT * FROM Input WITH SCHEMA Struct<key:String, value:String>;
+
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_bind.sql b/yt/yql/tests/sql/suites/schema/user_schema_bind.sql
new file mode 100644
index 0000000000..778aeae870
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_bind.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+use plato;
+
+$table = "In" || "put";
+
+select *
+from $table
+with schema Struct<a:Int64?>;
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_directread.sql b/yt/yql/tests/sql/suites/schema/user_schema_directread.sql
new file mode 100644
index 0000000000..0699179524
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_directread.sql
@@ -0,0 +1,8 @@
+use plato;
+
+pragma directread;
+
+$in = (select * from Input where a != 0);
+
+select * from $in;
+
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_empty_table_ranges.sql b/yt/yql/tests/sql/suites/schema/user_schema_empty_table_ranges.sql
new file mode 100644
index 0000000000..5e70b05ab1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_empty_table_ranges.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+use plato;
+
+select *
+from range("","foo","foo")
+with schema Struct<Key:String>;
+
+select *
+from Range_strict("","foo","foo")
+with schema Struct<Key:String>;
+
+select * from Each(ListCreate(String))
+with schema Struct<Key:Int32>;
+
+select * from Each_strict(ListCreate(String))
+with schema Struct<Key:Int32>;
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_existing_column.cfg b/yt/yql/tests/sql/suites/schema/user_schema_existing_column.cfg
new file mode 100644
index 0000000000..f246051d81
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_existing_column.cfg
@@ -0,0 +1 @@
+in Input input_no_schema.txt
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_existing_column.sql b/yt/yql/tests/sql/suites/schema/user_schema_existing_column.sql
new file mode 100644
index 0000000000..021311a6a7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_existing_column.sql
@@ -0,0 +1,4 @@
+/* syntax version 1 */
+use plato;
+
+select * from Input with schema Struct<key:String>; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_missing_column.cfg b/yt/yql/tests/sql/suites/schema/user_schema_missing_column.cfg
new file mode 100644
index 0000000000..f246051d81
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_missing_column.cfg
@@ -0,0 +1 @@
+in Input input_no_schema.txt
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_missing_column.sql b/yt/yql/tests/sql/suites/schema/user_schema_missing_column.sql
new file mode 100644
index 0000000000..ae68ca4339
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_missing_column.sql
@@ -0,0 +1,4 @@
+/* syntax version 1 */
+use plato;
+
+select * from Input with schema Struct<value1:String?>; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_mix1.cfg b/yt/yql/tests/sql/suites/schema/user_schema_mix1.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_mix1.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_mix1.sql b/yt/yql/tests/sql/suites/schema/user_schema_mix1.sql
new file mode 100644
index 0000000000..ceda4b7624
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_mix1.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+USE plato;
+
+SELECT * FROM Input;
+SELECT * FROM Input WITH SCHEMA Struct<key:String, value:String>;
+
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_mix2.cfg b/yt/yql/tests/sql/suites/schema/user_schema_mix2.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_mix2.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_mix2.sql b/yt/yql/tests/sql/suites/schema/user_schema_mix2.sql
new file mode 100644
index 0000000000..52885ab1b9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_mix2.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+USE plato;
+
+SELECT * FROM Input WITH SCHEMA Struct<key:String, value:String>;
+SELECT * FROM Input;
+
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_mix3.cfg b/yt/yql/tests/sql/suites/schema/user_schema_mix3.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_mix3.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_mix3.sql b/yt/yql/tests/sql/suites/schema/user_schema_mix3.sql
new file mode 100644
index 0000000000..83bb1a6a1f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_mix3.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+USE plato;
+
+SELECT * FROM Input WITH SCHEMA Struct<key:String, subkey:String, value:String>;
+SELECT * FROM Input;
+
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_no_infer.cfg b/yt/yql/tests/sql/suites/schema/user_schema_no_infer.cfg
new file mode 100644
index 0000000000..964ee21a18
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_no_infer.cfg
@@ -0,0 +1 @@
+in Input empty_no_schema.txt
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_no_infer.sql b/yt/yql/tests/sql/suites/schema/user_schema_no_infer.sql
new file mode 100644
index 0000000000..1c3343a295
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_no_infer.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+use plato;
+pragma yt.InferSchema;
+
+select * from Input with schema Struct<key:String>; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_override.cfg b/yt/yql/tests/sql/suites/schema/user_schema_override.cfg
new file mode 100644
index 0000000000..cf3e367ee4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_override.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Input input.txt
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_override.sql b/yt/yql/tests/sql/suites/schema/user_schema_override.sql
new file mode 100644
index 0000000000..126fe3f86d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_override.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+USE plato;
+
+INSERT INTO Input WITH TRUNCATE
+SELECT * FROM Input WITH SCHEMA Struct<key:String, value:String>;
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_patch_columns.cfg b/yt/yql/tests/sql/suites/schema/user_schema_patch_columns.cfg
new file mode 100644
index 0000000000..f246051d81
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_patch_columns.cfg
@@ -0,0 +1 @@
+in Input input_no_schema.txt
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_patch_columns.sql b/yt/yql/tests/sql/suites/schema/user_schema_patch_columns.sql
new file mode 100644
index 0000000000..a40ef2d04b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_patch_columns.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+use plato;
+pragma yt.InferSchema;
+
+select ListSort(DictItems(_other)) as _other,key,subkey from Input with columns Struct<key:Utf8, subkey:String?>; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_with_sort.cfg b/yt/yql/tests/sql/suites/schema/user_schema_with_sort.cfg
new file mode 100644
index 0000000000..7f2ba236c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_with_sort.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted.txt
+in Input2 sorted_desc.txt
diff --git a/yt/yql/tests/sql/suites/schema/user_schema_with_sort.sql b/yt/yql/tests/sql/suites/schema/user_schema_with_sort.sql
new file mode 100644
index 0000000000..442c257187
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/user_schema_with_sort.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+USE plato;
+
+SELECT * FROM Input1 WITH SCHEMA Struct<key:String, value:String> ORDER BY key;
+SELECT * FROM Input1 WITH SCHEMA Struct<key:String?, subkey:String> ORDER BY key; -- should reset sort
+SELECT * FROM Input2 WITH SCHEMA Struct<key:String, subkey:String> ORDER BY key DESC;
diff --git a/yt/yql/tests/sql/suites/schema/yamred_dsv.txt.attr b/yt/yql/tests/sql/suites/schema/yamred_dsv.txt.attr
new file mode 100644
index 0000000000..b6264f0dfc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/yamred_dsv.txt.attr
@@ -0,0 +1,4 @@
+{
+ "_format"=<"fs"="\t";"rs"="\n";"has_subkey"=%true;"escape_carriage_return"=%true;"key_column_names"=["key"];"subkey_column_names"=["subkey"]>"yamred_dsv";
+ "_yql_read_udf"="Dsv.ReadRecord"
+}
diff --git a/yt/yql/tests/sql/suites/schema/yamred_dsv_raw.txt.attr b/yt/yql/tests/sql/suites/schema/yamred_dsv_raw.txt.attr
new file mode 100644
index 0000000000..0a26cb14d4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/yamred_dsv_raw.txt.attr
@@ -0,0 +1,11 @@
+{
+ "_format" = <
+ "escape_carriage_return" = %true;
+ "has_subkey" = %false;
+ "key_column_names" = [
+ "a";
+ "b"
+ ];
+ >
+ "yamred_dsv";
+}
diff --git a/yt/yql/tests/sql/suites/schema/yamred_dsv_select_from_dict.cfg b/yt/yql/tests/sql/suites/schema/yamred_dsv_select_from_dict.cfg
new file mode 100644
index 0000000000..ea928dac01
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/yamred_dsv_select_from_dict.cfg
@@ -0,0 +1 @@
+in Input yamred_dsv.txt yamred_dsv
diff --git a/yt/yql/tests/sql/suites/schema/yamred_dsv_select_from_dict.sql b/yt/yql/tests/sql/suites/schema/yamred_dsv_select_from_dict.sql
new file mode 100644
index 0000000000..6c22e21f41
--- /dev/null
+++ b/yt/yql/tests/sql/suites/schema/yamred_dsv_select_from_dict.sql
@@ -0,0 +1,2 @@
+/* syntax version 1 */
+select key as key, subkey as subkey, Input.`dict`["a"] as a, Input.`dict`["b"] as b, Input.`dict`["c"] as c, Input.`dict`["d"] as d from plato.Input;
diff --git a/yt/yql/tests/sql/suites/select/anon_clash.cfg b/yt/yql/tests/sql/suites/select/anon_clash.cfg
new file mode 100644
index 0000000000..5dae597903
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/anon_clash.cfg
@@ -0,0 +1 @@
+xfail
diff --git a/yt/yql/tests/sql/suites/select/anon_clash.sql b/yt/yql/tests/sql/suites/select/anon_clash.sql
new file mode 100644
index 0000000000..b4b62d51cf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/anon_clash.sql
@@ -0,0 +1,9 @@
+/* custom error: Table "a" does not exist */
+use plato;
+
+insert into @a select 1 as t;
+
+commit;
+
+select * from @a;
+select * from a;
diff --git a/yt/yql/tests/sql/suites/select/append_to_value.cfg b/yt/yql/tests/sql/suites/select/append_to_value.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/append_to_value.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/select/append_to_value.sql b/yt/yql/tests/sql/suites/select/append_to_value.sql
new file mode 100644
index 0000000000..399241b7b6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/append_to_value.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select key, subkey, value || "foo" as new_value from plato.Input;
diff --git a/yt/yql/tests/sql/suites/select/append_to_value_1000.cfg b/yt/yql/tests/sql/suites/select/append_to_value_1000.cfg
new file mode 100644
index 0000000000..97c9faa1f7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/append_to_value_1000.cfg
@@ -0,0 +1,2 @@
+in Input input1100.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/select/append_to_value_1000.sql b/yt/yql/tests/sql/suites/select/append_to_value_1000.sql
new file mode 100644
index 0000000000..c86c8d13cd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/append_to_value_1000.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* kikimr can not - no ref select mode */
+select key, subkey, value || "foo" as new_value from plato.Input;
diff --git a/yt/yql/tests/sql/suites/select/autoextract_source_value.sql b/yt/yql/tests/sql/suites/select/autoextract_source_value.sql
new file mode 100644
index 0000000000..8a865b85c7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/autoextract_source_value.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+use plato;
+
+$_data = (SELECT key as kk, subkey as sk, value as val FROM plato.Input WHERE key == '075');
+$data_one_key = (SELECT subkey as sk FROM plato.Input WHERE key == '075');
+
+SELECT * FROM Input WHERE key = $data_one_key;
diff --git a/yt/yql/tests/sql/suites/select/backtick_with_escapes.sql b/yt/yql/tests/sql/suites/select/backtick_with_escapes.sql
new file mode 100644
index 0000000000..c8120b41bc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/backtick_with_escapes.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+USE plato;
+SELECT key as `#[k]ey`, subkey as `#[s]ubkey`, value as `\x5bv\x5dalue#` FROM Input;
diff --git a/yt/yql/tests/sql/suites/select/bit_ops.sql b/yt/yql/tests/sql/suites/select/bit_ops.sql
new file mode 100644
index 0000000000..b7fd34b68b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/bit_ops.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+SELECT
+ LENGTH(key) & LENGTH(value) as and_res,
+ LENGTH(key) | LENGTH(value) as or_res,
+ LENGTH(key) ^ LENGTH(value) as xor_res,
+ LENGTH(key) << 1 as shl_res,
+ LENGTH(key) >> 1 as shr_res,
+ LENGTH(key) |<< 15 as rotl_res,
+ LENGTH(key) >>| 15 as rotr_res,
+ ~LENGTH(key) as not_res
+FROM plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/boolean_where.cfg b/yt/yql/tests/sql/suites/select/boolean_where.cfg
new file mode 100644
index 0000000000..a09f034ddd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/boolean_where.cfg
@@ -0,0 +1 @@
+in Input boolean_where.txt
diff --git a/yt/yql/tests/sql/suites/select/boolean_where.sql b/yt/yql/tests/sql/suites/select/boolean_where.sql
new file mode 100644
index 0000000000..c12a9b6022
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/boolean_where.sql
@@ -0,0 +1,2 @@
+select * from plato.Input where e;
+select a from plato.Input where not e;
diff --git a/yt/yql/tests/sql/suites/select/boolean_where.txt.attr b/yt/yql/tests/sql/suites/select/boolean_where.txt.attr
new file mode 100644
index 0000000000..3176be619e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/boolean_where.txt.attr
@@ -0,0 +1,3 @@
+{
+ "_read_schema"=[{"type"="int64";"name"="a"};{"type"="uint64";"name"="b"};{"type"="double";"name"="c"};{"type"="string";"name"="d"};{"type"="boolean";name="e"};{"type"="any";"name"="f"}]
+}
diff --git a/yt/yql/tests/sql/suites/select/braces.sql b/yt/yql/tests/sql/suites/select/braces.sql
new file mode 100644
index 0000000000..55834ff839
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/braces.sql
@@ -0,0 +1 @@
+select key, subkey, ("foo" || "bar") as value from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/calculated_values.sql b/yt/yql/tests/sql/suites/select/calculated_values.sql
new file mode 100644
index 0000000000..f23c91eaf8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/calculated_values.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* can not check this with postgres becouse order of columns is not specified here */
+select key, (value || "ab"), (value || "a"), value from plato.Input order by key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/cast_double_to_uint32.sql b/yt/yql/tests/sql/suites/select/cast_double_to_uint32.sql
new file mode 100644
index 0000000000..4e9d9f6737
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/cast_double_to_uint32.sql
@@ -0,0 +1 @@
+select key, subkey, cast(cast(3.1415 as smallint) as varchar) as value from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/column_labels.sql b/yt/yql/tests/sql/suites/select/column_labels.sql
new file mode 100644
index 0000000000..eacf0460c9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/column_labels.sql
@@ -0,0 +1 @@
+select key, subkey || value from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/complex_filter_with_order.sql b/yt/yql/tests/sql/suites/select/complex_filter_with_order.sql
new file mode 100644
index 0000000000..6ed86d9d92
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/complex_filter_with_order.sql
@@ -0,0 +1 @@
+select key as value, subkey, value as key from plato.Input where value > "A" and length(value) = cast(3 as smallint) order by key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/complex_view_input.txt.attr b/yt/yql/tests/sql/suites/select/complex_view_input.txt.attr
new file mode 100644
index 0000000000..a9108a292e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/complex_view_input.txt.attr
@@ -0,0 +1,32 @@
+{
+ "_yql_view_struct"="SELECT YQL::@@(AsStruct '('k (Member row 'key)) '('s (Member row 'subkey)) '('v (Member row 'value)))@@ as struct FROM self;";
+ "_yql_view_tuple"="SELECT YQL::@@'((Member row 'key) (Member row 'subkey) (Member row 'value))@@ as tuple FROM self;";
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/select/const_subrequest_and_select_by_all.sql b/yt/yql/tests/sql/suites/select/const_subrequest_and_select_by_all.sql
new file mode 100644
index 0000000000..405f199c6b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/const_subrequest_and_select_by_all.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+USE plato;
+
+$input = (FROM Input SELECT key ORDER BY key LIMIT 3);
+
+--insert into Output
+SELECT * FROM $input;
+
+SELECT * FROM Input WHERE key = $input;
diff --git a/yt/yql/tests/sql/suites/select/corr_name_in_select.sql b/yt/yql/tests/sql/suites/select/corr_name_in_select.sql
new file mode 100644
index 0000000000..10294f918d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/corr_name_in_select.sql
@@ -0,0 +1 @@
+select b.sortkey from (select a.key as sortkey from plato.Input as a) as b order by b.sortkey desc;
diff --git a/yt/yql/tests/sql/suites/select/corr_name_in_select_seq.sql b/yt/yql/tests/sql/suites/select/corr_name_in_select_seq.sql
new file mode 100644
index 0000000000..514b9f94cb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/corr_name_in_select_seq.sql
@@ -0,0 +1 @@
+select c.key from (select b.key from (select a.key from plato.Input as a) as b) as c order by c.key;
diff --git a/yt/yql/tests/sql/suites/select/create_structures.sql b/yt/yql/tests/sql/suites/select/create_structures.sql
new file mode 100644
index 0000000000..79baf49bb3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/create_structures.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select (key as k), (subkey as s, value as v) from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/create_tuples.sql b/yt/yql/tests/sql/suites/select/create_tuples.sql
new file mode 100644
index 0000000000..84387a3b06
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/create_tuples.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select (key,), (subkey, value) from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/deep_udf_call.cfg b/yt/yql/tests/sql/suites/select/deep_udf_call.cfg
new file mode 100644
index 0000000000..55c2f97264
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/deep_udf_call.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
+udf math_udf
diff --git a/yt/yql/tests/sql/suites/select/deep_udf_call.sql b/yt/yql/tests/sql/suites/select/deep_udf_call.sql
new file mode 100644
index 0000000000..03bceb447b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/deep_udf_call.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+USE plato;
+
+$data = (
+ SELECT
+ Math::Pi() * CAST(subkey AS Double) AS rad
+ FROM Input
+);
+
+--INSERT INTO Output
+SELECT Math::Sqrt(Math::Sin(rad) * Math::Sin(rad) + Math::Cos(rad) * Math::Cos(rad)) FROM $data
diff --git a/yt/yql/tests/sql/suites/select/default.cfg b/yt/yql/tests/sql/suites/select/default.cfg
new file mode 100644
index 0000000000..a1f7a5a9b7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/default.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/select/dict_lookup.sql b/yt/yql/tests/sql/suites/select/dict_lookup.sql
new file mode 100644
index 0000000000..50f85dd099
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/dict_lookup.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+$dictList = (select
+ AsDict(AsTuple(value, CAST(subkey AS Int32))) as `dict`,
+ AsDict(AsTuple("z", "a"), AsTuple("y", "b")) AS d,
+ subkey, value
+from Input);
+
+select d["z"] as static, input.`dict`[input.value] as dynamic, input.`dict` as `dict` from $dictList as input;
diff --git a/yt/yql/tests/sql/suites/select/dict_lookup_by_key.sql b/yt/yql/tests/sql/suites/select/dict_lookup_by_key.sql
new file mode 100644
index 0000000000..9a7feebcae
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/dict_lookup_by_key.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+$key_text = AsDict(
+ ('911', 'emergency'),
+ ('200', 'two hundred'),
+ ('150', 'one and half hundred'),
+ ('023', 'funny'),
+ ('075', '3/4 of hundred')
+);
+
+SELECT
+ value,
+ $key_text[key] as key_text
+from plato.Input;
diff --git a/yt/yql/tests/sql/suites/select/dict_lookup_by_key_with_def.sql b/yt/yql/tests/sql/suites/select/dict_lookup_by_key_with_def.sql
new file mode 100644
index 0000000000..19011f7714
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/dict_lookup_by_key_with_def.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+$key_text = AsDict(
+ ('911', 'emergency'),
+ ('200', 'two hundred'),
+ ('150', 'one and half hundred'),
+ ('023', 'funny'),
+ ('075', '3/4 of hundred')
+);
+
+SELECT
+ value,
+ $key_text[key] ?? "unknown" as key_text
+from plato.Input;
diff --git a/yt/yql/tests/sql/suites/select/dict_lookup_column_names.sql b/yt/yql/tests/sql/suites/select/dict_lookup_column_names.sql
new file mode 100644
index 0000000000..6ee1151214
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/dict_lookup_column_names.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+$dictList = (select AsDict(AsTuple(value, CAST(subkey AS Int32))) as `dict`, subkey, value from Input);
+select input.`dict`[input.value], input.`dict`[input.subkey] from $dictList as input;
diff --git a/yt/yql/tests/sql/suites/select/dict_with_few_keys.sql b/yt/yql/tests/sql/suites/select/dict_with_few_keys.sql
new file mode 100644
index 0000000000..b2a1601612
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/dict_with_few_keys.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+$dict = (
+SELECT
+ AsDict(
+ AsTuple("key", cast(key as uint32) ?? 0),
+ AsTuple("sk", cast(subkey as uint32) ?? 1),
+ AsTuple("str", Cast(ByteAt(value, 0) as uint32) ?? 256)
+ ) as dd
+FROM Input);
+
+--INSERT INTO Output
+SELECT dd['key'] as key, dd['str'] as zz from $dict as d ORDER BY key, zz
diff --git a/yt/yql/tests/sql/suites/select/discard.sql b/yt/yql/tests/sql/suites/select/discard.sql
new file mode 100644
index 0000000000..f1f3423811
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/discard.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+use plato;
+pragma DisableSimpleColumns;
+discard select 1;
+discard select * from Input;
+discard select * from Input where key<"foo";
+discard select * from Input as a join Input as b using(key);
+discard select sum(length(value)), key, subkey from Input group by rollup(key,subkey) order by key, subkey;
+discard select * from (select key || "a" || "b" as key from Input) as a join (select key || "ab" as key from Input) as b using(key);
diff --git a/yt/yql/tests/sql/suites/select/dot_in_alias.sql b/yt/yql/tests/sql/suites/select/dot_in_alias.sql
new file mode 100644
index 0000000000..0f5f81aae8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/dot_in_alias.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+USE plato;
+PRAGMA AllowDotInAlias;
+
+--INSERT INTO Output
+SELECT key as `.key`, subkey as `sub.key`, value as `value.` FROM Input ORDER BY `.key`, `sub.key`
diff --git a/yt/yql/tests/sql/suites/select/dot_name_subrequest.sql b/yt/yql/tests/sql/suites/select/dot_name_subrequest.sql
new file mode 100644
index 0000000000..a685c26f29
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/dot_name_subrequest.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+USE plato;
+PRAGMA DisableSimpleColumns;
+
+$req = (SELECT 100500 as magic, t.* FROM Input as t);
+
+--INSERT INTO Output
+SELECT `t.subkey` as sk, `t.value` as val FROM $req ORDER BY sk
diff --git a/yt/yql/tests/sql/suites/select/exists_false.sql b/yt/yql/tests/sql/suites/select/exists_false.sql
new file mode 100644
index 0000000000..dd4564a387
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/exists_false.sql
@@ -0,0 +1 @@
+SELECT EXISTS (SELECT * FROM plato.Input WHERE key = 'none') from plato.Input;
diff --git a/yt/yql/tests/sql/suites/select/exists_true.sql b/yt/yql/tests/sql/suites/select/exists_true.sql
new file mode 100644
index 0000000000..163f223faf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/exists_true.sql
@@ -0,0 +1 @@
+SELECT EXISTS (SELECT 'Cool') from plato.Input;
diff --git a/yt/yql/tests/sql/suites/select/from_in_front.sql b/yt/yql/tests/sql/suites/select/from_in_front.sql
new file mode 100644
index 0000000000..70b0c1c356
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/from_in_front.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+from plato.Input select * order by key, subkey limit 1;
diff --git a/yt/yql/tests/sql/suites/select/from_in_front_sub.sql b/yt/yql/tests/sql/suites/select/from_in_front_sub.sql
new file mode 100644
index 0000000000..e611f8c661
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/from_in_front_sub.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+from
+ (select cast(subkey as Double) / cast(key as Double) as val, value from plato.Input2) as res
+select
+ count(val) as subkey,
+ cast(avg(val) as int) as value,
+ value as key
+group by value
+order by subkey, value; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/hits_count.cfg b/yt/yql/tests/sql/suites/select/hits_count.cfg
new file mode 100644
index 0000000000..3dd8c79387
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/hits_count.cfg
@@ -0,0 +1,3 @@
+in Input1 hits_input1.txt
+in Input2 hits_input2.txt
+udf url_udf \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/hits_count.sql b/yt/yql/tests/sql/suites/select/hits_count.sql
new file mode 100644
index 0000000000..df10886307
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/hits_count.sql
@@ -0,0 +1,33 @@
+/* postgres can not */
+USE plato;
+
+$data = (
+ SELECT
+ Url::Normalize(value) AS normalized_url,
+ Url::GetHost(Url::Normalize(value)) AS host,
+ Url::GetDomain(Url::Normalize(value), 1) AS tld
+ FROM CONCAT(
+ `Input1`,
+ `Input2`
+ )
+);
+$ru_hosts = (
+ SELECT
+ host
+ FROM
+ $data
+ WHERE normalized_url IS NOT NULL AND (
+ tld = "ru"
+ OR tld = "su"
+ OR tld = "рф"
+ OR tld = "xn--p1ai" -- punycode рф
+ )
+);
+
+SELECT
+ host AS host,
+ COUNT(*) AS hits_count
+FROM $ru_hosts
+GROUP BY host
+ORDER BY hits_count DESC
+LIMIT 25;
diff --git a/yt/yql/tests/sql/suites/select/host_count.cfg b/yt/yql/tests/sql/suites/select/host_count.cfg
new file mode 100644
index 0000000000..72fa41ff1f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/host_count.cfg
@@ -0,0 +1,3 @@
+in Input1 host_input1.txt
+in Input2 host_input2.txt
+udf url_udf
diff --git a/yt/yql/tests/sql/suites/select/host_count.sql b/yt/yql/tests/sql/suites/select/host_count.sql
new file mode 100644
index 0000000000..eed3d6c9fa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/host_count.sql
@@ -0,0 +1,33 @@
+/* postgres can not */
+USE plato;
+
+$data = (
+ SELECT
+ Url::Normalize(url) AS normalized_url,
+ Url::GetHost(Url::Normalize(url)) AS host,
+ Url::GetDomain(Url::Normalize(url), 1) AS tld
+ FROM CONCAT(
+ `Input1`,
+ `Input2`
+ )
+);
+$ru_hosts = (
+ SELECT
+ tld,
+ host
+ FROM
+ $data
+ WHERE normalized_url IS NOT NULL AND (
+ tld = "ru"
+ OR tld = "su"
+ OR tld = "рф"
+ OR tld = "xn--p1ai" -- punycode рф
+ )
+);
+
+SELECT
+ tld,
+ COUNT(DISTINCT host) AS hosts_count
+FROM $ru_hosts
+GROUP BY tld
+ORDER BY hosts_count DESC;
diff --git a/yt/yql/tests/sql/suites/select/host_input1.txt.attr b/yt/yql/tests/sql/suites/select/host_input1.txt.attr
new file mode 100644
index 0000000000..fb4f4c76a0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/host_input1.txt.attr
@@ -0,0 +1,16 @@
+{
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "url";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/select/host_input2.txt.attr b/yt/yql/tests/sql/suites/select/host_input2.txt.attr
new file mode 100644
index 0000000000..fb4f4c76a0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/host_input2.txt.attr
@@ -0,0 +1,16 @@
+{
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "url";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/select/if.sql b/yt/yql/tests/sql/suites/select/if.sql
new file mode 100644
index 0000000000..69b35b586e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/if.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+SELECT
+ if(LENGTH(value) > 2, "long", "short") AS if,
+ if(false, 3) AS no_else
+FROM plato.Input
+;
diff --git a/yt/yql/tests/sql/suites/select/input_struct_field.txt.attr b/yt/yql/tests/sql/suites/select/input_struct_field.txt.attr
new file mode 100644
index 0000000000..bcc8251d99
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/input_struct_field.txt.attr
@@ -0,0 +1,11 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["StructType";[
+ ["kk";["DataType";"String"]];
+ ]]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]];
+ ]];
+ }
+}
diff --git a/yt/yql/tests/sql/suites/select/literal_bool.sql b/yt/yql/tests/sql/suites/select/literal_bool.sql
new file mode 100644
index 0000000000..0cd9f9bac2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/literal_bool.sql
@@ -0,0 +1 @@
+select key, subkey, cast(true as varchar) as value from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/literal_negative.sql b/yt/yql/tests/sql/suites/select/literal_negative.sql
new file mode 100644
index 0000000000..de18406964
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/literal_negative.sql
@@ -0,0 +1 @@
+select key, subkey, cast(-1 as varchar) as value from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/logical_ops.sql b/yt/yql/tests/sql/suites/select/logical_ops.sql
new file mode 100644
index 0000000000..062a3366d7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/logical_ops.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+SELECT
+ LENGTH(key) == 3 AND LENGTH(value) == 3 as and_res,
+ LENGTH(key) == 3 OR LENGTH(value) == 3 as or_res,
+ LENGTH(key) == 3 XOR LENGTH(value) == 3 as xor_res
+FROM plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/match_clause.cfg b/yt/yql/tests/sql/suites/select/match_clause.cfg
new file mode 100644
index 0000000000..93eff5b6bc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/match_clause.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+in Input2 input2.txt
+in Input3 input3.txt
+udf re2_udf
+udf pire_udf
diff --git a/yt/yql/tests/sql/suites/select/match_clause.sql b/yt/yql/tests/sql/suites/select/match_clause.sql
new file mode 100644
index 0000000000..9efb61a9a0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/match_clause.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+/* syntax version 1 */
+select key, subkey, value from plato.Input
+where value match "q";
diff --git a/yt/yql/tests/sql/suites/select/missing_with_nonpersist.cfg b/yt/yql/tests/sql/suites/select/missing_with_nonpersist.cfg
new file mode 100644
index 0000000000..1f1d2747db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/missing_with_nonpersist.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/select/missing_with_nonpersist.sql b/yt/yql/tests/sql/suites/select/missing_with_nonpersist.sql
new file mode 100644
index 0000000000..82fe2a092b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/missing_with_nonpersist.sql
@@ -0,0 +1,10 @@
+USE plato;
+
+$data = select
+ Yson::Parse(cast(key as Yson)) as key,
+ text, -- missing colums
+ subkey
+from Input;
+
+select key, subkey
+from $data;
diff --git a/yt/yql/tests/sql/suites/select/multi_source_issue.sql b/yt/yql/tests/sql/suites/select/multi_source_issue.sql
new file mode 100644
index 0000000000..16e9fb83fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/multi_source_issue.sql
@@ -0,0 +1,17 @@
+/* postgres can not */
+USE plato;
+
+$i = (SELECT * FROM Input2);
+$ii = (SELECT * FROM Input4);
+
+$count_a=(SELECT count(*) FROM $i WHERE substring(value, 0, 1) = 'a');
+
+--INSERT INTO Output
+SELECT
+ count(*), count(*)/$count_a
+FROM $i;
+
+--INSERT INTO Output
+SELECT
+ count(*), count(*)/$count_a
+FROM $ii;
diff --git a/yt/yql/tests/sql/suites/select/one_labeled_column.sql b/yt/yql/tests/sql/suites/select/one_labeled_column.sql
new file mode 100644
index 0000000000..3ff643663c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/one_labeled_column.sql
@@ -0,0 +1 @@
+select key as wat from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/one_unlabeled_column.sql b/yt/yql/tests/sql/suites/select/one_unlabeled_column.sql
new file mode 100644
index 0000000000..f7104a1585
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/one_unlabeled_column.sql
@@ -0,0 +1 @@
+select key from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/opt_list_access.sql b/yt/yql/tests/sql/suites/select/opt_list_access.sql
new file mode 100644
index 0000000000..ed06206b42
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/opt_list_access.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+$data = (SELECT key, Just(aggregate_list(cast(subkey as uint32))) as lsk FROM plato.Input GROUP BY cast(key as uint32) as key);
+
+SELECT key, lsk[0] FROM $data WHERE lsk IS NOT NULL ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/select/optional_as_warn.sql b/yt/yql/tests/sql/suites/select/optional_as_warn.sql
new file mode 100644
index 0000000000..1dd720af5d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/optional_as_warn.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+/* dq can not */
+/* dqfile can not */
+/* yt can not */
+use plato;
+
+pragma AnsiOptionalAs;
+
+select
+ key subkey,
+ value v,
+from Input order by subkey;
+
+
+select
+ key AS subkey,
+ value v,
+from Input order by subkey;
diff --git a/yt/yql/tests/sql/suites/select/optional_in_job.cfg b/yt/yql/tests/sql/suites/select/optional_in_job.cfg
new file mode 100644
index 0000000000..00dec6c3f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/optional_in_job.cfg
@@ -0,0 +1 @@
+res result.txt
diff --git a/yt/yql/tests/sql/suites/select/optional_in_job.sql b/yt/yql/tests/sql/suites/select/optional_in_job.sql
new file mode 100644
index 0000000000..f41bd2f579
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/optional_in_job.sql
@@ -0,0 +1,34 @@
+/* postgres can not */
+/* multirun can not */
+USE plato;
+
+insert into @a
+SELECT
+ Yql::Nothing(OptionalType(DataType("String"))) as level1_null,
+ Yql::Optional(OptionalType(DataType("String")), "val") as level1_just_val,
+ Yql::Nothing(OptionalType(OptionalType(DataType("String")))) as level2_null,
+ Yql::Optional(OptionalType(OptionalType(DataType("String"))), Yql::Nothing(OptionalType(DataType("String")))) as level2_just_null,
+ Yql::Optional(OptionalType(OptionalType(DataType("String"))), Yql::Just("val")) as level2_just_just_val,
+ Yql::Nothing(OptionalType(OptionalType(OptionalType(DataType("String"))))) as level3_null,
+ Yql::Optional(OptionalType(OptionalType(OptionalType(DataType("String")))), Yql::Nothing(OptionalType(OptionalType(DataType("String"))))) as level3_just_null,
+ Yql::Optional(OptionalType(OptionalType(OptionalType(DataType("String")))), Yql::Just(Yql::Nothing(OptionalType(DataType("String"))))) as level3_just_just_null,
+ Yql::Optional(OptionalType(OptionalType(OptionalType(DataType("String")))), Yql::Just(Yql::Just("val"))) as level3_just_just_just_val,
+ "const" as const
+;
+
+commit;
+
+-- Everything should be True
+select
+ level1_null is null,
+ Yql::Unwrap(level1_just_val) = "val",
+ level2_null is null,
+ Yql::Unwrap(level2_just_null) is null,
+ Yql::Unwrap(Yql::Unwrap(level2_just_just_val)) = "val",
+ level3_null is null,
+ Yql::Unwrap(level3_just_null) is null,
+ Yql::Unwrap(Yql::Unwrap(level3_just_just_null)) is null,
+ Yql::Unwrap(Yql::Unwrap(Yql::Unwrap(level3_just_just_just_val))) = "val",
+ True
+from @a
+where const = "const";
diff --git a/yt/yql/tests/sql/suites/select/optional_pull.cfg b/yt/yql/tests/sql/suites/select/optional_pull.cfg
new file mode 100644
index 0000000000..00dec6c3f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/optional_pull.cfg
@@ -0,0 +1 @@
+res result.txt
diff --git a/yt/yql/tests/sql/suites/select/optional_pull.sql b/yt/yql/tests/sql/suites/select/optional_pull.sql
new file mode 100644
index 0000000000..fd5e736f64
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/optional_pull.sql
@@ -0,0 +1,32 @@
+/* postgres can not */
+/* multirun can not */
+USE plato;
+
+insert into @a
+SELECT
+ Yql::Nothing(OptionalType(DataType("String"))) as level1_null,
+ Yql::Optional(OptionalType(DataType("String")), "val") as level1_just_val,
+ Yql::Nothing(OptionalType(OptionalType(DataType("String")))) as level2_null,
+ Yql::Optional(OptionalType(OptionalType(DataType("String"))), Yql::Nothing(OptionalType(DataType("String")))) as level2_just_null,
+ Yql::Optional(OptionalType(OptionalType(DataType("String"))), Yql::Just("val")) as level2_just_just_val,
+ Yql::Nothing(OptionalType(OptionalType(OptionalType(DataType("String"))))) as level3_null,
+ Yql::Optional(OptionalType(OptionalType(OptionalType(DataType("String")))), Yql::Nothing(OptionalType(OptionalType(DataType("String"))))) as level3_just_null,
+ Yql::Optional(OptionalType(OptionalType(OptionalType(DataType("String")))), Yql::Just(Yql::Nothing(OptionalType(DataType("String"))))) as level3_just_just_null,
+ Yql::Optional(OptionalType(OptionalType(OptionalType(DataType("String")))), Yql::Just(Yql::Just("val"))) as level3_just_just_just_val,
+ "const" as const
+;
+
+commit;
+
+-- Check result representation
+select
+ level1_null,
+ level1_just_val,
+ level2_null,
+ level2_just_null,
+ level2_just_just_val,
+ level3_null,
+ level3_just_null,
+ level3_just_just_null,
+ level3_just_just_just_val
+from @a;
diff --git a/yt/yql/tests/sql/suites/select/qualified_all_and_group_by.sql b/yt/yql/tests/sql/suites/select/qualified_all_and_group_by.sql
new file mode 100644
index 0000000000..2b45add62e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/qualified_all_and_group_by.sql
@@ -0,0 +1,16 @@
+/* postgres can not */
+/* syntax version 1 */
+
+USE plato;
+PRAGMA DisableSimpleColumns;
+
+--INSERT INTO Output
+SELECT
+ hundred_keys, sum(cast(`data.subkey` as uint32))
+FROM (
+ SELECT data.key as dkey, data.*
+ FROM Input as data
+) as middle
+GROUP BY
+ cast(middle.dkey as uint32)/100 as hundred_keys
+ORDER BY hundred_keys
diff --git a/yt/yql/tests/sql/suites/select/quoted_ids.sql b/yt/yql/tests/sql/suites/select/quoted_ids.sql
new file mode 100644
index 0000000000..39d4f4de71
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/quoted_ids.sql
@@ -0,0 +1,2 @@
+/* do not execute */
+select `A%%B`, `A'`, `A\"\"`, `A ` from plato.`C-D`; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/quoted_ids_with_escapes.sql b/yt/yql/tests/sql/suites/select/quoted_ids_with_escapes.sql
new file mode 100644
index 0000000000..637616a655
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/quoted_ids_with_escapes.sql
@@ -0,0 +1,2 @@
+/* do not execute */
+select `A\\a`, `\"A\\b\"` from plato.Input;
diff --git a/yt/yql/tests/sql/suites/select/read_schema.txt.attr b/yt/yql/tests/sql/suites/select/read_schema.txt.attr
new file mode 100644
index 0000000000..3176be619e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/read_schema.txt.attr
@@ -0,0 +1,3 @@
+{
+ "_read_schema"=[{"type"="int64";"name"="a"};{"type"="uint64";"name"="b"};{"type"="double";"name"="c"};{"type"="string";"name"="d"};{"type"="boolean";name="e"};{"type"="any";"name"="f"}]
+}
diff --git a/yt/yql/tests/sql/suites/select/refselect-1000.cfg b/yt/yql/tests/sql/suites/select/refselect-1000.cfg
new file mode 100644
index 0000000000..1bae01480b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/refselect-1000.cfg
@@ -0,0 +1,2 @@
+in test_table_src input1100.txt
+providers yt,dq
diff --git a/yt/yql/tests/sql/suites/select/refselect.cfg b/yt/yql/tests/sql/suites/select/refselect.cfg
new file mode 100644
index 0000000000..8763f366de
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/refselect.cfg
@@ -0,0 +1,2 @@
+in test_table_src input.txt
+providers yt,dq
diff --git a/yt/yql/tests/sql/suites/select/refselect.sql b/yt/yql/tests/sql/suites/select/refselect.sql
new file mode 100644
index 0000000000..7043d7b364
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/refselect.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+USE plato;
+PRAGMA refselect;
+SELECT key, subkey, value FROM `test_table_src`;
diff --git a/yt/yql/tests/sql/suites/select/result_rows_limit.cfg b/yt/yql/tests/sql/suites/select/result_rows_limit.cfg
new file mode 100644
index 0000000000..1f1d2747db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/result_rows_limit.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/select/result_rows_limit.sql b/yt/yql/tests/sql/suites/select/result_rows_limit.sql
new file mode 100644
index 0000000000..614d4928c6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/result_rows_limit.sql
@@ -0,0 +1,7 @@
+/* kikimr can not - no refs */
+/* postgres can not */
+USE plato;
+pragma ResultRowsLimit="2";
+
+SELECT key||"a" as key FROM Input order by key;
+SELECT key||"b" as key FROM Input order by key;
diff --git a/yt/yql/tests/sql/suites/select/result_size_limit.cfg b/yt/yql/tests/sql/suites/select/result_size_limit.cfg
new file mode 100644
index 0000000000..1f1d2747db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/result_size_limit.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/select/result_size_limit.sql b/yt/yql/tests/sql/suites/select/result_size_limit.sql
new file mode 100644
index 0000000000..df0d9d6fd6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/result_size_limit.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+/* kikimr can not - no refs */
+USE plato;
+pragma ResultSizeLimit="25";
+
+SELECT key||"a" as key FROM Input order by key;
+SELECT key||"b" as key FROM Input order by key;
diff --git a/yt/yql/tests/sql/suites/select/result_size_limit_with_fill.cfg b/yt/yql/tests/sql/suites/select/result_size_limit_with_fill.cfg
new file mode 100644
index 0000000000..1f1d2747db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/result_size_limit_with_fill.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/select/result_size_limit_with_fill.sql b/yt/yql/tests/sql/suites/select/result_size_limit_with_fill.sql
new file mode 100644
index 0000000000..d6394b5d0f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/result_size_limit_with_fill.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* kikimr can not - no refs */
+USE plato;
+pragma ResultSizeLimit="25";
+
+SELECT key||"a" as key FROM Input order by key;
+SELECT key||"b" as key FROM Input order by key;
+SELECT 1 + 1;
+SELECT 2 + 2;
diff --git a/yt/yql/tests/sql/suites/select/reuse_named_node.sql b/yt/yql/tests/sql/suites/select/reuse_named_node.sql
new file mode 100644
index 0000000000..238865d79d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/reuse_named_node.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+USE plato;
+$x = ($key) -> { return "aa" || $key };
+select $x(key) from Input;
+select $x(key) from Input;
diff --git a/yt/yql/tests/sql/suites/select/sampleselect-1000.cfg b/yt/yql/tests/sql/suites/select/sampleselect-1000.cfg
new file mode 100644
index 0000000000..115c212714
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/sampleselect-1000.cfg
@@ -0,0 +1 @@
+in Input input1100.txt
diff --git a/yt/yql/tests/sql/suites/select/sampleselect.cfg b/yt/yql/tests/sql/suites/select/sampleselect.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/sampleselect.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/select/sampleselect.sql b/yt/yql/tests/sql/suites/select/sampleselect.sql
new file mode 100644
index 0000000000..d6700cb9b3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/sampleselect.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+pragma sampleselect;
+select key, subkey, value || "foo" as new_value from plato.Input;
diff --git a/yt/yql/tests/sql/suites/select/scalar_subquery.sql b/yt/yql/tests/sql/suites/select/scalar_subquery.sql
new file mode 100644
index 0000000000..f5644ed27f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/scalar_subquery.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+$query = (
+select AsTuple(count(*),min(value)) FROM plato.Input
+--WHERE 1=0
+);
+select $query ?? AsTuple(0,"") as cnt;
diff --git a/yt/yql/tests/sql/suites/select/scalar_subquery_with_star.sql b/yt/yql/tests/sql/suites/select/scalar_subquery_with_star.sql
new file mode 100644
index 0000000000..29e0be1919
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/scalar_subquery_with_star.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+/* syntax version 1 */
+
+$single = (select key from plato.Input);
+$all = (select * from $single order by key limit 100);
+select $all;
+
diff --git a/yt/yql/tests/sql/suites/select/select_all.sql b/yt/yql/tests/sql/suites/select/select_all.sql
new file mode 100644
index 0000000000..684733fe7b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/select_all.sql
@@ -0,0 +1 @@
+select * from plato.Input;
diff --git a/yt/yql/tests/sql/suites/select/select_all_filtered.sql b/yt/yql/tests/sql/suites/select/select_all_filtered.sql
new file mode 100644
index 0000000000..73574ab4d4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/select_all_filtered.sql
@@ -0,0 +1,2 @@
+select * from plato.Input where value = "ddd";
+
diff --git a/yt/yql/tests/sql/suites/select/select_all_from_concat.sql b/yt/yql/tests/sql/suites/select/select_all_from_concat.sql
new file mode 100644
index 0000000000..2f22f7a461
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/select_all_from_concat.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select * from plato.concat(Input2, Input3);
diff --git a/yt/yql/tests/sql/suites/select/select_all_from_concat_anon.sql b/yt/yql/tests/sql/suites/select/select_all_from_concat_anon.sql
new file mode 100644
index 0000000000..967844883c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/select_all_from_concat_anon.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+USE plato;
+
+insert into @foo
+select 1;
+
+commit;
+
+$name = "fo" || "o";
+select * from concat(@foo,@$name);
diff --git a/yt/yql/tests/sql/suites/select/select_all_group_by_column.cfg b/yt/yql/tests/sql/suites/select/select_all_group_by_column.cfg
new file mode 100644
index 0000000000..c7e99df4d3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/select_all_group_by_column.cfg
@@ -0,0 +1 @@
+in Input input_expr.txt
diff --git a/yt/yql/tests/sql/suites/select/select_all_group_by_column.sql b/yt/yql/tests/sql/suites/select/select_all_group_by_column.sql
new file mode 100644
index 0000000000..d2dc93b17b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/select_all_group_by_column.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select * from plato.Input group by subkey order by subkey;
diff --git a/yt/yql/tests/sql/suites/select/select_all_ordered.sql b/yt/yql/tests/sql/suites/select/select_all_ordered.sql
new file mode 100644
index 0000000000..1021bb94cb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/select_all_ordered.sql
@@ -0,0 +1,3 @@
+select * from plato.Input order by value;
+
+
diff --git a/yt/yql/tests/sql/suites/select/select_concrete_detailed_columns.sql b/yt/yql/tests/sql/suites/select/select_concrete_detailed_columns.sql
new file mode 100644
index 0000000000..577f255c97
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/select_concrete_detailed_columns.sql
@@ -0,0 +1 @@
+select i.key, i.subkey from plato.Input as i;
diff --git a/yt/yql/tests/sql/suites/select/shift_columns.sql b/yt/yql/tests/sql/suites/select/shift_columns.sql
new file mode 100644
index 0000000000..60938dc01c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/shift_columns.sql
@@ -0,0 +1 @@
+select key as subkey, subkey as value, value as key from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/simple_struct_field_access.cfg b/yt/yql/tests/sql/suites/select/simple_struct_field_access.cfg
new file mode 100644
index 0000000000..2dbce9ede0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/simple_struct_field_access.cfg
@@ -0,0 +1 @@
+in Input input_struct_field.txt
diff --git a/yt/yql/tests/sql/suites/select/simple_struct_field_access.sql b/yt/yql/tests/sql/suites/select/simple_struct_field_access.sql
new file mode 100644
index 0000000000..a140ab624d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/simple_struct_field_access.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+use plato;
+select key.kk, subkey, value from Input
diff --git a/yt/yql/tests/sql/suites/select/struct_access_without_table_name.cfg b/yt/yql/tests/sql/suites/select/struct_access_without_table_name.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/struct_access_without_table_name.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/select/struct_access_without_table_name.sql b/yt/yql/tests/sql/suites/select/struct_access_without_table_name.sql
new file mode 100644
index 0000000000..0a3446a339
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/struct_access_without_table_name.sql
@@ -0,0 +1,18 @@
+/* postgres can not */
+use plato;
+
+$data = ( select
+ cast(key as uint32) % 10 as mod,
+ (key as kk, subkey as sk) as struct_field,
+ value
+from Input);
+
+--INSERT INTO Output
+SELECT
+ mod,
+ struct_field.kk as mod_key,
+ struct_field.sk,
+ d.value
+FROM $data as d
+order by mod_key, value
+;
diff --git a/yt/yql/tests/sql/suites/select/struct_members.sql b/yt/yql/tests/sql/suites/select/struct_members.sql
new file mode 100644
index 0000000000..4fd4c403d8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/struct_members.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+use plato;
+$structList = (select AsStruct(key as k, value as v) as `struct` from Input);
+select input.`struct`.k as key, input.`struct`.v as value, input.`struct` as `struct` from $structList as input;
diff --git a/yt/yql/tests/sql/suites/select/substring.sql b/yt/yql/tests/sql/suites/select/substring.sql
new file mode 100644
index 0000000000..469b7bc3aa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/substring.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* syntax version 1 */
+select
+ substring(key, 1, 1) as char,
+ substring(value, 1) as tail
+from plato.Input;
diff --git a/yt/yql/tests/sql/suites/select/substring_v1.sql b/yt/yql/tests/sql/suites/select/substring_v1.sql
new file mode 100644
index 0000000000..566e8c9401
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/substring_v1.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+/* syntax version 1 */
+-- in v1 substring returns Null as a result for missing value
+select
+ substring(key, 1, 1) as char,
+ substring(value, 1) as tail
+from plato.Input;
diff --git a/yt/yql/tests/sql/suites/select/sum_to_string.sql b/yt/yql/tests/sql/suites/select/sum_to_string.sql
new file mode 100644
index 0000000000..59d6860ebb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/sum_to_string.sql
@@ -0,0 +1 @@
+select key, subkey, cast(1 + 1 as varchar) as value from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/swap_columns.sql b/yt/yql/tests/sql/suites/select/swap_columns.sql
new file mode 100644
index 0000000000..61e848ab7b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/swap_columns.sql
@@ -0,0 +1 @@
+select key, subkey as value, value as subkey from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/table_content_from_double_opt.sql b/yt/yql/tests/sql/suites/select/table_content_from_double_opt.sql
new file mode 100644
index 0000000000..472917fe5f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/table_content_from_double_opt.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+insert into @tmp with truncate
+select Just(Just(key)) as key from Input;
+
+commit;
+
+$key = select key from @tmp;
+select * from Input where key = $key;
diff --git a/yt/yql/tests/sql/suites/select/table_content_from_sort_desc.sql b/yt/yql/tests/sql/suites/select/table_content_from_sort_desc.sql
new file mode 100644
index 0000000000..efa2818a96
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/table_content_from_sort_desc.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+insert into @tmp with truncate
+select key from Input order by key desc;
+
+commit;
+
+$key = select key from @tmp;
+select * from Input where key = $key;
diff --git a/yt/yql/tests/sql/suites/select/table_content_with_tmp_folder.cfg b/yt/yql/tests/sql/suites/select/table_content_with_tmp_folder.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/table_content_with_tmp_folder.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/select/table_content_with_tmp_folder.sql b/yt/yql/tests/sql/suites/select/table_content_with_tmp_folder.sql
new file mode 100644
index 0000000000..04a6ecb98b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/table_content_with_tmp_folder.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+/* kikimr can not */
+use plato;
+pragma yt.MapJoinLimit="1M";
+pragma yt.TmpFolder="//custom_tmp";
+
+-- MapJoin with table content
+$input = (select cast(a.key as Uint64) as key from Input as a cross join Input as b);
+
+-- ResFill with table content
+select sum(key) from $input;
diff --git a/yt/yql/tests/sql/suites/select/table_funcs_spec.sql b/yt/yql/tests/sql/suites/select/table_funcs_spec.sql
new file mode 100644
index 0000000000..87cbdfe0dc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/table_funcs_spec.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+/* kikimr can not */
+use plato;
+
+--insert into Output
+select
+ TablePath() as table_path,
+ TableRecordIndex() as table_rec,
+ TableName("foo/bar") as table_name1,
+ TableName("baz") as table_name2,
+ TableName() as table_name3
+from Input
+where key = '800'
+;
diff --git a/yt/yql/tests/sql/suites/select/tablename_with_table_row.sql b/yt/yql/tests/sql/suites/select/tablename_with_table_row.sql
new file mode 100644
index 0000000000..3080bcf52c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/tablename_with_table_row.sql
@@ -0,0 +1,11 @@
+USE plato;
+
+SELECT
+ TableName() AS tn,
+ ROW_NUMBER() OVER () AS rowid,
+FROM
+ Input
+WHERE
+ key > "010"
+ORDER BY rowid
+;
diff --git a/yt/yql/tests/sql/suites/select/tablepathprefix.sql b/yt/yql/tests/sql/suites/select/tablepathprefix.sql
new file mode 100644
index 0000000000..f543356ff0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/tablepathprefix.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+pragma TablePathPrefix = "//";
+
+$input = "In" || "put";
+
+select * from `Input` order by subkey;
+select * from $input order by subkey;
diff --git a/yt/yql/tests/sql/suites/select/to_dict.sql b/yt/yql/tests/sql/suites/select/to_dict.sql
new file mode 100644
index 0000000000..7c1e8e85bd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/to_dict.sql
@@ -0,0 +1,17 @@
+/* postgres can not */
+/* syntax version 1 */
+SELECT
+ key,
+ ToDict(items) AS `dict`,
+ ToMultiDict(items) AS multi_dict
+FROM (
+ SELECT
+ key,
+ AGGREGATE_LIST(AsTuple(subkey, value)) AS items
+ FROM (
+ SELECT * FROM plato.Input
+ UNION ALL
+ SELECT * FROM plato.Input
+ ) GROUP BY key
+)
+ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/select/trivial_between.sql b/yt/yql/tests/sql/suites/select/trivial_between.sql
new file mode 100644
index 0000000000..38d14ec4a7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/trivial_between.sql
@@ -0,0 +1,3 @@
+select * from (
+ select key as key, coalesce(cast(subkey as int), 0) as subkey, value as value from plato.Input
+) as x where subkey between 1 and 3 order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/select/trivial_group_by.sql b/yt/yql/tests/sql/suites/select/trivial_group_by.sql
new file mode 100644
index 0000000000..8475eeda7d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/trivial_group_by.sql
@@ -0,0 +1 @@
+select key, Min(subkey) as subkey, Max(value) as value from plato.Input group by key order by key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/trivial_having.sql b/yt/yql/tests/sql/suites/select/trivial_having.sql
new file mode 100644
index 0000000000..5ad1424027
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/trivial_having.sql
@@ -0,0 +1 @@
+select key, "WAT" as subkey, Max(value) as value from plato.Input group by key having Max(value) = "FOO"; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/trivial_order_by.sql b/yt/yql/tests/sql/suites/select/trivial_order_by.sql
new file mode 100644
index 0000000000..b087520e60
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/trivial_order_by.sql
@@ -0,0 +1 @@
+select key, subkey, value from plato.Input order by key; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/trivial_where-many.cfg b/yt/yql/tests/sql/suites/select/trivial_where-many.cfg
new file mode 100644
index 0000000000..67bb5475e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/trivial_where-many.cfg
@@ -0,0 +1 @@
+in Input trivial_where-many.txt
diff --git a/yt/yql/tests/sql/suites/select/trivial_where-one.cfg b/yt/yql/tests/sql/suites/select/trivial_where-one.cfg
new file mode 100644
index 0000000000..7e850225a0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/trivial_where-one.cfg
@@ -0,0 +1 @@
+in Input trivial_where.txt
diff --git a/yt/yql/tests/sql/suites/select/trivial_where.sql b/yt/yql/tests/sql/suites/select/trivial_where.sql
new file mode 100644
index 0000000000..f7c092f14c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/trivial_where.sql
@@ -0,0 +1 @@
+select key, subkey, value from plato.Input where key = subkey; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/two_selects_with_diff_fields.sql b/yt/yql/tests/sql/suites/select/two_selects_with_diff_fields.sql
new file mode 100644
index 0000000000..3b7b8d1e32
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/two_selects_with_diff_fields.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+select key from plato.Input;
+select key, subkey, value from plato.Input;
diff --git a/yt/yql/tests/sql/suites/select/type_assert.sql b/yt/yql/tests/sql/suites/select/type_assert.sql
new file mode 100644
index 0000000000..c634446b93
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/type_assert.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+select EnsureType(cast(key as Int64), Int64?, "some text 1") from Input;
+select FormatType(EnsureType(TypeOf(1), Int32, "some text 2"));
+select FormatType(EnsureType(TypeOf(1), Int32));
+
+select EnsureConvertibleTo(cast(key as Int64), Double?, "some text 3") from Input;
+select FormatType(EnsureConvertibleTo(TypeOf(1), Int64, "some text 4"));
+select FormatType(EnsureConvertibleTo(TypeOf(1), Int64));
diff --git a/yt/yql/tests/sql/suites/select/uncorrelated_subqueries.cfg b/yt/yql/tests/sql/suites/select/uncorrelated_subqueries.cfg
new file mode 100644
index 0000000000..f4f8c09a16
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/uncorrelated_subqueries.cfg
@@ -0,0 +1,3 @@
+in Input1 input_intersect.txt
+in Input2 input_expr.txt
+
diff --git a/yt/yql/tests/sql/suites/select/uncorrelated_subqueries.sql b/yt/yql/tests/sql/suites/select/uncorrelated_subqueries.sql
new file mode 100644
index 0000000000..261f20ec16
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/uncorrelated_subqueries.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+use plato;
+
+$_data = (SELECT key as kk, subkey as sk, value as val FROM plato.Input1 WHERE key == '075');
+$data_one_key = (SELECT subkey FROM plato.Input1 WHERE key == '075');
+
+SELECT * FROM Input2 WHERE key = $data_one_key;
diff --git a/yt/yql/tests/sql/suites/select/unlabeled.cfg b/yt/yql/tests/sql/suites/select/unlabeled.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/unlabeled.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/select/unlabeled.sql b/yt/yql/tests/sql/suites/select/unlabeled.sql
new file mode 100644
index 0000000000..c904961f66
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/unlabeled.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select key, subkey, value from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/unlabeled_1000.cfg b/yt/yql/tests/sql/suites/select/unlabeled_1000.cfg
new file mode 100644
index 0000000000..115c212714
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/unlabeled_1000.cfg
@@ -0,0 +1 @@
+in Input input1100.txt
diff --git a/yt/yql/tests/sql/suites/select/unlabeled_1000.sql b/yt/yql/tests/sql/suites/select/unlabeled_1000.sql
new file mode 100644
index 0000000000..ec52757d06
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/unlabeled_1000.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* kikimr can not - no ref select mode */
+select key, subkey, value from plato.Input order by key, subkey, value;
diff --git a/yt/yql/tests/sql/suites/select/use_cluster.sql b/yt/yql/tests/sql/suites/select/use_cluster.sql
new file mode 100644
index 0000000000..197a75f9c1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/use_cluster.sql
@@ -0,0 +1,2 @@
+use plato;
+select key from Input;
diff --git a/yt/yql/tests/sql/suites/select/where_cast.sql b/yt/yql/tests/sql/suites/select/where_cast.sql
new file mode 100644
index 0000000000..8ae781dccf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/where_cast.sql
@@ -0,0 +1 @@
+select value from plato.Input where cast(key as int) > 100; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/select/where_in.sql b/yt/yql/tests/sql/suites/select/where_in.sql
new file mode 100644
index 0000000000..8618c593e6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/where_in.sql
@@ -0,0 +1,7 @@
+SELECT
+ *
+FROM plato.Input
+WHERE
+ "1" IN (key, subkey, value) OR
+ value NOT IN (key, subkey, value)
+;
diff --git a/yt/yql/tests/sql/suites/select/where_not_null.cfg b/yt/yql/tests/sql/suites/select/where_not_null.cfg
new file mode 100644
index 0000000000..86c772ae1c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/where_not_null.cfg
@@ -0,0 +1 @@
+in Input read_schema.txt
diff --git a/yt/yql/tests/sql/suites/select/where_not_null.sql b/yt/yql/tests/sql/suites/select/where_not_null.sql
new file mode 100644
index 0000000000..a582898978
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/where_not_null.sql
@@ -0,0 +1 @@
+select * from plato.Input where a is not null;
diff --git a/yt/yql/tests/sql/suites/select/where_with_lambda.cfg b/yt/yql/tests/sql/suites/select/where_with_lambda.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/where_with_lambda.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/select/where_with_lambda.sql b/yt/yql/tests/sql/suites/select/where_with_lambda.sql
new file mode 100644
index 0000000000..e2587c8ac0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/select/where_with_lambda.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+USE plato;
+
+$predicate = ($x) -> {
+ RETURN $x == "911"
+};
+$field = "field";
+
+SELECT *
+FROM Input
+WHERE $predicate($field);
diff --git a/yt/yql/tests/sql/suites/seq_mode/action_shared_subquery_expr_after_commit.sql b/yt/yql/tests/sql/suites/seq_mode/action_shared_subquery_expr_after_commit.sql
new file mode 100644
index 0000000000..b693dcd0a5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/seq_mode/action_shared_subquery_expr_after_commit.sql
@@ -0,0 +1,12 @@
+pragma SeqMode;
+use plato;
+define action $a() as
+ insert into @tmp
+ select 1;
+ commit;
+ $r = select * from @tmp;
+ select * from $r;
+ select * from $r;
+end define;
+
+do $a();
diff --git a/yt/yql/tests/sql/suites/seq_mode/default.cfg b/yt/yql/tests/sql/suites/seq_mode/default.cfg
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/seq_mode/default.cfg
diff --git a/yt/yql/tests/sql/suites/seq_mode/shared_subquery_expr_after_commit.sql b/yt/yql/tests/sql/suites/seq_mode/shared_subquery_expr_after_commit.sql
new file mode 100644
index 0000000000..ec13f4e0fa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/seq_mode/shared_subquery_expr_after_commit.sql
@@ -0,0 +1,9 @@
+use plato;
+pragma SeqMode;
+insert into @foo
+select 1;
+commit;
+$a = select * from @foo;
+select * from $a;
+select * from $a;
+
diff --git a/yt/yql/tests/sql/suites/simple_columns/default.cfg b/yt/yql/tests/sql/suites/simple_columns/default.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/default.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/simple_columns/no_simple_columns_tablerow.sql b/yt/yql/tests/sql/suites/simple_columns/no_simple_columns_tablerow.sql
new file mode 100644
index 0000000000..231e9d743e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/no_simple_columns_tablerow.sql
@@ -0,0 +1,17 @@
+/* syntax version 1 */
+PRAGMA DisableSimpleColumns;
+
+SELECT 100500 as magic, TableRow() AS tr FROM plato.Input AS t;
+SELECT 100500 as magic, t.* FROM plato.Input AS t;
+
+SELECT
+TableRow() AS tr
+FROM (SELECT Just(1ul) AS k, 1 AS v1) AS a
+JOIN (SELECT 1 AS k, 2 AS v2) AS b
+ON a.k = b.k;
+
+SELECT
+*
+FROM (SELECT Just(1ul) AS k, 1 AS v1) AS a
+JOIN (SELECT 1 AS k, 2 AS v2) AS b
+ON a.k = b.k;
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_base.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_base.sql
new file mode 100644
index 0000000000..2d050f1024
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_base.sql
@@ -0,0 +1,4 @@
+PRAGMA SimpleColumns;
+
+--INSERT INTO plato.Output
+SELECT 100500 as magic, t.* FROM plato.Input as t
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_base_fail.cfg b/yt/yql/tests/sql/suites/simple_columns/simple_columns_base_fail.cfg
new file mode 100644
index 0000000000..9217c920f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_base_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/simple_columns/simple_columns_base_fail.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_base_fail.sql
new file mode 100644
index 0000000000..85cca8dbec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_base_fail.sql
@@ -0,0 +1,13 @@
+/* custom error:Duplicated member: magic*/
+PRAGMA SimpleColumns;
+
+USE plato;
+
+$req = (SELECT 100500 as magic, t.* FROM Input as t);
+
+--INSERT INTO Output
+SELECT
+ ff.*,
+ subkey as magic, -- 'magic' is exist from ff.magic
+ value as val
+FROM $req as ff ORDER BY sk
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_all.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_all.sql
new file mode 100644
index 0000000000..8fbba96abe
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_all.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+PRAGMA SimpleColumns;
+USE plato;
+
+$data = (SELECT key as kk, subkey as sk, value as val FROM Input WHERE cast(key as uint32)/100 < 5);
+
+--INSERT INTO Output
+SELECT
+ *
+FROM Input JOIN $data as d ON Input.subkey = cast(cast(d.kk as uint32)/100 as string)
+ORDER BY key, val
+;
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_all_1.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_all_1.sql
new file mode 100644
index 0000000000..dbb7d0ba60
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_all_1.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+USE plato;
+
+pragma SimpleColumns;
+pragma DisableCoalesceJoinKeysOnQualifiedAll;
+
+$foo = select 1 as key, 1 as value1;
+$bar = select 1l as key, 2 as value2;
+
+select * from $foo as foo
+join $bar as bar on foo.key = bar.key;
+
+-- output key has type Int64
+
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_all_2.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_all_2.sql
new file mode 100644
index 0000000000..4037bdd680
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_all_2.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+USE plato;
+
+pragma SimpleColumns;
+pragma CoalesceJoinKeysOnQualifiedAll;
+
+$foo = select 1 as key, 1 as value1;
+$bar = select 1l as key, 2 as value2;
+
+select * from $foo as foo
+join $bar as bar on foo.key = bar.key;
+
+-- output key has type Int64
+
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_bug8923.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_bug8923.sql
new file mode 100644
index 0000000000..a4d816e21a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_bug8923.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+USE plato;
+
+pragma SimpleColumns;
+-- fails with CoalesceJoinKeysOnQualifiedAll
+pragma DisableCoalesceJoinKeysOnQualifiedAll;
+
+$foo = select 1 as key, 1 as value1;
+$bar = select 1l as key, 2 as value2;
+$baz = select 1l as key, 2 as value3;
+
+
+select foo.* from $foo as foo
+join $bar as bar on cast(foo.key as Int32) = bar.key
+join $baz as baz on bar.key = baz.key
+
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_qualified_all_disable.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_qualified_all_disable.sql
new file mode 100644
index 0000000000..633c62c500
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_qualified_all_disable.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+USE plato;
+
+pragma SimpleColumns;
+pragma DisableCoalesceJoinKeysOnQualifiedAll;
+
+$foo = select 1 as key, 1 as value1;
+$bar = select 1l as key, 2 as value2;
+
+select foo.* from $foo as foo
+join $bar as bar on foo.key = bar.key;
+
+-- output key has type Int32
+
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_qualified_all_enable.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_qualified_all_enable.sql
new file mode 100644
index 0000000000..9d55cd5cb4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_qualified_all_enable.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+USE plato;
+
+pragma SimpleColumns;
+pragma CoalesceJoinKeysOnQualifiedAll;
+
+$foo = select 1 as key, 1 as value1;
+$bar = select 1l as key, 2 as value2;
+
+select foo.* from $foo as foo
+join $bar as bar on foo.key = bar.key;
+
+-- output key has type Int64
+
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_without_1.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_without_1.sql
new file mode 100644
index 0000000000..d3933f7860
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_without_1.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+USE plato;
+
+pragma SimpleColumns;
+pragma DisableCoalesceJoinKeysOnQualifiedAll;
+
+select
+ b.* without b.x
+from (select * from (select AsList(1, 2, 3) as x, AsList(1, 2) as y) flatten by (x, y)) as a
+join (select * from (select AsList(1, 2, 3) as x, AsList(2, 3) as y) flatten by (x, y)) as b
+on a.x == b.x and a.y == b.y;
+
+select
+ * without b.x
+from (select * from (select AsList(1, 2, 3) as x, AsList(1, 2) as y) flatten by (x, y)) as a
+join (select * from (select AsList(1, 2, 3) as x, AsList(2, 3) as y) flatten by (x, y)) as b
+on a.x == b.x and a.y == b.y
+
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_without_2.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_without_2.sql
new file mode 100644
index 0000000000..ff33a478ab
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_without_2.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+USE plato;
+
+pragma SimpleColumns;
+pragma CoalesceJoinKeysOnQualifiedAll;
+
+select
+ b.* without b.x
+from (select * from (select AsList(1, 2, 3) as x, AsList(1, 2) as y) flatten by (x, y)) as a
+join (select * from (select AsList(1, 2, 3) as x, AsList(2, 3) as y) flatten by (x, y)) as b
+on a.x == b.x and a.y == b.y;
+
+select
+ * without b.x
+from (select * from (select AsList(1, 2, 3) as x, AsList(1, 2) as y) flatten by (x, y)) as a
+join (select * from (select AsList(1, 2, 3) as x, AsList(2, 3) as y) flatten by (x, y)) as b
+on a.x == b.x and a.y == b.y
+
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_without_left_semi_1.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_without_left_semi_1.sql
new file mode 100644
index 0000000000..f2e3ca2c12
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_without_left_semi_1.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+USE plato;
+
+pragma SimpleColumns;
+pragma DisableCoalesceJoinKeysOnQualifiedAll;
+
+select a.* without a.key, a.value from Input as a left semi join Input as b using(key) order by subkey;
+select * without a.key, a.value from Input as a left semi join Input as b using(key) order by subkey;
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_without_left_semi_2.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_without_left_semi_2.sql
new file mode 100644
index 0000000000..fc85664b2c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_coalesce_without_left_semi_2.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+USE plato;
+
+pragma SimpleColumns;
+pragma CoalesceJoinKeysOnQualifiedAll;
+
+select a.* without a.key, a.value from Input as a left semi join Input as b using(key) order by subkey;
+select * without a.key, a.value from Input as a left semi join Input as b using(key) order by subkey;
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_fail.cfg b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_fail.cfg
new file mode 100644
index 0000000000..9217c920f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_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/simple_columns/simple_columns_join_fail.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_fail.sql
new file mode 100644
index 0000000000..0605937349
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_fail.sql
@@ -0,0 +1,13 @@
+/* custom error:Duplicated member: kk*/
+PRAGMA SimpleColumns;
+USE plato;
+
+$data = (SELECT key as kk, subkey as sk, value as val FROM Input WHERE cast(key as uint32)/100 < 5);
+
+--INSERT INTO Output
+SELECT
+ d.*,
+ Input.key as kk -- 'kk' is exist from d.kk
+FROM Input JOIN $data as d ON Input.subkey = cast(cast(d.kk as uint32)/100 as string)
+ORDER BY key, val
+;
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_qualified.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_qualified.sql
new file mode 100644
index 0000000000..b2cac15f8f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_qualified.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+PRAGMA SimpleColumns;
+USE plato;
+
+$data = (SELECT key as kk, subkey as sk, value as val FROM Input WHERE cast(key as uint32)/100 < 5);
+
+--INSERT INTO Output
+SELECT
+ d.*,
+ key
+FROM Input JOIN $data as d ON Input.subkey = cast(cast(d.kk as uint32)/100 as string)
+ORDER BY key, val
+;
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_subreq_all_key_without.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_subreq_all_key_without.sql
new file mode 100644
index 0000000000..51b49cdb29
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_subreq_all_key_without.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+PRAGMA SimpleColumns;
+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
+ Input.value
+FROM Input JOIN $data as d ON Input.subkey = cast(cast(d.kk as uint32)/100 as string)
+ORDER BY key, value
+;
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_subreq_same_key.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_subreq_same_key.sql
new file mode 100644
index 0000000000..5318d327bb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_subreq_same_key.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+PRAGMA SimpleColumns;
+USE plato;
+
+$data = (SELECT key, subkey as sk, value FROM Input WHERE cast(key as uint32)/100 < 5);
+
+--INSERT INTO Output
+SELECT
+ d.*,
+ subkey
+FROM Input JOIN $data as d ON Input.key = d.key and Input.value == d.value
+ORDER BY key, value
+;
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_subreq_same_key_by_all.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_subreq_same_key_by_all.sql
new file mode 100644
index 0000000000..e75b01c64a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_subreq_same_key_by_all.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+PRAGMA SimpleColumns;
+USE plato;
+
+$data = (SELECT key, subkey as sk, value FROM Input WHERE cast(key as uint32)/100 < 5);
+
+--INSERT INTO Output
+SELECT
+ *
+FROM Input JOIN $data as d ON Input.key = d.key and Input.value == d.value
+ORDER BY key, value
+;
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_subreq_same_key_without.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_subreq_same_key_without.sql
new file mode 100644
index 0000000000..a99ae21f79
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_subreq_same_key_without.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+PRAGMA SimpleColumns;
+USE plato;
+
+$data = (SELECT key as kk, subkey as sk, value FROM Input WHERE cast(key as uint32)/100 < 5);
+
+--INSERT INTO Output
+SELECT
+ Input.*,
+ d.value as val
+WITHOUT
+ Input.subkey
+FROM Input JOIN $data as d ON Input.subkey = cast(cast(d.kk as uint32)/100 as string)
+ORDER BY key, value
+;
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_without_resolve_dublicates.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_without_resolve_dublicates.sql
new file mode 100644
index 0000000000..686bb52cbe
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_without_resolve_dublicates.sql
@@ -0,0 +1,16 @@
+/* postgres can not */
+PRAGMA SimpleColumns;
+USE plato;
+
+$data = (SELECT key as kk, subkey as sk, "data: " || value as value FROM Input WHERE cast(key as uint32)/100 < 5);
+
+--INSERT INTO Output
+SELECT
+ Input.*,
+ d.*,
+ Input.value as valueFromInput
+WITHOUT
+ Input.value
+FROM Input JOIN $data as d ON Input.subkey = cast(cast(d.kk as uint32)/100 as string)
+ORDER BY key, value
+;
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_without_resolve_dublicates_mult.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_without_resolve_dublicates_mult.sql
new file mode 100644
index 0000000000..b262fcf84b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_join_without_resolve_dublicates_mult.sql
@@ -0,0 +1,17 @@
+/* postgres can not */
+PRAGMA SimpleColumns;
+USE plato;
+
+$data = (SELECT cast(cast(key as uint32)/100 as string) as key, key as kk, cast(subkey as uint32) * 10 as subkey, "data: " || value as value FROM Input WHERE cast(key as uint32)/100 < 5);
+
+--INSERT INTO Output
+SELECT
+ Input.*,
+ d.*,
+ Input.value as valueFromInput,
+ d.subkey as subkeyFromD
+WITHOUT
+ Input.value, d.subkey, d.key
+FROM Input JOIN $data as d ON Input.subkey = d.key
+ORDER BY key, value
+;
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_qualified_all_and_group_by.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_qualified_all_and_group_by.sql
new file mode 100644
index 0000000000..e3cdad7350
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_qualified_all_and_group_by.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+USE plato;
+PRAGMA SimpleColumns;
+
+--INSERT INTO Output
+SELECT
+ hundred_keys, sum(cast(subkey as uint32))
+FROM (
+ SELECT data.key as dkey, data.*
+ FROM Input as data
+) as middle
+GROUP BY
+ cast(middle.dkey as uint32)/100 as hundred_keys
+ORDER BY hundred_keys
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_subreq.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_subreq.sql
new file mode 100644
index 0000000000..07417c5874
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_subreq.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+PRAGMA SimpleColumns;
+
+USE plato;
+
+$req = (SELECT 100500 as magic, t.* FROM Input as t);
+
+--INSERT INTO Output
+SELECT subkey as sk, value as val FROM $req ORDER BY sk
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_subreq_all.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_subreq_all.sql
new file mode 100644
index 0000000000..8f62e71cfa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_subreq_all.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+PRAGMA SimpleColumns;
+
+USE plato;
+
+$req = (SELECT 100500 as magic, t.* FROM Input as t);
+
+--INSERT INTO Output
+SELECT ff.*, subkey as sk, value as val FROM $req as ff ORDER BY sk
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_tablerow.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_tablerow.sql
new file mode 100644
index 0000000000..f9cdb31af7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_tablerow.sql
@@ -0,0 +1,17 @@
+/* syntax version 1 */
+PRAGMA SimpleColumns;
+
+SELECT 100500 as magic, TableRow() AS tr FROM plato.Input AS t;
+SELECT 100500 as magic, t.* FROM plato.Input AS t;
+
+SELECT
+TableRow() AS tr
+FROM (SELECT Just(1ul) AS k, 1 AS v1) AS a
+JOIN (SELECT 1 AS k, 2 AS v2) AS b
+ON a.k = b.k;
+
+SELECT
+*
+FROM (SELECT Just(1ul) AS k, 1 AS v1) AS a
+JOIN (SELECT 1 AS k, 2 AS v2) AS b
+ON a.k = b.k;
diff --git a/yt/yql/tests/sql/suites/simple_columns/simple_columns_union_all_qualified_star.sql b/yt/yql/tests/sql/suites/simple_columns/simple_columns_union_all_qualified_star.sql
new file mode 100644
index 0000000000..48b00df4ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/simple_columns/simple_columns_union_all_qualified_star.sql
@@ -0,0 +1,18 @@
+/* postgres can not */
+use plato;
+PRAGMA simplecolumns;
+
+insert into @A (key, value) values
+('x', 1),
+('y', 2);
+
+insert into @B (key, value) values
+('y', 3),
+('z', 4);
+commit;
+
+select A.* from @A AS A LEFT ONLY JOIN @B AS B ON A.key = B.key
+UNION ALL
+select B.* from @A AS A RIGHT ONLY JOIN @B AS B ON A.key = B.key
+
+
diff --git a/yt/yql/tests/sql/suites/stream_lookup_join/default.cfg b/yt/yql/tests/sql/suites/stream_lookup_join/default.cfg
new file mode 100644
index 0000000000..13ec07f2a3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/stream_lookup_join/default.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+in Event event.txt
+in Host host.txt
+providers dq
diff --git a/yt/yql/tests/sql/suites/stream_lookup_join/event.txt.attr b/yt/yql/tests/sql/suites/stream_lookup_join/event.txt.attr
new file mode 100644
index 0000000000..7dd7675ed1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/stream_lookup_join/event.txt.attr
@@ -0,0 +1,10 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["id";["DataType";"String"]];
+ ["ts";["DataType";"Datetime"]];
+ ["type";["DataType";"String"]];
+ ["host";["DataType";"String"]];
+ ["net";["DataType";"String"]];
+ ["user";["DataType";"String"]]
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/stream_lookup_join/host.txt.attr b/yt/yql/tests/sql/suites/stream_lookup_join/host.txt.attr
new file mode 100644
index 0000000000..2206fffce8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/stream_lookup_join/host.txt.attr
@@ -0,0 +1,8 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["hostname";["DataType";"String"]];
+ ["fqdn";["DataType";"String"]];
+ ["ip4";["DataType";"String"]];
+ ["ip6";["DataType";"String"]]
+ ]];
+}}
diff --git a/yt/yql/tests/sql/suites/stream_lookup_join/input.txt.attr b/yt/yql/tests/sql/suites/stream_lookup_join/input.txt.attr
new file mode 100644
index 0000000000..7a11b85b77
--- /dev/null
+++ b/yt/yql/tests/sql/suites/stream_lookup_join/input.txt.attr
@@ -0,0 +1,13 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key"; ["DataType"; "String"]];
+ ["subkey"; ["DataType"; "String"]];
+ ["value"; ["DataType"; "String"]];
+ ]];
+ "SortMembers"=["key"; "subkey"];
+ "SortedBy"=["key"; "subkey"];
+ "SortDirections"=[1; 1];
+ "SortedByTypes"=[["DataType";"String"]; ["DataType";"String"]]
+ };
+}
diff --git a/yt/yql/tests/sql/suites/stream_lookup_join/lookup_join.sql b/yt/yql/tests/sql/suites/stream_lookup_join/lookup_join.sql
new file mode 100644
index 0000000000..84eed2af7e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/stream_lookup_join/lookup_join.sql
@@ -0,0 +1,9 @@
+pragma dq.UseWideChannels = "true";
+use plato;
+
+select e.id as id, e.ts as ts, e.host as host, h.fqdn as fqdn, h.ip4 as ip4, h.ip6 as ip6
+ from Event as e
+ left join /*+ streamlookup() */ Host as h
+ on (e.host == h.hostname)
+;
+
diff --git a/yt/yql/tests/sql/suites/stream_lookup_join/lookup_join_narrow.sql b/yt/yql/tests/sql/suites/stream_lookup_join/lookup_join_narrow.sql
new file mode 100644
index 0000000000..e2ff789e2f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/stream_lookup_join/lookup_join_narrow.sql
@@ -0,0 +1,9 @@
+pragma dq.UseWideChannels = "false";
+use plato;
+
+select e.id as id, e.ts as ts, e.host as host, h.fqdn as fqdn, h.ip4 as ip4, h.ip6 as ip6
+ from Event as e
+ left join /*+ streamlookup() */ Host as h
+ on (e.host == h.hostname)
+;
+
diff --git a/yt/yql/tests/sql/suites/table_range/concat_empty_sorted_with_key_diff.cfg b/yt/yql/tests/sql/suites/table_range/concat_empty_sorted_with_key_diff.cfg
new file mode 100644
index 0000000000..040f725d60
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/concat_empty_sorted_with_key_diff.cfg
@@ -0,0 +1,2 @@
+in Input1 empty_int64.txt
+in Input2 empty_uint32.txt
diff --git a/yt/yql/tests/sql/suites/table_range/concat_empty_sorted_with_key_diff.sql b/yt/yql/tests/sql/suites/table_range/concat_empty_sorted_with_key_diff.sql
new file mode 100644
index 0000000000..d30c32b9b0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/concat_empty_sorted_with_key_diff.sql
@@ -0,0 +1,3 @@
+USE plato;
+
+SELECT * FROM concat(Input1, Input2); \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/table_range/concat_sorted_max_sorted_tables.cfg b/yt/yql/tests/sql/suites/table_range/concat_sorted_max_sorted_tables.cfg
new file mode 100644
index 0000000000..c717a38afa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/concat_sorted_max_sorted_tables.cfg
@@ -0,0 +1,4 @@
+in Input sorted1.txt
+out Output output.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/table_range/concat_sorted_max_sorted_tables.sql b/yt/yql/tests/sql/suites/table_range/concat_sorted_max_sorted_tables.sql
new file mode 100644
index 0000000000..bd692d7685
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/concat_sorted_max_sorted_tables.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+/* kikimr can not */
+/* multirun can not */
+USE plato;
+pragma yt.MaxInputTables="3";
+pragma yt.MaxInputTablesForSortedMerge="2";
+
+INSERT INTO Output
+SELECT
+ key,
+ value
+FROM concat(Input, Input, Input, Input)
+ORDER BY key
+; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/table_range/concat_sorted_max_tables.cfg b/yt/yql/tests/sql/suites/table_range/concat_sorted_max_tables.cfg
new file mode 100644
index 0000000000..b6e7b1a582
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/concat_sorted_max_tables.cfg
@@ -0,0 +1,2 @@
+in Input sorted1.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/table_range/concat_sorted_max_tables.sql b/yt/yql/tests/sql/suites/table_range/concat_sorted_max_tables.sql
new file mode 100644
index 0000000000..08a4e76749
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/concat_sorted_max_tables.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+/* kikimr can not */
+/* multirun can not */
+USE plato;
+pragma yt.MaxInputTables="3";
+pragma yt.MaxInputTablesForSortedMerge="2";
+
+INSERT INTO Output
+SELECT
+ key,
+ value
+FROM concat(Input, Input, Input, Input)
+; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/table_range/concat_sorted_with_key_diff.cfg b/yt/yql/tests/sql/suites/table_range/concat_sorted_with_key_diff.cfg
new file mode 100644
index 0000000000..4ea0bf2550
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/concat_sorted_with_key_diff.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted1.txt
+in Input2 sorted2.txt
diff --git a/yt/yql/tests/sql/suites/table_range/concat_sorted_with_key_diff.sql b/yt/yql/tests/sql/suites/table_range/concat_sorted_with_key_diff.sql
new file mode 100644
index 0000000000..3e752de8b8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/concat_sorted_with_key_diff.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* kikimr can not - range not supported */
+select * from plato.concat("Input1", "Input2") order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/table_range/concat_with_view.cfg b/yt/yql/tests/sql/suites/table_range/concat_with_view.cfg
new file mode 100644
index 0000000000..c4e9cf98a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/concat_with_view.cfg
@@ -0,0 +1,4 @@
+in InputA input.txt
+in InputD doc_view.txt
+in Input1 input.txt
+in Input2 input.txt
diff --git a/yt/yql/tests/sql/suites/table_range/concat_with_view.sql b/yt/yql/tests/sql/suites/table_range/concat_with_view.sql
new file mode 100644
index 0000000000..c9ea1fd45b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/concat_with_view.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* kikimr can not - range not supported */
+select * from plato.concat("InputA", "InputD");
diff --git a/yt/yql/tests/sql/suites/table_range/doc_view.txt.attr b/yt/yql/tests/sql/suites/table_range/doc_view.txt.attr
new file mode 100644
index 0000000000..41ea51e276
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/doc_view.txt.attr
@@ -0,0 +1,4 @@
+{
+ "_yql_type"="view";
+ "type"="document";
+}
diff --git a/yt/yql/tests/sql/suites/table_range/each_with_non_existing.cfg b/yt/yql/tests/sql/suites/table_range/each_with_non_existing.cfg
new file mode 100644
index 0000000000..51e035b460
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/each_with_non_existing.cfg
@@ -0,0 +1,3 @@
+in Input1 input.txt
+in Input2 nonexist.txt
+in Input3 nonexist.txt
diff --git a/yt/yql/tests/sql/suites/table_range/each_with_non_existing.sql b/yt/yql/tests/sql/suites/table_range/each_with_non_existing.sql
new file mode 100644
index 0000000000..a2527cc655
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/each_with_non_existing.sql
@@ -0,0 +1,4 @@
+/* syntax version 1 */
+/* kikimr can not - range not supported */
+USE plato;
+SELECT * FROM each(["Input1", "Input2", "Input3"]);
diff --git a/yt/yql/tests/sql/suites/table_range/each_with_non_existing_all_fail.cfg b/yt/yql/tests/sql/suites/table_range/each_with_non_existing_all_fail.cfg
new file mode 100644
index 0000000000..62226ec6e8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/each_with_non_existing_all_fail.cfg
@@ -0,0 +1,4 @@
+xfail
+in Input1 nonexist.txt
+in Input2 nonexist.txt
+in Input3 nonexist.txt
diff --git a/yt/yql/tests/sql/suites/table_range/each_with_non_existing_all_fail.sql b/yt/yql/tests/sql/suites/table_range/each_with_non_existing_all_fail.sql
new file mode 100644
index 0000000000..fd8caf1393
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/each_with_non_existing_all_fail.sql
@@ -0,0 +1,5 @@
+/* syntax version 1 */
+/* kikimr can not - range not supported */
+/* custom error:The list of tables is empty*/
+USE plato;
+SELECT * FROM each(["Input1", "Input2", "Input3"]);
diff --git a/yt/yql/tests/sql/suites/table_range/empty_int64.txt.attr b/yt/yql/tests/sql/suites/table_range/empty_int64.txt.attr
new file mode 100644
index 0000000000..5a3a989e42
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/empty_int64.txt.attr
@@ -0,0 +1,11 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Int64"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1];
+ "SortedBy"=["key"];
+ "SortedByTypes"=[["DataType";"Int64";]];
+ "SortMembers"=["key"];
+}}
diff --git a/yt/yql/tests/sql/suites/table_range/empty_uint32.txt.attr b/yt/yql/tests/sql/suites/table_range/empty_uint32.txt.attr
new file mode 100644
index 0000000000..9bd4ce7778
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/empty_uint32.txt.attr
@@ -0,0 +1,11 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Uint32"]];
+ ["subkey";["DataType";"String"]];
+ ["value";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1];
+ "SortedBy"=["key"];
+ "SortedByTypes"=[["DataType";"Uint32";]];
+ "SortMembers"=["key"];
+}}
diff --git a/yt/yql/tests/sql/suites/table_range/limit_with_table_path_over_sorted_range.cfg b/yt/yql/tests/sql/suites/table_range/limit_with_table_path_over_sorted_range.cfg
new file mode 100644
index 0000000000..7cc6ef73bf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/limit_with_table_path_over_sorted_range.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted1.txt
+in Input2 sorted1.txt
diff --git a/yt/yql/tests/sql/suites/table_range/limit_with_table_path_over_sorted_range.sql b/yt/yql/tests/sql/suites/table_range/limit_with_table_path_over_sorted_range.sql
new file mode 100644
index 0000000000..6e940b08a8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/limit_with_table_path_over_sorted_range.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+/* kikimr can not */
+
+SELECT key, value, SUBSTRING(TablePath(), NULL, CAST(LENGTH(TablePath()) - 1 as Uint32)) as path
+FROM plato.range("","Input1", "Input2")
+LIMIT 2
+; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/table_range/merge_non_strict.cfg b/yt/yql/tests/sql/suites/table_range/merge_non_strict.cfg
new file mode 100644
index 0000000000..b9f4d07258
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/merge_non_strict.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_non_strict.txt
+in Input2 sorted1.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/table_range/merge_non_strict.sql b/yt/yql/tests/sql/suites/table_range/merge_non_strict.sql
new file mode 100644
index 0000000000..97d2b56b77
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/merge_non_strict.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+USE plato;
+
+SELECT key, subkey FROM CONCAT(Input1, Input1) ORDER BY key, subkey;
+
+SELECT key, subkey FROM CONCAT(Input1, Input2) ORDER BY key, subkey;
diff --git a/yt/yql/tests/sql/suites/table_range/range_over_desc.cfg b/yt/yql/tests/sql/suites/table_range/range_over_desc.cfg
new file mode 100644
index 0000000000..ceaf2a5ea3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/range_over_desc.cfg
@@ -0,0 +1,2 @@
+in Input1 sorted_desc.txt
+in Input2 sorted_desc.txt
diff --git a/yt/yql/tests/sql/suites/table_range/range_over_desc.sql b/yt/yql/tests/sql/suites/table_range/range_over_desc.sql
new file mode 100644
index 0000000000..fa2f513898
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/range_over_desc.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+/* kikimr can not - range not supported */
+/* syntax version 1 */
+use plato;
+
+select t.*, TableName() as path from range("","Input1", "Input2") as t
+order by path, key, value;
diff --git a/yt/yql/tests/sql/suites/table_range/range_over_filter.cfg b/yt/yql/tests/sql/suites/table_range/range_over_filter.cfg
new file mode 100644
index 0000000000..c6cac50799
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/range_over_filter.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+udf python3_udf
+udf unicode_udf
diff --git a/yt/yql/tests/sql/suites/table_range/range_over_filter.sql b/yt/yql/tests/sql/suites/table_range/range_over_filter.sql
new file mode 100644
index 0000000000..682f3fdb79
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/range_over_filter.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+/* syntax version 1 */
+/* kikimr can not - range not supported */
+select count(*) as count from plato.filter(``, Unicode::IsUtf);
+
+$script = @@
+def f(s):
+ return True
+@@;
+
+$callable = Python3::f(Callable<(String)->Bool?>,$script);
+select count(*) as count from plato.filter(``, $callable);
diff --git a/yt/yql/tests/sql/suites/table_range/range_over_filter_udf.cfg b/yt/yql/tests/sql/suites/table_range/range_over_filter_udf.cfg
new file mode 100644
index 0000000000..6149ae4837
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/range_over_filter_udf.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+udf python3_udf
+udf re2_udf
diff --git a/yt/yql/tests/sql/suites/table_range/range_over_filter_udf.sql b/yt/yql/tests/sql/suites/table_range/range_over_filter_udf.sql
new file mode 100644
index 0000000000..4756b27c4b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/range_over_filter_udf.sql
@@ -0,0 +1,16 @@
+/* postgres can not */
+/* syntax version 1 */
+/* kikimr can not - range not supported */
+$script = @@
+def f(f):
+ def ft(s):
+ return True
+ def ff(s):
+ return False
+ return f and ft or ff
+@@;
+
+$callable = Python3::f(Callable<(Bool)->Callable<(String)->Bool>>,$script);
+$callableT = $callable(Re2::Match('test.*')('testfets'));
+
+select count(*) as count from plato.filter(``, $callableT);
diff --git a/yt/yql/tests/sql/suites/table_range/range_over_like.cfg b/yt/yql/tests/sql/suites/table_range/range_over_like.cfg
new file mode 100644
index 0000000000..e300a83153
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/range_over_like.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf re2_udf
diff --git a/yt/yql/tests/sql/suites/table_range/range_over_like.sql b/yt/yql/tests/sql/suites/table_range/range_over_like.sql
new file mode 100644
index 0000000000..28a45f57fe
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/range_over_like.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+/* kikimr can not - range not supported */
+/* syntax version 1 */
+select count(*) as count from plato.like(``, "_np%");
diff --git a/yt/yql/tests/sql/suites/table_range/range_over_regexp.cfg b/yt/yql/tests/sql/suites/table_range/range_over_regexp.cfg
new file mode 100644
index 0000000000..ce7c51a32a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/range_over_regexp.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf pire_udf
diff --git a/yt/yql/tests/sql/suites/table_range/range_over_regexp.sql b/yt/yql/tests/sql/suites/table_range/range_over_regexp.sql
new file mode 100644
index 0000000000..f78820f952
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/range_over_regexp.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+/* kikimr can not - range not supported */
+/* syntax version 1 */
+PRAGMA RegexUseRe2='true';
+select count(*) as count from plato.regexp(``, "np");
diff --git a/yt/yql/tests/sql/suites/table_range/range_slash.cfg b/yt/yql/tests/sql/suites/table_range/range_slash.cfg
new file mode 100644
index 0000000000..53bfd46c84
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/range_slash.cfg
@@ -0,0 +1,3 @@
+in Input1 input.txt
+in Input2 input.txt
+
diff --git a/yt/yql/tests/sql/suites/table_range/range_slash.sql b/yt/yql/tests/sql/suites/table_range/range_slash.sql
new file mode 100644
index 0000000000..f0a2693294
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/range_slash.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+USE plato;
+
+SELECT *
+FROM RANGE("/", "Input1", "Input2", "/");
+
+SELECT *
+FROM RANGE("/", "Input1", "Input2", "/");
+
diff --git a/yt/yql/tests/sql/suites/table_range/range_tables_with_view.cfg b/yt/yql/tests/sql/suites/table_range/range_tables_with_view.cfg
new file mode 100644
index 0000000000..8b7633b301
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/range_tables_with_view.cfg
@@ -0,0 +1 @@
+in Input view_input.txt
diff --git a/yt/yql/tests/sql/suites/table_range/range_tables_with_view.sql b/yt/yql/tests/sql/suites/table_range/range_tables_with_view.sql
new file mode 100644
index 0000000000..b1dc52aa63
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/range_tables_with_view.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* syntax version 1 */
+select count(*) as count from plato.range(``, ``, ``, ``, ksv);
diff --git a/yt/yql/tests/sql/suites/table_range/range_with_view.cfg b/yt/yql/tests/sql/suites/table_range/range_with_view.cfg
new file mode 100644
index 0000000000..c4e9cf98a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/range_with_view.cfg
@@ -0,0 +1,4 @@
+in InputA input.txt
+in InputD doc_view.txt
+in Input1 input.txt
+in Input2 input.txt
diff --git a/yt/yql/tests/sql/suites/table_range/range_with_view.sql b/yt/yql/tests/sql/suites/table_range/range_with_view.sql
new file mode 100644
index 0000000000..4e28ca82e7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/range_with_view.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* kikimr can not - range not supported */
+select * from plato.range("","InputA", "InputD");
diff --git a/yt/yql/tests/sql/suites/table_range/sorted1.txt.attr b/yt/yql/tests/sql/suites/table_range/sorted1.txt.attr
new file mode 100644
index 0000000000..ed13e20223
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/sorted1.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/table_range/sorted2.txt.attr b/yt/yql/tests/sql/suites/table_range/sorted2.txt.attr
new file mode 100644
index 0000000000..02e438f8df
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/sorted2.txt.attr
@@ -0,0 +1,11 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["OptionalType"; ["DataType";"String";]]];
+ ["value";["DataType";"String"]]
+ ]];
+ "SortDirections"=[1;1;];
+ "SortedBy"=["key";"subkey";];
+ "SortedByTypes"=[["DataType";"String";];["OptionalType"; ["DataType";"String";]];];
+ "SortMembers"=["key";"subkey";];
+}}
diff --git a/yt/yql/tests/sql/suites/table_range/sorted_desc.txt.attr b/yt/yql/tests/sql/suites/table_range/sorted_desc.txt.attr
new file mode 100644
index 0000000000..5a6ca5761e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/sorted_desc.txt.attr
@@ -0,0 +1,47 @@
+{
+ "_yql_row_spec" = {
+ "SortMembers" = [
+ "key"
+ ];
+ "SortDirections" = [
+ 0
+ ];
+ "UniqueKeys" = %false;
+ "SortedByTypes" = [
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ "StrictSchema" = %true;
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ];
+ "SortedBy" = [
+ "_yql_column_0"
+ ]
+ }
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/table_range/sorted_non_strict.txt.attr b/yt/yql/tests/sql/suites/table_range/sorted_non_strict.txt.attr
new file mode 100644
index 0000000000..a932faecd8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/sorted_non_strict.txt.attr
@@ -0,0 +1,15 @@
+{
+ "schema" = <"strict" = %false; "unique_keys" = %false>
+ [
+ {
+ "name" = "key";
+ "type" = "string";
+ "sort_order" = "ascending";
+ };
+ {
+ "name" = "subkey";
+ "type" = "string";
+ "sort_order" = "ascending";
+ }
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/table_range/table_funcs_expr.cfg b/yt/yql/tests/sql/suites/table_range/table_funcs_expr.cfg
new file mode 100644
index 0000000000..4464fb271c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/table_funcs_expr.cfg
@@ -0,0 +1,5 @@
+in Input input.txt
+udf re2_udf
+udf hyperscan_udf
+udf string_udf
+
diff --git a/yt/yql/tests/sql/suites/table_range/table_funcs_expr.sql b/yt/yql/tests/sql/suites/table_range/table_funcs_expr.sql
new file mode 100644
index 0000000000..0ca6068d44
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/table_funcs_expr.sql
@@ -0,0 +1,16 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+select count(*) from concat("Inp"||Unicode::ToLower("ut"u));
+select count(*) from concat_strict("Inp"||Unicode::ToLower("ut"u));
+select count(*) from range("","Inp" || Unicode::ToLower("ut"u));
+select count(*) from range_strict("","Inp" || Unicode::ToLower("ut"u));
+select count(*) from filter("",($x)->{return $x == "Input"});
+select count(*) from filter_strict("",($x)->{return $x == "Input"});
+select count(*) from like("","Inp" || "%");
+select count(*) from like_strict("","Inp" || "%");
+select count(*) from regexp("","Inp" || ".t");
+select count(*) from regexp_strict("","Inp" || ".t");
+select count(*) from each(AsList("Input"));
+select count(*) from each_strict(AsList("Input"));
+select count(*) from folder(SUBSTRING("foo",0,0));
diff --git a/yt/yql/tests/sql/suites/table_range/tablepath_with_non_existing.cfg b/yt/yql/tests/sql/suites/table_range/tablepath_with_non_existing.cfg
new file mode 100644
index 0000000000..51e035b460
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/tablepath_with_non_existing.cfg
@@ -0,0 +1,3 @@
+in Input1 input.txt
+in Input2 nonexist.txt
+in Input3 nonexist.txt
diff --git a/yt/yql/tests/sql/suites/table_range/tablepath_with_non_existing.sql b/yt/yql/tests/sql/suites/table_range/tablepath_with_non_existing.sql
new file mode 100644
index 0000000000..f6a46792fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/tablepath_with_non_existing.sql
@@ -0,0 +1,6 @@
+/* syntax version 1 */
+/* kikimr can not - range not supported */
+USE plato;
+SELECT key, subkey, TableName() AS name
+FROM each(["Input1", "Input2", "Input3"])
+WITH SCHEMA Struct<key:String, subkey:String, value:String>;
diff --git a/yt/yql/tests/sql/suites/table_range/view_input.txt.attr b/yt/yql/tests/sql/suites/table_range/view_input.txt.attr
new file mode 100644
index 0000000000..07386c98e5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/table_range/view_input.txt.attr
@@ -0,0 +1,32 @@
+{
+ "_yql_view_ksv"="SELECT key as k, subkey as s, value as v FROM self";
+ "_yql_view_key"="SELECT key FROM self";
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/tpch/customer.txt.attr b/yt/yql/tests/sql/suites/tpch/customer.txt.attr
new file mode 100644
index 0000000000..db4ca5853e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/customer.txt.attr
@@ -0,0 +1,56 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "name" = "c_custkey";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "int32";
+ "type_v3" = "int32";
+ };
+ {
+ "name" = "c_acctbal";
+ "required" = %true;
+ "type" = "double";
+ "type_v3" = "double";
+ };
+ {
+ "name" = "c_phone";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "c_mktsegment";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "c_nationkey";
+ "required" = %true;
+ "type" = "int32";
+ "type_v3" = "int32";
+ };
+ {
+ "name" = "c_comment";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "c_name";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "c_address";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/tpch/default.cfg b/yt/yql/tests/sql/suites/tpch/default.cfg
new file mode 100644
index 0000000000..f3c9624348
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/default.cfg
@@ -0,0 +1,8 @@
+in customer customer.txt
+in lineitem lineitem.txt
+in nation nation.txt
+in orders orders.txt
+in part part.txt
+in partsupp partsupp.txt
+in region region.txt
+in supplier supplier.txt
diff --git a/yt/yql/tests/sql/suites/tpch/lineitem.txt.attr b/yt/yql/tests/sql/suites/tpch/lineitem.txt.attr
new file mode 100644
index 0000000000..7abd7775de
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/lineitem.txt.attr
@@ -0,0 +1,114 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "name" = "l_orderkey";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "int32";
+ "type_v3" = "int32";
+ };
+ {
+ "name" = "l_linenumber";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "int32";
+ "type_v3" = "int32";
+ };
+ {
+ "name" = "l_discount";
+ "required" = %true;
+ "type" = "double";
+ "type_v3" = "double";
+ };
+ {
+ "name" = "l_extendedprice";
+ "required" = %true;
+ "type" = "double";
+ "type_v3" = "double";
+ };
+ {
+ "name" = "l_comment";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "l_shipdate";
+ "required" = %false;
+ "type" = "date";
+ "type_v3" = {
+ "type_name" = "optional";
+ "item" = "date";
+ };
+ };
+ {
+ "name" = "l_returnflag";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "l_partkey";
+ "required" = %true;
+ "type" = "int32";
+ "type_v3" = "int32";
+ };
+ {
+ "name" = "l_tax";
+ "required" = %true;
+ "type" = "double";
+ "type_v3" = "double";
+ };
+ {
+ "name" = "l_shipinstruct";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "l_commitdate";
+ "required" = %false;
+ "type" = "date";
+ "type_v3" = {
+ "type_name" = "optional";
+ "item" = "date";
+ };
+ };
+ {
+ "name" = "l_receiptdate";
+ "required" = %false;
+ "type" = "date";
+ "type_v3" = {
+ "type_name" = "optional";
+ "item" = "date";
+ };
+ };
+ {
+ "name" = "l_quantity";
+ "required" = %true;
+ "type" = "double";
+ "type_v3" = "double";
+ };
+ {
+ "name" = "l_suppkey";
+ "required" = %true;
+ "type" = "int32";
+ "type_v3" = "int32";
+ };
+ {
+ "name" = "l_shipmode";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "l_linestatus";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/tpch/nation.txt.attr b/yt/yql/tests/sql/suites/tpch/nation.txt.attr
new file mode 100644
index 0000000000..1db996b861
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/nation.txt.attr
@@ -0,0 +1,32 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "name" = "n_nationkey";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "int32";
+ "type_v3" = "int32";
+ };
+ {
+ "name" = "n_regionkey";
+ "required" = %true;
+ "type" = "int32";
+ "type_v3" = "int32";
+ };
+ {
+ "name" = "n_name";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "n_comment";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/tpch/orders.txt.attr b/yt/yql/tests/sql/suites/tpch/orders.txt.attr
new file mode 100644
index 0000000000..fb5e422f56
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/orders.txt.attr
@@ -0,0 +1,65 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "name" = "o_orderkey";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "int32";
+ "type_v3" = "int32";
+ };
+ {
+ "name" = "o_orderstatus";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "o_comment";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "o_totalprice";
+ "required" = %true;
+ "type" = "double";
+ "type_v3" = "double";
+ };
+ {
+ "name" = "o_clerk";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "o_custkey";
+ "required" = %true;
+ "type" = "int32";
+ "type_v3" = "int32";
+ };
+ {
+ "name" = "o_orderpriority";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "o_orderdate";
+ "required" = %false;
+ "type" = "date";
+ "type_v3" = {
+ "type_name" = "optional";
+ "item" = "date";
+ };
+ };
+ {
+ "name" = "o_shippriority";
+ "required" = %true;
+ "type" = "int64";
+ "type_v3" = "int64";
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/tpch/part.txt.attr b/yt/yql/tests/sql/suites/tpch/part.txt.attr
new file mode 100644
index 0000000000..973fedb9e4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/part.txt.attr
@@ -0,0 +1,62 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "name" = "p_partkey";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "int32";
+ "type_v3" = "int32";
+ };
+ {
+ "name" = "p_name";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "p_container";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "p_size";
+ "required" = %true;
+ "type" = "int64";
+ "type_v3" = "int64";
+ };
+ {
+ "name" = "p_type";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "p_comment";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "p_retailprice";
+ "required" = %true;
+ "type" = "double";
+ "type_v3" = "double";
+ };
+ {
+ "name" = "p_mfgr";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "p_brand";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/tpch/partsupp.txt.attr b/yt/yql/tests/sql/suites/tpch/partsupp.txt.attr
new file mode 100644
index 0000000000..b941075b07
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/partsupp.txt.attr
@@ -0,0 +1,39 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "name" = "ps_partkey";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "int32";
+ "type_v3" = "int32";
+ };
+ {
+ "name" = "ps_suppkey";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "int32";
+ "type_v3" = "int32";
+ };
+ {
+ "name" = "ps_comment";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "ps_supplycost";
+ "required" = %true;
+ "type" = "double";
+ "type_v3" = "double";
+ };
+ {
+ "name" = "ps_availqty";
+ "required" = %true;
+ "type" = "int64";
+ "type_v3" = "int64";
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/tpch/q1.sql b/yt/yql/tests/sql/suites/tpch/q1.sql
new file mode 100644
index 0000000000..3f8ccfe964
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q1.sql
@@ -0,0 +1,26 @@
+
+-- TPC-H/TPC-R Pricing Summary Report Query (Q1)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+select
+ l_returnflag,
+ l_linestatus,
+ sum(l_quantity) as sum_qty,
+ sum(l_extendedprice) as sum_base_price,
+ sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
+ sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
+ avg(l_quantity) as avg_qty,
+ avg(l_extendedprice) as avg_price,
+ avg(l_discount) as avg_disc,
+ count(*) as count_order
+from
+ plato.lineitem
+where
+ CAST(l_shipdate AS Timestamp) <= (CAST('1998-12-01' AS Date) - Interval("P100D"))
+group by
+ l_returnflag,
+ l_linestatus
+order by
+ l_returnflag,
+ l_linestatus;
diff --git a/yt/yql/tests/sql/suites/tpch/q10.sql b/yt/yql/tests/sql/suites/tpch/q10.sql
new file mode 100644
index 0000000000..1d3e4a75bb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q10.sql
@@ -0,0 +1,87 @@
+
+-- TPC-H/TPC-R Returned Item Reporting Query (Q10)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+$border = Date("1993-12-01");
+$join1 = (
+select
+ c.c_custkey as c_custkey,
+ c.c_name as c_name,
+ c.c_acctbal as c_acctbal,
+ c.c_address as c_address,
+ c.c_phone as c_phone,
+ c.c_comment as c_comment,
+ c.c_nationkey as c_nationkey,
+ o.o_orderkey as o_orderkey
+from
+ plato.customer as c
+join
+ plato.orders as o
+on
+ c.c_custkey = o.o_custkey
+where
+ cast(o.o_orderdate as timestamp) >= $border and
+ cast(o.o_orderdate as timestamp) < ($border + Interval("P90D"))
+);
+$join2 = (
+select
+ j.c_custkey as c_custkey,
+ j.c_name as c_name,
+ j.c_acctbal as c_acctbal,
+ j.c_address as c_address,
+ j.c_phone as c_phone,
+ j.c_comment as c_comment,
+ j.c_nationkey as c_nationkey,
+ l.l_extendedprice as l_extendedprice,
+ l.l_discount as l_discount
+from
+ $join1 as j
+join
+ plato.lineitem as l
+on
+ l.l_orderkey = j.o_orderkey
+where
+ l.l_returnflag = 'R'
+);
+$join3 = (
+select
+ j.c_custkey as c_custkey,
+ j.c_name as c_name,
+ j.c_acctbal as c_acctbal,
+ j.c_address as c_address,
+ j.c_phone as c_phone,
+ j.c_comment as c_comment,
+ j.c_nationkey as c_nationkey,
+ j.l_extendedprice as l_extendedprice,
+ j.l_discount as l_discount,
+ n.n_name as n_name
+from
+ $join2 as j
+join
+ plato.nation as n
+on
+ n.n_nationkey = j.c_nationkey
+);
+select
+ c_custkey,
+ c_name,
+ sum(l_extendedprice * (1 - l_discount)) as revenue,
+ c_acctbal,
+ n_name,
+ c_address,
+ c_phone,
+ c_comment
+from
+ $join3
+group by
+ c_custkey,
+ c_name,
+ c_acctbal,
+ c_phone,
+ n_name,
+ c_address,
+ c_comment
+order by
+ revenue desc
+limit 20;
diff --git a/yt/yql/tests/sql/suites/tpch/q11.sql b/yt/yql/tests/sql/suites/tpch/q11.sql
new file mode 100644
index 0000000000..2a80fb6128
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q11.sql
@@ -0,0 +1,62 @@
+
+-- TPC-H/TPC-R Important Stock Identification Query (Q11)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+PRAGMA DisableSimpleColumns;
+
+$join1 = (
+select
+ ps.ps_partkey as ps_partkey,
+ ps.ps_supplycost as ps_supplycost,
+ ps.ps_availqty as ps_availqty,
+ s.s_nationkey as s_nationkey
+from
+ plato.partsupp as ps
+join
+ plato.supplier as s
+on
+ ps.ps_suppkey = s.s_suppkey
+);
+$join2 = (
+select
+ j.ps_partkey as ps_partkey,
+ j.ps_supplycost as ps_supplycost,
+ j.ps_availqty as ps_availqty,
+ j.s_nationkey as s_nationkey
+from
+ $join1 as j
+join
+ plato.nation as n
+on
+ n.n_nationkey = j.s_nationkey
+where
+ n.n_name = 'CANADA'
+);
+$threshold = (
+select
+ sum(ps_supplycost * ps_availqty) * 0.0001000000 as threshold
+from
+ $join2
+);
+$values = (
+select
+ ps_partkey,
+ sum(ps_supplycost * ps_availqty) as value
+from
+ $join2
+group by
+ ps_partkey
+);
+
+select
+ v.ps_partkey as ps_partkey,
+ v.value as value
+from
+ $values as v
+cross join
+ $threshold as t
+where
+ v.value > t.threshold
+order by
+ value desc;
diff --git a/yt/yql/tests/sql/suites/tpch/q12.sql b/yt/yql/tests/sql/suites/tpch/q12.sql
new file mode 100644
index 0000000000..d8425b0b4a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q12.sql
@@ -0,0 +1,45 @@
+
+-- TPC-H/TPC-R Shipping Modes and Order Priority Query (Q12)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+$join = (
+ select
+ l.l_shipmode as l_shipmode,
+ o.o_orderpriority as o_orderpriority,
+ l.l_commitdate as l_commitdate,
+ l.l_shipdate as l_shipdate,
+ l.l_receiptdate as l_receiptdate
+ from
+ plato.orders as o
+ join plato.lineitem as l
+ on o.o_orderkey == l.l_orderkey
+);
+
+$border = Date("1994-01-01");
+
+select
+ l_shipmode,
+ sum(case
+ when o_orderpriority = '1-URGENT'
+ or o_orderpriority = '2-HIGH'
+ then 1
+ else 0
+ end) as high_line_count,
+ sum(case
+ when o_orderpriority <> '1-URGENT'
+ and o_orderpriority <> '2-HIGH'
+ then 1
+ else 0
+ end) as low_line_count
+from $join
+where
+ (l_shipmode = 'MAIL' or l_shipmode = 'TRUCK')
+ and l_commitdate < l_receiptdate
+ and l_shipdate < l_commitdate
+ and cast(l_receiptdate as timestamp) >= $border
+ and cast(l_receiptdate as timestamp) < ($border + Interval("P365D"))
+group by
+ l_shipmode
+order by
+ l_shipmode;
diff --git a/yt/yql/tests/sql/suites/tpch/q13.sql b/yt/yql/tests/sql/suites/tpch/q13.sql
new file mode 100644
index 0000000000..e94f36a545
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q13.sql
@@ -0,0 +1,33 @@
+
+-- TPC-H/TPC-R Customer Distribution Query (Q13)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+$orders = (
+ select
+ o_orderkey,
+ o_custkey
+ from
+ plato.orders
+ where
+ o_comment NOT LIKE "%unusual%requests%"
+);
+select
+ c_count as c_count,
+ count(*) as custdist
+from
+ (
+ select
+ c.c_custkey as c_custkey,
+ count(o.o_orderkey) as c_count
+ from
+ plato.customer as c left outer join $orders as o on
+ c.c_custkey = o.o_custkey
+ group by
+ c.c_custkey
+ ) as c_orders
+group by
+ c_count
+order by
+ custdist desc,
+ c_count desc;
diff --git a/yt/yql/tests/sql/suites/tpch/q14.sql b/yt/yql/tests/sql/suites/tpch/q14.sql
new file mode 100644
index 0000000000..99ad7f0c4e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q14.sql
@@ -0,0 +1,21 @@
+
+-- TPC-H/TPC-R Promotion Effect Query (Q14)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+$border = Date("1994-08-01");
+select
+ 100.00 * sum(case
+ when StartsWith(p.p_type, 'PROMO')
+ then l.l_extendedprice * (1 - l.l_discount)
+ else 0
+ end) / sum(l.l_extendedprice * (1 - l.l_discount)) as promo_revenue
+from
+ plato.lineitem as l
+join
+ plato.part as p
+on
+ l.l_partkey = p.p_partkey
+where
+ cast(l.l_shipdate as timestamp) >= $border
+ and cast(l.l_shipdate as timestamp) < ($border + Interval("P31D"));
diff --git a/yt/yql/tests/sql/suites/tpch/q15.sql b/yt/yql/tests/sql/suites/tpch/q15.sql
new file mode 100644
index 0000000000..e8a141e83f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q15.sql
@@ -0,0 +1,56 @@
+-- ignore runonopt plan diff
+-- TPC-H/TPC-R Top Supplier Query (Q15)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+$border = Date("1997-03-01");
+$revenue0 = (
+ select
+ l_suppkey as supplier_no,
+ sum(l_extendedprice * (1 - l_discount)) as total_revenue,
+ cast(sum(l_extendedprice * (1 - l_discount)) as Uint64) as total_revenue_approx
+ from
+ plato.lineitem
+ where
+ cast(l_shipdate as timestamp) >= $border
+ and cast(l_shipdate as timestamp) < ($border + Interval("P92D"))
+ group by
+ l_suppkey
+);
+$max_revenue = (
+select
+ max(total_revenue_approx) as max_revenue
+from
+ $revenue0
+);
+$join1 = (
+select
+ s.s_suppkey as s_suppkey,
+ s.s_name as s_name,
+ s.s_address as s_address,
+ s.s_phone as s_phone,
+ r.total_revenue as total_revenue,
+ r.total_revenue_approx as total_revenue_approx
+from
+ plato.supplier as s
+join
+ $revenue0 as r
+on
+ s.s_suppkey = r.supplier_no
+);
+
+select
+ j.s_suppkey as s_suppkey,
+ j.s_name as s_name,
+ j.s_address as s_address,
+ j.s_phone as s_phone,
+ j.total_revenue as total_revenue
+from
+ $join1 as j
+join
+ $max_revenue as m
+on
+ j.total_revenue_approx = m.max_revenue
+order by
+ s_suppkey;
+
diff --git a/yt/yql/tests/sql/suites/tpch/q16.sql b/yt/yql/tests/sql/suites/tpch/q16.sql
new file mode 100644
index 0000000000..153b72797b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q16.sql
@@ -0,0 +1,44 @@
+
+-- TPC-H/TPC-R Parts/Supplier Relationship Query (Q16)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+$join = (
+select
+ ps.ps_suppkey as ps_suppkey,
+ ps.ps_partkey as ps_partkey
+from
+ plato.partsupp as ps
+left join
+ plato.supplier as w
+on
+ w.s_suppkey = ps.ps_suppkey
+where not (s_comment like "%Customer%Complaints%")
+);
+
+select
+ p.p_brand as p_brand,
+ p.p_type as p_type,
+ p.p_size as p_size,
+ count(distinct j.ps_suppkey) as supplier_cnt
+from
+ $join as j
+join
+ plato.part as p
+on
+ p.p_partkey = j.ps_partkey
+where
+ p.p_brand <> 'Brand#33'
+ and (not StartsWith(p.p_type, 'PROMO POLISHED'))
+ and (p.p_size = 20 or p.p_size = 27 or p.p_size = 11 or p.p_size = 45 or p.p_size = 40 or p.p_size = 41 or p.p_size = 34 or p.p_size = 36)
+group by
+ p.p_brand,
+ p.p_type,
+ p.p_size
+order by
+ supplier_cnt desc,
+ p_brand,
+ p_type,
+ p_size
+;
+
diff --git a/yt/yql/tests/sql/suites/tpch/q17.sql b/yt/yql/tests/sql/suites/tpch/q17.sql
new file mode 100644
index 0000000000..c775d585bb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q17.sql
@@ -0,0 +1,41 @@
+
+-- TPC-H/TPC-R Small-Quantity-Order Revenue Query (Q17)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+$threshold = (
+select
+ 0.2 * avg(l_quantity) as threshold,
+ l_partkey
+from
+ plato.lineitem
+group by
+ l_partkey
+);
+
+$join1 = (
+select
+ p.p_partkey as p_partkey,
+ l.l_extendedprice as l_extendedprice,
+ l.l_quantity as l_quantity
+from
+ plato.lineitem as l
+join
+ plato.part as p
+on
+ p.p_partkey = l.l_partkey
+where
+ p.p_brand = 'Brand#35'
+ and p.p_container = 'LG DRUM'
+);
+
+select
+ sum(j.l_extendedprice) / 7.0 as avg_yearly
+from
+ $join1 as j
+join
+ $threshold as t
+on
+ j.p_partkey = t.l_partkey
+where
+ j.l_quantity < t.threshold;
diff --git a/yt/yql/tests/sql/suites/tpch/q18.sql b/yt/yql/tests/sql/suites/tpch/q18.sql
new file mode 100644
index 0000000000..dfc0e858ea
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q18.sql
@@ -0,0 +1,53 @@
+
+-- TPC-H/TPC-R Large Volume Customer Query (Q18)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+$in = (
+select
+ l_orderkey,
+ sum(l_quantity) as sum_l_quantity
+from
+ plato.lineitem
+group by
+ l_orderkey having
+ sum(l_quantity) > 315
+);
+
+$join1 = (
+select
+ c.c_name as c_name,
+ c.c_custkey as c_custkey,
+ o.o_orderkey as o_orderkey,
+ o.o_orderdate as o_orderdate,
+ o.o_totalprice as o_totalprice
+from
+ plato.customer as c
+join
+ plato.orders as o
+on
+ c.c_custkey = o.o_custkey
+);
+select
+ j.c_name as c_name,
+ j.c_custkey as c_custkey,
+ j.o_orderkey as o_orderkey,
+ j.o_orderdate as o_orderdate,
+ j.o_totalprice as o_totalprice,
+ sum(i.sum_l_quantity) as sum_l_quantity
+from
+ $join1 as j
+join
+ $in as i
+on
+ i.l_orderkey = j.o_orderkey
+group by
+ j.c_name,
+ j.c_custkey,
+ j.o_orderkey,
+ j.o_orderdate,
+ j.o_totalprice
+order by
+ o_totalprice desc,
+ o_orderdate
+limit 100;
diff --git a/yt/yql/tests/sql/suites/tpch/q19.sql b/yt/yql/tests/sql/suites/tpch/q19.sql
new file mode 100644
index 0000000000..e9b3a7d7bc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q19.sql
@@ -0,0 +1,40 @@
+
+-- TPC-H/TPC-R Discounted Revenue Query (Q19)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+select
+ sum(l.l_extendedprice* (1 - l.l_discount)) as revenue
+from
+ plato.lineitem as l
+join
+ plato.part as p
+on
+ p.p_partkey = l.l_partkey
+where
+ (
+ p.p_brand = 'Brand#23'
+ and (p.p_container = 'SM CASE' or p.p_container = 'SM BOX' or p.p_container = 'SM PACK' or p.p_container = 'SM PKG')
+ and l.l_quantity >= 7 and l.l_quantity <= 7 + 10
+ and p.p_size between 1 and 5
+ and (l.l_shipmode = 'AIR' or l.l_shipmode = 'AIR REG')
+ and l.l_shipinstruct = 'DELIVER IN PERSON'
+ )
+ or
+ (
+ p.p_brand = 'Brand#15'
+ and (p.p_container = 'MED BAG' or p.p_container = 'MED BOX' or p.p_container = 'MED PKG' or p.p_container = 'MED PACK')
+ and l.l_quantity >= 17 and l.l_quantity <= 17 + 10
+ and p.p_size between 1 and 10
+ and (l.l_shipmode = 'AIR' or l.l_shipmode = 'AIR REG')
+ and l.l_shipinstruct = 'DELIVER IN PERSON'
+ )
+ or
+ (
+ p.p_brand = 'Brand#44'
+ and (p.p_container = 'LG CASE' or p.p_container = 'LG BOX' or p.p_container = 'LG PACK' or p.p_container = 'LG PKG')
+ and l.l_quantity >= 25 and l.l_quantity <= 25 + 10
+ and p.p_size between 1 and 15
+ and (l.l_shipmode = 'AIR' or l.l_shipmode = 'AIR REG')
+ and l.l_shipinstruct = 'DELIVER IN PERSON'
+ );
diff --git a/yt/yql/tests/sql/suites/tpch/q2.sql b/yt/yql/tests/sql/suites/tpch/q2.sql
new file mode 100644
index 0000000000..f8e11a8c5d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q2.sql
@@ -0,0 +1,68 @@
+
+-- TPC-H/TPC-R Minimum Cost Supplier Query (Q2)
+-- using 1680793381 as a seed to the RNG
+
+$r = (select r_regionkey from
+ plato.region
+where r_name='AMERICA');
+
+$j1 = (select n_name,n_nationkey
+ from plato.nation as n
+ join $r as r on
+ n.n_regionkey = r.r_regionkey);
+
+$j2 = (select s_acctbal,s_name,s_address,s_phone,s_comment,n_name,s_suppkey
+ from plato.supplier as s
+ join $j1 as j on
+ s.s_nationkey = j.n_nationkey
+);
+
+$j3 = (select ps_partkey,ps_supplycost,s_acctbal,s_name,s_address,s_phone,s_comment,n_name
+ from plato.partsupp as ps
+ join $j2 as j on
+ ps.ps_suppkey = j.s_suppkey
+);
+
+$min_ps_supplycost = (select min(ps_supplycost) as min_ps_supplycost,ps_partkey
+ from $j3
+ group by ps_partkey
+);
+
+$p = (select p_partkey,p_mfgr
+ from plato.part
+ where
+ p_size = 10
+ and p_type like '%COPPER'
+);
+
+$j4 = (select s_acctbal,
+ s_name,
+ n_name,
+ p_partkey,
+ p_mfgr,
+ s_address,
+ s_phone,
+ s_comment
+ from $p as p
+ join $j3 as j on p.p_partkey = j.ps_partkey
+ join $min_ps_supplycost as m on p.p_partkey = m.ps_partkey
+ where min_ps_supplycost=ps_supplycost
+);
+
+select
+ s_acctbal,
+ s_name,
+ n_name,
+ p_partkey,
+ p_mfgr,
+ s_address,
+ s_phone,
+ s_comment
+from $j4
+order by
+ s_acctbal desc,
+ n_name,
+ s_name,
+ p_partkey
+limit 100;
+
diff --git a/yt/yql/tests/sql/suites/tpch/q20.sql b/yt/yql/tests/sql/suites/tpch/q20.sql
new file mode 100644
index 0000000000..3272f866d6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q20.sql
@@ -0,0 +1,83 @@
+
+-- TPC-H/TPC-R Potential Part Promotion Query (Q20)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+$border = Date("1993-01-01");
+$threshold = (
+select
+ 0.5 * sum(l_quantity) as threshold,
+ l_partkey as l_partkey,
+ l_suppkey as l_suppkey
+from
+ plato.lineitem
+where
+ cast(l_shipdate as timestamp) >= $border
+ and cast(l_shipdate as timestamp) < ($border + Interval("P365D"))
+group by
+ l_partkey, l_suppkey
+);
+
+$parts = (
+select
+ p_partkey
+from
+ plato.part
+where
+ StartsWith(p_name, 'maroon')
+);
+
+$join1 = (
+select
+ ps.ps_suppkey as ps_suppkey,
+ ps.ps_availqty as ps_availqty,
+ ps.ps_partkey as ps_partkey
+from
+ plato.partsupp as ps
+join any
+ $parts as p
+on
+ ps.ps_partkey = p.p_partkey
+);
+
+$join2 = (
+select
+ distinct(j.ps_suppkey) as ps_suppkey
+from
+ $join1 as j
+join any
+ $threshold as t
+on
+ j.ps_partkey = t.l_partkey and j.ps_suppkey = t.l_suppkey
+where
+ j.ps_availqty > t.threshold
+);
+
+$join3 = (
+select
+ j.ps_suppkey as ps_suppkey,
+ s.s_name as s_name,
+ s.s_address as s_address,
+ s.s_nationkey as s_nationkey
+from
+ $join2 as j
+join any
+ plato.supplier as s
+on
+ j.ps_suppkey = s.s_suppkey
+);
+
+select
+ j.s_name as s_name,
+ j.s_address as s_address
+from
+ $join3 as j
+join
+ plato.nation as n
+on
+ j.s_nationkey = n.n_nationkey
+where
+ n.n_name = 'VIETNAM'
+order by
+ s_name;
+
diff --git a/yt/yql/tests/sql/suites/tpch/q21.sql b/yt/yql/tests/sql/suites/tpch/q21.sql
new file mode 100644
index 0000000000..8b116c809c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q21.sql
@@ -0,0 +1,51 @@
+
+-- TPC-H/TPC-R Suppliers Who Kept Orders Waiting Query (Q21)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+$n = select n_nationkey from plato.nation
+where n_name = 'EGYPT';
+
+$s = select s_name, s_suppkey from plato.supplier as supplier
+join $n as nation
+on supplier.s_nationkey = nation.n_nationkey;
+
+$l = select l_suppkey, l_orderkey from plato.lineitem
+where l_receiptdate > l_commitdate;
+
+$j1 = select s_name, l_suppkey, l_orderkey from $l as l1
+join $s as supplier
+on l1.l_suppkey = supplier.s_suppkey;
+
+$j1_1 = select l1.l_orderkey as l_orderkey from $j1 as l1
+join $l as l3
+on l1.l_orderkey = l3.l_orderkey
+where l3.l_suppkey <> l1.l_suppkey;
+
+$j2 = select s_name, l_suppkey, l_orderkey from $j1 as l1
+left only join $j1_1 as l3
+on l1.l_orderkey = l3.l_orderkey;
+
+$j2_1 = select l1.l_orderkey as l_orderkey from $j2 as l1
+join plato.lineitem as l2
+on l1.l_orderkey = l2.l_orderkey
+where l2.l_suppkey <> l1.l_suppkey;
+
+$j3 = select s_name, l1.l_suppkey as l_suppkey, l1.l_orderkey as l_orderkey from $j2 as l1
+left semi join $j2_1 as l2
+on l1.l_orderkey = l2.l_orderkey;
+
+$j4 = select s_name from $j3 as l1
+join plato.orders as orders
+on orders.o_orderkey = l1.l_orderkey
+where o_orderstatus = 'F';
+
+select s_name,
+ count(*) as numwait from $j4
+group by
+ s_name
+order by
+ numwait desc,
+ s_name
+limit 100;
+
diff --git a/yt/yql/tests/sql/suites/tpch/q22.sql b/yt/yql/tests/sql/suites/tpch/q22.sql
new file mode 100644
index 0000000000..4b12ec51a7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q22.sql
@@ -0,0 +1,58 @@
+
+-- TPC-H/TPC-R Global Sales Opportunity Query (Q22)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+$customers = (
+select
+ c_acctbal,
+ c_custkey,
+ Substring(c_phone, 0u, 2u) as cntrycode
+from
+ plato.customer
+where (Substring(c_phone, 0u, 2u) = '31' or Substring(c_phone, 0u, 2u) = '29' or Substring(c_phone, 0u, 2u) = '30' or Substring(c_phone, 0u, 2u) = '26' or Substring(c_phone, 0u, 2u) = '28' or Substring(c_phone, 0u, 2u) = '25' or Substring(c_phone, 0u, 2u) = '15')
+);
+$avg = (
+select
+ avg(c_acctbal) as a
+from
+ $customers
+where
+ c_acctbal > 0.00
+);
+$join1 = (
+select
+ c.c_acctbal as c_acctbal,
+ c.c_custkey as c_custkey,
+ c.cntrycode as cntrycode
+from
+ $customers as c
+cross join
+ $avg as a
+where
+ c.c_acctbal > a.a
+);
+$join2 = (
+select
+ j.cntrycode as cntrycode,
+ c_custkey,
+ j.c_acctbal as c_acctbal
+from
+ $join1 as j
+left only join
+ plato.orders as o
+on
+ o.o_custkey = j.c_custkey
+);
+
+select
+ cntrycode,
+ count(*) as numcust,
+ sum(c_acctbal) as totacctbal
+from
+ $join2 as custsale
+group by
+ cntrycode
+order by
+ cntrycode;
+
diff --git a/yt/yql/tests/sql/suites/tpch/q3.sql b/yt/yql/tests/sql/suites/tpch/q3.sql
new file mode 100644
index 0000000000..668cb9441f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q3.sql
@@ -0,0 +1,55 @@
+
+-- TPC-H/TPC-R Shipping Priority Query (Q3)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+$join1 = (
+select
+ c.c_mktsegment as c_mktsegment,
+ o.o_orderdate as o_orderdate,
+ o.o_shippriority as o_shippriority,
+ o.o_orderkey as o_orderkey
+from
+ plato.customer as c
+join
+ plato.orders as o
+on
+ c.c_custkey = o.o_custkey
+);
+
+$join2 = (
+select
+ j1.c_mktsegment as c_mktsegment,
+ j1.o_orderdate as o_orderdate,
+ j1.o_shippriority as o_shippriority,
+ l.l_orderkey as l_orderkey,
+ l.l_discount as l_discount,
+ l.l_shipdate as l_shipdate,
+ l.l_extendedprice as l_extendedprice
+from
+ $join1 as j1
+join
+ plato.lineitem as l
+on
+ l.l_orderkey = j1.o_orderkey
+);
+
+select
+ l_orderkey,
+ sum(l_extendedprice * (1 - l_discount)) as revenue,
+ o_orderdate,
+ o_shippriority
+from
+ $join2
+where
+ c_mktsegment = 'MACHINERY'
+ and CAST(o_orderdate AS Timestamp) < Date('1995-03-08')
+ and CAST(l_shipdate AS Timestamp) > Date('1995-03-08')
+group by
+ l_orderkey,
+ o_orderdate,
+ o_shippriority
+order by
+ revenue desc,
+ o_orderdate
+limit 10;
diff --git a/yt/yql/tests/sql/suites/tpch/q4.sql b/yt/yql/tests/sql/suites/tpch/q4.sql
new file mode 100644
index 0000000000..9b02c049cd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q4.sql
@@ -0,0 +1,29 @@
+
+-- TPC-H/TPC-R Order Priority Checking Query (Q4)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+$border = Date("1994-03-01");
+
+$join = (select
+ o.o_orderpriority as o_orderpriority,
+ o.o_orderdate as o_orderdate,
+ l.l_commitdate as l_commitdate,
+ l.l_receiptdate as l_receiptdate
+ from
+ plato.orders as o
+ join any plato.lineitem as l
+ on o.o_orderkey = l.l_orderkey);
+
+select
+ o_orderpriority,
+ count(*) as order_count
+from $join
+where
+ CAST(o_orderdate AS Timestamp) >= $border
+ and CAST(o_orderdate AS Timestamp) < DateTime::MakeDate(DateTime::ShiftMonths($border, 3))
+ and l_commitdate < l_receiptdate
+group by
+ o_orderpriority
+order by
+ o_orderpriority;
diff --git a/yt/yql/tests/sql/suites/tpch/q5.sql b/yt/yql/tests/sql/suites/tpch/q5.sql
new file mode 100644
index 0000000000..62e7acc7d1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q5.sql
@@ -0,0 +1,102 @@
+
+-- TPC-H/TPC-R Local Supplier Volume Query (Q5)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+$join1 = (
+select
+ o.o_orderkey as o_orderkey,
+ o.o_orderdate as o_orderdate,
+ c.c_nationkey as c_nationkey
+from
+ plato.customer as c
+join
+ plato.orders as o
+on
+ c.c_custkey = o.o_custkey
+);
+
+$join2 = (
+select
+ j.o_orderkey as o_orderkey,
+ j.o_orderdate as o_orderdate,
+ j.c_nationkey as c_nationkey,
+ l.l_extendedprice as l_extendedprice,
+ l.l_discount as l_discount,
+ l.l_suppkey as l_suppkey
+from
+ $join1 as j
+join
+ plato.lineitem as l
+on
+ l.l_orderkey = j.o_orderkey
+);
+
+$join3 = (
+select
+ j.o_orderkey as o_orderkey,
+ j.o_orderdate as o_orderdate,
+ j.c_nationkey as c_nationkey,
+ j.l_extendedprice as l_extendedprice,
+ j.l_discount as l_discount,
+ j.l_suppkey as l_suppkey,
+ s.s_nationkey as s_nationkey
+from
+ $join2 as j
+join
+ plato.supplier as s
+on
+ j.l_suppkey = s.s_suppkey
+);
+$join4 = (
+select
+ j.o_orderkey as o_orderkey,
+ j.o_orderdate as o_orderdate,
+ j.c_nationkey as c_nationkey,
+ j.l_extendedprice as l_extendedprice,
+ j.l_discount as l_discount,
+ j.l_suppkey as l_suppkey,
+ j.s_nationkey as s_nationkey,
+ n.n_regionkey as n_regionkey,
+ n.n_name as n_name
+from
+ $join3 as j
+join
+ plato.nation as n
+on
+ j.s_nationkey = n.n_nationkey
+ and j.c_nationkey = n.n_nationkey
+);
+$join5 = (
+select
+ j.o_orderkey as o_orderkey,
+ j.o_orderdate as o_orderdate,
+ j.c_nationkey as c_nationkey,
+ j.l_extendedprice as l_extendedprice,
+ j.l_discount as l_discount,
+ j.l_suppkey as l_suppkey,
+ j.s_nationkey as s_nationkey,
+ j.n_regionkey as n_regionkey,
+ j.n_name as n_name,
+ r.r_name as r_name
+from
+ $join4 as j
+join
+ plato.region as r
+on
+ j.n_regionkey = r.r_regionkey
+);
+$border = Date("1995-01-01");
+select
+ n_name,
+ sum(l_extendedprice * (1 - l_discount)) as revenue
+from
+ $join5
+where
+ r_name = 'AFRICA'
+ and CAST(o_orderdate AS Timestamp) >= $border
+ and CAST(o_orderdate AS Timestamp) < ($border + Interval("P365D"))
+group by
+ n_name
+order by
+ revenue desc;
diff --git a/yt/yql/tests/sql/suites/tpch/q6.sql b/yt/yql/tests/sql/suites/tpch/q6.sql
new file mode 100644
index 0000000000..c96b8ac098
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q6.sql
@@ -0,0 +1,16 @@
+
+-- TPC-H/TPC-R Forecasting Revenue Change Query (Q6)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+$border = Date("1995-01-01");
+
+select
+ sum(l_extendedprice * l_discount) as revenue
+from
+ plato.lineitem
+where
+ CAST(l_shipdate AS Timestamp) >= $border
+ and cast(l_shipdate as Timestamp) < ($border + Interval("P365D"))
+ and l_discount between 0.07 - 0.01 and 0.07 + 0.01
+ and l_quantity < 25;
diff --git a/yt/yql/tests/sql/suites/tpch/q7.sql b/yt/yql/tests/sql/suites/tpch/q7.sql
new file mode 100644
index 0000000000..6ff0eec4db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q7.sql
@@ -0,0 +1,87 @@
+
+-- TPC-H/TPC-R Volume Shipping Query (Q7)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+$n = select n_name, n_nationkey from plato.nation as n
+ where n_name = 'PERU' or n_name = 'MOZAMBIQUE';
+
+$l = select
+ l_orderkey, l_suppkey,
+ DateTime::GetYear(cast(l_shipdate as timestamp)) as l_year,
+ l_extendedprice * (1 - l_discount) as volume
+from
+ plato.lineitem as l
+where
+ cast(cast(l.l_shipdate as Timestamp) as Date)
+ between Date('1995-01-01') and Date('1996-12-31');
+
+$j1 = select
+ n_name as supp_nation,
+ s_suppkey
+from
+ plato.supplier as supplier
+join
+ $n as n1
+on
+ supplier.s_nationkey = n1.n_nationkey;
+
+$j2 = select
+ n_name as cust_nation,
+ c_custkey
+from
+ plato.customer as customer
+join
+ $n as n2
+on
+ customer.c_nationkey = n2.n_nationkey;
+
+$j3 = select
+ cust_nation, o_orderkey
+from
+ plato.orders as orders
+join
+ $j2 as customer
+on
+ orders.o_custkey = customer.c_custkey;
+
+$j4 = select
+ cust_nation,
+ l_orderkey, l_suppkey,
+ l_year,
+ volume
+from
+ $l as lineitem
+join
+ $j3 as orders
+on
+ lineitem.l_orderkey = orders.o_orderkey;
+
+$j5 = select
+ supp_nation, cust_nation,
+ l_year, volume
+from
+ $j4 as lineitem
+join
+ $j1 as supplier
+on
+ lineitem.l_suppkey = supplier.s_suppkey
+where (supp_nation = 'PERU' and cust_nation = 'MOZAMBIQUE')
+ OR (supp_nation = 'MOZAMBIQUE' and cust_nation = 'PERU');
+
+select
+ supp_nation,
+ cust_nation,
+ l_year,
+ sum(volume) as revenue
+from
+ $j5 as shipping
+group by
+ supp_nation,
+ cust_nation,
+ l_year
+order by
+ supp_nation,
+ cust_nation,
+ l_year;
+
diff --git a/yt/yql/tests/sql/suites/tpch/q8.sql b/yt/yql/tests/sql/suites/tpch/q8.sql
new file mode 100644
index 0000000000..855813a06e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q8.sql
@@ -0,0 +1,110 @@
+
+-- TPC-H/TPC-R National Market Share Query (Q8)
+-- TPC TPC-H Parameter Substitution (Version 2.17.2 build 0)
+-- using 1680793381 as a seed to the RNG
+
+$join1 = (
+select
+ l.l_extendedprice * (1 - l.l_discount) as volume,
+ l.l_suppkey as l_suppkey,
+ l.l_orderkey as l_orderkey
+from
+ plato.part as p
+join
+ plato.lineitem as l
+on
+ p.p_partkey = l.l_partkey
+where
+ p.p_type = 'ECONOMY PLATED COPPER'
+);
+$join2 = (
+select
+ j.volume as volume,
+ j.l_orderkey as l_orderkey,
+ s.s_nationkey as s_nationkey
+from
+ $join1 as j
+join
+ plato.supplier as s
+on
+ s.s_suppkey = j.l_suppkey
+);
+$join3 = (
+select
+ j.volume as volume,
+ j.l_orderkey as l_orderkey,
+ n.n_name as nation
+from
+ $join2 as j
+join
+ plato.nation as n
+on
+ n.n_nationkey = j.s_nationkey
+);
+$join4 = (
+select
+ j.volume as volume,
+ j.nation as nation,
+ DateTime::GetYear(cast(o.o_orderdate as Timestamp)) as o_year,
+ o.o_custkey as o_custkey
+from
+ $join3 as j
+join
+ plato.orders as o
+on
+ o.o_orderkey = j.l_orderkey
+where cast(cast(o_orderdate as Timestamp) as Date) between Date('1995-01-01') and Date('1996-12-31')
+);
+$join5 = (
+select
+ j.volume as volume,
+ j.nation as nation,
+ j.o_year as o_year,
+ c.c_nationkey as c_nationkey
+from
+ $join4 as j
+join
+ plato.customer as c
+on
+ c.c_custkey = j.o_custkey
+);
+$join6 = (
+select
+ j.volume as volume,
+ j.nation as nation,
+ j.o_year as o_year,
+ n.n_regionkey as n_regionkey
+from
+ $join5 as j
+join
+ plato.nation as n
+on
+ n.n_nationkey = j.c_nationkey
+);
+$join7 = (
+select
+ j.volume as volume,
+ j.nation as nation,
+ j.o_year as o_year
+from
+ $join6 as j
+join
+ plato.region as r
+on
+ r.r_regionkey = j.n_regionkey
+where
+ r.r_name = 'AFRICA'
+);
+
+select
+ o_year,
+ sum(case
+ when nation = 'MOZAMBIQUE' then volume
+ else 0
+ end) / sum(volume) as mkt_share
+from
+ $join7 as all_nations
+group by
+ o_year
+order by
+ o_year;
diff --git a/yt/yql/tests/sql/suites/tpch/q9.sql b/yt/yql/tests/sql/suites/tpch/q9.sql
new file mode 100644
index 0000000000..f6c9f914ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/q9.sql
@@ -0,0 +1,59 @@
+
+-- TPC-H/TPC-R Product Type Profit Measure Query (Q9)
+-- Approved February 1998
+-- using 1680793381 as a seed to the RNG
+
+$p = (select p_partkey, p_name
+from
+ plato.part
+where FIND(p_name, 'rose') IS NOT NULL);
+
+$j1 = (select ps_partkey, ps_suppkey, ps_supplycost
+from
+ plato.partsupp as ps
+join $p as p
+on ps.ps_partkey = p.p_partkey);
+
+$j2 = (select l_suppkey, l_partkey, l_orderkey, l_extendedprice, l_discount, ps_supplycost, l_quantity
+from
+ plato.lineitem as l
+join $j1 as j
+on l.l_suppkey = j.ps_suppkey AND l.l_partkey = j.ps_partkey);
+
+$j3 = (select l_orderkey, s_nationkey, l_extendedprice, l_discount, ps_supplycost, l_quantity
+from
+ plato.supplier as s
+join $j2 as j
+on j.l_suppkey = s.s_suppkey);
+
+$j4 = (select o_orderdate, l_extendedprice, l_discount, ps_supplycost, l_quantity, s_nationkey
+from
+ plato.orders as o
+join $j3 as j
+on o.o_orderkey = j.l_orderkey);
+
+$j5 = (select n_name, o_orderdate, l_extendedprice, l_discount, ps_supplycost, l_quantity
+from
+ plato.nation as n
+join $j4 as j
+on j.s_nationkey = n.n_nationkey
+);
+
+$profit = (select
+ n_name as nation,
+ DateTime::GetYear(cast(o_orderdate as timestamp)) as o_year,
+ l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount
+from $j5);
+
+select
+ nation,
+ o_year,
+ sum(amount) as sum_profit
+from $profit
+group by
+ nation,
+ o_year
+order by
+ nation,
+ o_year desc;
+
diff --git a/yt/yql/tests/sql/suites/tpch/region.txt.attr b/yt/yql/tests/sql/suites/tpch/region.txt.attr
new file mode 100644
index 0000000000..daadd6b05b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/region.txt.attr
@@ -0,0 +1,26 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "name" = "r_regionkey";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "int32";
+ "type_v3" = "int32";
+ };
+ {
+ "name" = "r_comment";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "r_name";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/tpch/supplier.txt.attr b/yt/yql/tests/sql/suites/tpch/supplier.txt.attr
new file mode 100644
index 0000000000..cc250b2226
--- /dev/null
+++ b/yt/yql/tests/sql/suites/tpch/supplier.txt.attr
@@ -0,0 +1,50 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "name" = "s_suppkey";
+ "required" = %true;
+ "sort_order" = "ascending";
+ "type" = "int32";
+ "type_v3" = "int32";
+ };
+ {
+ "name" = "s_comment";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "s_address";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "s_acctbal";
+ "required" = %true;
+ "type" = "double";
+ "type_v3" = "double";
+ };
+ {
+ "name" = "s_nationkey";
+ "required" = %true;
+ "type" = "int32";
+ "type_v3" = "int32";
+ };
+ {
+ "name" = "s_name";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ {
+ "name" = "s_phone";
+ "required" = %true;
+ "type" = "string";
+ "type_v3" = "string";
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/type_literal/create_table.sql b/yt/yql/tests/sql/suites/type_literal/create_table.sql
new file mode 100644
index 0000000000..de2d80bf98
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_literal/create_table.sql
@@ -0,0 +1,80 @@
+/* syntax version 1 */
+/* do not execute */
+
+create table plato.Output (
+ c_void Void,
+ c_unit Unit,
+ c_bool Bool,
+
+ c_uint8 Uint8,
+ c_uint16 Uint16,
+ c_uint32 Uint32 NOT NULL,
+ c_uint64 Uint64 NOT NULL,
+
+ c_int8 int8,
+ c_int16 int16,
+ c_int32 int32,
+ c_int64 int64,
+
+ c_tinyint TINYINT,
+ c_smallint SMALLINT,
+ c_int INT,
+ c_integer INTEGER,
+ c_bigint BIGINT,
+
+ c_float float,
+ c_double double,
+
+ c_string String,
+ c_varchar Varchar,
+ c_utf8 Utf8,
+ c_yson Yson,
+ c_json Json,
+ c_uuid Uuid,
+
+ c_date Date,
+ c_datetime Datetime,
+ c_timestamp Timestamp,
+ c_interval Interval,
+ c_tzdate TzDate,
+ c_tzdatetime TzDatetime,
+ c_tztimestamp TzTimestamp,
+
+ c_decimal0 Decimal(20, 10),
+
+ c_optional0 Optional<string>,
+ c_optional1 string ?,
+ c_optional2 string??,
+ c_optional3 string? ? ?,
+ c_optional4 optional<string>?,
+
+ c_tuple Tuple< bool, uint64 >,
+ c_struct Struct< foo:string, 'bar':float >,
+ c_variant1 Variant< int, bool >,
+ c_variant2 Variant< foo:int, "bar":bool >,
+
+ c_list List<Yson>,
+ c_stream Stream<Date>,
+ c_flow Flow<Uuid>,
+ c_dict Dict<string, interval>,
+ c_set Set<TzTimestamp>,
+ c_enum Enum< first, second, third >,
+
+ c_resource0 Resource<'foo'>,
+ c_resource1 Resource<bar>,
+
+ c_tagged Tagged<Uint64, 'tag'>,
+ c_generic Generic,
+
+ c_sometype0 set<list<dict<string, int??>?>>,
+
+ c_callable0 Callable<()->bool>,
+ c_callable1 Callable<(int32)->int8>,
+ c_callable2 Callable<(int32, string)->float>,
+ c_callable3 Callable<(int32, foo : string)->float>,
+ c_callable4 Callable<(foo : int32, bar : string)->float>,
+ c_callable5 Callable<([foo : int32, bar : string])->float>,
+ c_callable6 Callable<(foo : int32, [bar : string])->float>,
+ c_callable7 Callable<(foo : int32, bar : optional<string>)->float?>,
+ c_callable8 Callable<(foo : int32{automap}, bar : string{Automap})->float>
+);
diff --git a/yt/yql/tests/sql/suites/type_literal/declare.sql b/yt/yql/tests/sql/suites/type_literal/declare.sql
new file mode 100644
index 0000000000..4454e4d97d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_literal/declare.sql
@@ -0,0 +1,82 @@
+/* syntax version 1 */
+/* do not execute */
+
+declare $c_void as Void;
+declare $c_unit as Unit;
+declare $c_bool as Bool;
+
+declare $c_uint8 as Uint8;
+declare $c_uint16 as Uint16;
+declare $c_uint32 as Uint32;
+declare $c_uint64 as Uint64;
+
+declare $c_int8 as int8;
+declare $c_int16 as int16;
+declare $c_int32 as int32;
+declare $c_int64 as int64;
+
+declare $c_tinyint as TINYINT;
+declare $c_smallint as SMALLINT;
+declare $c_int as INT;
+declare $c_integer as INTEGER;
+declare $c_bigint as BIGINT;
+
+declare $c_float as float;
+declare $c_double as double;
+
+declare $c_string as String;
+declare $c_varchar as Varchar;
+declare $c_utf8 as Utf8;
+declare $c_yson as Yson;
+declare $c_json as Json;
+declare $c_uuid as Uuid;
+
+declare $c_date as Date;
+declare $c_datetime as Datetime;
+declare $c_timestamp as Timestamp;
+declare $c_interval as Interval;
+declare $c_tzdate as TzDate;
+declare $c_tzdatetime as TzDatetime;
+declare $c_tztimestamp as TzTimestamp;
+
+declare $c_decimal0 as Decimal(20, 10);
+
+declare $c_optional0 as Optional<string>;
+declare $c_optional1 as string ?;
+declare $c_optional2 as string??;
+declare $c_optional3 as string? ? ?;
+declare $c_optional4 as optional<string>?;
+
+declare $c_tuple as Tuple< bool, uint64 >;
+declare $c_struct as Struct< foo:string, 'bar':float >;
+declare $c_variant1 as Variant< int, bool >;
+declare $c_variant2 as Variant< foo:int, "bar":bool >;
+
+declare $c_list0 as List<Yson>;
+declare $c_list1 as List<$c_yson>;
+declare $c_stream as Stream<Date>;
+declare $c_flow as Flow<Uuid>;
+declare $c_dict as Dict<string, interval>;
+declare $c_set as Set<TzTimestamp>;
+declare $c_enum as Enum<'first', 'second', 'third'>;
+
+declare $c_resource0 as Resource<'foo'>;
+declare $c_resource1 as Resource<bar>;
+declare $resource as string;
+declare $c_resource2 as Resource<$resource>;
+
+declare $c_tagged as Tagged<Uint64, 'tag'>;
+declare $c_generic as Generic;
+
+declare $c_sometype0 as set<list<dict<string, int??>?>>;
+
+declare $c_callable0 as Callable<()->bool>;
+declare $c_callable1 as Callable<(int32)->int8>;
+declare $c_callable2 as Callable<(int32, string)->float>;
+declare $c_callable3 as Callable<(int32, foo : string)->float>;
+declare $c_callable4 as Callable<(foo : int32, bar : string)->float>;
+declare $c_callable5 as Callable<([foo : int32, bar : string])->float>;
+declare $c_callable6 as Callable<(foo : int32, [bar : string])->float>;
+declare $c_callable7 as Callable<(foo : int32, bar : optional<string>)->float>;
+declare $c_callable8 as Callable<(int32{automap}, foo : string{Automap})->float>;
+
diff --git a/yt/yql/tests/sql/suites/type_literal/default.cfg b/yt/yql/tests/sql/suites/type_literal/default.cfg
new file mode 100644
index 0000000000..00dec6c3f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_literal/default.cfg
@@ -0,0 +1 @@
+res result.txt
diff --git a/yt/yql/tests/sql/suites/type_v3/append_diff_flags.cfg b/yt/yql/tests/sql/suites/type_v3/append_diff_flags.cfg
new file mode 100644
index 0000000000..6abe091093
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/append_diff_flags.cfg
@@ -0,0 +1,2 @@
+in Input with_datetime.txt yson1
+out Output with_datetime.txt yson1
diff --git a/yt/yql/tests/sql/suites/type_v3/append_diff_flags.sql b/yt/yql/tests/sql/suites/type_v3/append_diff_flags.sql
new file mode 100644
index 0000000000..c6b51727a9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/append_diff_flags.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* multirun can not */
+/* postgres can not */
+use plato;
+
+pragma yt.UseNativeYtTypes="1";
+pragma yt.NativeYtTypeCompatibility="date";
+
+insert into Output
+select key || "a" as key, subkey
+from Input
+order by key;
diff --git a/yt/yql/tests/sql/suites/type_v3/append_diff_layout1.cfg b/yt/yql/tests/sql/suites/type_v3/append_diff_layout1.cfg
new file mode 100644
index 0000000000..f0f076e433
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/append_diff_layout1.cfg
@@ -0,0 +1,4 @@
+in Input native.txt yson1
+out Output1 native1.txt
+out Output2 native1.txt
+out Output3 native_sorted1.txt
diff --git a/yt/yql/tests/sql/suites/type_v3/append_diff_layout1.sql b/yt/yql/tests/sql/suites/type_v3/append_diff_layout1.sql
new file mode 100644
index 0000000000..b90c123c33
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/append_diff_layout1.sql
@@ -0,0 +1,41 @@
+/* multirun can not */
+/* postgres can not */
+use plato;
+
+pragma yt.UseNativeYtTypes="1";
+pragma yt.NativeYtTypeCompatibility="complex";
+
+$udf = YQL::@@(lambda '(x) (block '(
+ (let structType (StructType '('key (DataType 'String)) '('subkey (StructType '('a (DataType 'String)) '('b (OptionalType (DataType 'Int32))) '('c (DataType 'String))))))
+ (let varType (VariantType (TupleType structType structType structType)))
+ (let res (Map x
+ (lambda '(r)
+ (If
+ (Coalesce (> (SafeCast (Member r 'key) (DataType 'Int32)) (Int32 '200)) (Bool 'false))
+ (Variant r '0 varType)
+ (If
+ (Coalesce (< (SafeCast (Member r 'key) (DataType 'Int32)) (Int32 '50)) (Bool 'false))
+ (Variant r '1 varType)
+ (Variant r '2 varType)
+ )
+ )
+ )
+ ))
+ (return res)
+)))@@;
+
+$i, $j, $k = (PROCESS Input USING $udf(TableRows()));
+
+insert into Output1
+select *
+from $i;
+
+insert into Output2
+select *
+from $j
+limit 2;
+
+insert into Output3
+select *
+from $k
+order by key;
diff --git a/yt/yql/tests/sql/suites/type_v3/append_diff_layout2.cfg b/yt/yql/tests/sql/suites/type_v3/append_diff_layout2.cfg
new file mode 100644
index 0000000000..a37f07f0b5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/append_diff_layout2.cfg
@@ -0,0 +1,6 @@
+in Input native_sorted.txt yson1
+out Output1 native1.txt
+out Output2 native1.txt
+out Output3 native_sorted1.txt
+providers yt
+
diff --git a/yt/yql/tests/sql/suites/type_v3/append_diff_layout2.sql b/yt/yql/tests/sql/suites/type_v3/append_diff_layout2.sql
new file mode 100644
index 0000000000..fda6fde3c9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/append_diff_layout2.sql
@@ -0,0 +1,44 @@
+/* multirun can not */
+/* postgres can not */
+use plato;
+
+pragma yt.UseNativeYtTypes="1";
+pragma yt.NativeYtTypeCompatibility="complex";
+
+$udf = YQL::@@(lambda '(x) (block '(
+ (let structType (StructType '('key (DataType 'String)) '('subkey (StructType '('a (DataType 'String)) '('b (OptionalType (DataType 'Int32))) '('c (DataType 'String))))))
+ (let varType (VariantType (TupleType structType structType structType)))
+ (let res (Map x
+ (lambda '(r)
+ (If
+ (Coalesce (> (SafeCast (Member r 'key) (DataType 'Int32)) (Int32 '200)) (Bool 'false))
+ (Variant r '0 varType)
+ (If
+ (Coalesce (< (SafeCast (Member r 'key) (DataType 'Int32)) (Int32 '50)) (Bool 'false))
+ (Variant r '1 varType)
+ (Variant r '2 varType)
+ )
+ )
+ )
+ ))
+ (return res)
+)))@@;
+
+$i, $j, $k = (PROCESS Input USING $udf(TableRows()));
+
+insert into Output1
+select *
+from $i;
+
+insert into Output2
+select *
+from $j
+limit 2;
+
+insert into Output3
+select *
+from $k;
+
+insert into Output3
+select *
+from $j;
diff --git a/yt/yql/tests/sql/suites/type_v3/append_struct.sql b/yt/yql/tests/sql/suites/type_v3/append_struct.sql
new file mode 100644
index 0000000000..20dbb5dbe6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/append_struct.sql
@@ -0,0 +1,21 @@
+/* syntax version 1 */
+/* multirun can not */
+/* postgres can not */
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) == 10 */
+use plato;
+
+pragma yt.UseNativeYtTypes="1";
+insert into Input
+select "10" as key, <|a:"10", b:Just(10), c:"e"|> as subkey;
+
+commit;
+
+insert into Input
+select * from Input where key > "100";
+
+insert into Input
+select * from Input where key <= "100";
+
+commit;
+
+select * from Input;
diff --git a/yt/yql/tests/sql/suites/type_v3/decimal.txt.attr b/yt/yql/tests/sql/suites/type_v3/decimal.txt.attr
new file mode 100644
index 0000000000..ecf2741d59
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/decimal.txt.attr
@@ -0,0 +1,37 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "type" = "string";
+ "required" = %true;
+ "name" = "decimal-9-2";
+ "type_v3" = {
+ "type_name" = "decimal";
+ "precision" = 9;
+ "scale" = 2
+ };
+ };
+ {
+ "type" = "string";
+ "required" = %true;
+ "name" = "decimal-18-2";
+ "type_v3" = {
+ "type_name" = "decimal";
+ "precision" = 18;
+ "scale" = 2
+ };
+ };
+ {
+ "type" = "string";
+ "required" = %true;
+ "name" = "decimal-35-2";
+ "type_v3" = {
+ "type_name" = "decimal";
+ "precision" = 35;
+ "scale" = 2
+ };
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/type_v3/decimal_yt.cfg b/yt/yql/tests/sql/suites/type_v3/decimal_yt.cfg
new file mode 100644
index 0000000000..de341b36d1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/decimal_yt.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+out Output output.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/type_v3/decimal_yt.sql b/yt/yql/tests/sql/suites/type_v3/decimal_yt.sql
new file mode 100644
index 0000000000..16bf6b2d33
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/decimal_yt.sql
@@ -0,0 +1,8 @@
+pragma yt.UseNativeYtTypes = "true";
+insert into plato.Output with truncate
+select
+ Decimal("3.1415", 5, 4), Decimal("2.9999999999", 12, 10), Decimal("2.12345678900876543", 35, 10),
+ Decimal("nan", 5, 4), Decimal("nan", 15, 4), Decimal("nan", 35, 4),
+ Decimal("inf", 5, 4), Decimal("inf", 15, 4), Decimal("inf", 35, 4),
+ Decimal("-inf", 5, 4), Decimal("-inf", 15, 4), Decimal("-inf", 35, 4)
+; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/type_v3/decimal_yt_llvm.cfg b/yt/yql/tests/sql/suites/type_v3/decimal_yt_llvm.cfg
new file mode 100644
index 0000000000..0736d65621
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/decimal_yt_llvm.cfg
@@ -0,0 +1 @@
+in Input decimal.txt yson1
diff --git a/yt/yql/tests/sql/suites/type_v3/decimal_yt_llvm.sql b/yt/yql/tests/sql/suites/type_v3/decimal_yt_llvm.sql
new file mode 100644
index 0000000000..093c45369c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/decimal_yt_llvm.sql
@@ -0,0 +1,24 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+pragma yt.UseNativeYtTypes="1";
+
+pragma config.flags("LLVM", "");
+
+insert into @a
+select * from (
+ select Decimal("3.14",3,2) as d3, Decimal("2.9999999999",12,10) as d12, Decimal("2.12345678900876543",35,10) as d35
+ union all
+ select Decimal("inf",3,2) as d3, Decimal("inf",12,10) as d12, Decimal("inf",35,10) as d35
+ union all
+ select Decimal("-inf",3,2) as d3, Decimal("-inf",12,10) as d12, Decimal("-inf",35,10) as d35
+ union all
+ select Decimal("nan",3,2) as d3, Decimal("nan",12,10) as d12, Decimal("nan",35,10) as d35
+);
+
+commit;
+
+select * from @a where d3 != Decimal("5.3",3,2);
+
+select * from Input;
diff --git a/yt/yql/tests/sql/suites/type_v3/decimal_yt_nollvm.cfg b/yt/yql/tests/sql/suites/type_v3/decimal_yt_nollvm.cfg
new file mode 100644
index 0000000000..0736d65621
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/decimal_yt_nollvm.cfg
@@ -0,0 +1 @@
+in Input decimal.txt yson1
diff --git a/yt/yql/tests/sql/suites/type_v3/decimal_yt_nollvm.sql b/yt/yql/tests/sql/suites/type_v3/decimal_yt_nollvm.sql
new file mode 100644
index 0000000000..ee7de28816
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/decimal_yt_nollvm.sql
@@ -0,0 +1,24 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+pragma yt.UseNativeYtTypes="1";
+
+pragma config.flags("LLVM", "OFF");
+
+insert into @a
+select * from (
+ select Decimal("3.14",3,2) as d3, Decimal("2.9999999999",12,10) as d12, Decimal("2.12345678900876543",35,10) as d35
+ union all
+ select Decimal("inf",3,2) as d3, Decimal("inf",12,10) as d12, Decimal("inf",35,10) as d35
+ union all
+ select Decimal("-inf",3,2) as d3, Decimal("-inf",12,10) as d12, Decimal("-inf",35,10) as d35
+ union all
+ select Decimal("nan",3,2) as d3, Decimal("nan",12,10) as d12, Decimal("nan",35,10) as d35
+);
+
+commit;
+
+select * from @a where d3 != Decimal("5.3",3,2);
+
+select * from Input;
diff --git a/yt/yql/tests/sql/suites/type_v3/default.cfg b/yt/yql/tests/sql/suites/type_v3/default.cfg
new file mode 100644
index 0000000000..c776db379d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/default.cfg
@@ -0,0 +1 @@
+in Input native.txt
diff --git a/yt/yql/tests/sql/suites/type_v3/float.cfg b/yt/yql/tests/sql/suites/type_v3/float.cfg
new file mode 100644
index 0000000000..4e524d6239
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/float.cfg
@@ -0,0 +1 @@
+in Output output.txt
diff --git a/yt/yql/tests/sql/suites/type_v3/float.sql b/yt/yql/tests/sql/suites/type_v3/float.sql
new file mode 100644
index 0000000000..47d35cc437
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/float.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+pragma yt.UseNativeYtTypes="1";
+
+insert into Output
+select * from (
+ select Float("3.14") as f
+ union all
+ select Float("1.2") as f
+);
+
+commit;
+
+select * from Output where f != Float("5.3");
diff --git a/yt/yql/tests/sql/suites/type_v3/float.txt.attr b/yt/yql/tests/sql/suites/type_v3/float.txt.attr
new file mode 100644
index 0000000000..14512b014a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/float.txt.attr
@@ -0,0 +1,17 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "type_v3" = "string";
+ "required" = %true;
+ "name" = "key";
+ };
+ {
+ "type_v3" = "float";
+ "required" = %true;
+ "name" = "subkey";
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/type_v3/ignore_v3_hint-opt.cfg b/yt/yql/tests/sql/suites/type_v3/ignore_v3_hint-opt.cfg
new file mode 100644
index 0000000000..5b9fbdcfe1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/ignore_v3_hint-opt.cfg
@@ -0,0 +1,3 @@
+in Input native_opt.txt
+udf protobuf_udf
+udf yson2_udf
diff --git a/yt/yql/tests/sql/suites/type_v3/ignore_v3_hint-protofield.cfg b/yt/yql/tests/sql/suites/type_v3/ignore_v3_hint-protofield.cfg
new file mode 100644
index 0000000000..cb1a9077b7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/ignore_v3_hint-protofield.cfg
@@ -0,0 +1,3 @@
+in Input native_proto.txt
+udf protobuf_udf
+udf yson2_udf
diff --git a/yt/yql/tests/sql/suites/type_v3/ignore_v3_hint-tag_opt.cfg b/yt/yql/tests/sql/suites/type_v3/ignore_v3_hint-tag_opt.cfg
new file mode 100644
index 0000000000..895395a8e9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/ignore_v3_hint-tag_opt.cfg
@@ -0,0 +1,3 @@
+in Input native_tag_opt.txt
+udf protobuf_udf
+udf yson2_udf
diff --git a/yt/yql/tests/sql/suites/type_v3/ignore_v3_hint.cfg b/yt/yql/tests/sql/suites/type_v3/ignore_v3_hint.cfg
new file mode 100644
index 0000000000..4d28bce293
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/ignore_v3_hint.cfg
@@ -0,0 +1,2 @@
+in Input native.txt
+udf yson2_udf
diff --git a/yt/yql/tests/sql/suites/type_v3/ignore_v3_hint.sql b/yt/yql/tests/sql/suites/type_v3/ignore_v3_hint.sql
new file mode 100644
index 0000000000..6026251f49
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/ignore_v3_hint.sql
@@ -0,0 +1,8 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+select
+ key,
+ Yson::LookupString(subkey, "a") as a,
+from Input with ignore_type_v3; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/type_v3/ignore_v3_pragma.cfg b/yt/yql/tests/sql/suites/type_v3/ignore_v3_pragma.cfg
new file mode 100644
index 0000000000..4d28bce293
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/ignore_v3_pragma.cfg
@@ -0,0 +1,2 @@
+in Input native.txt
+udf yson2_udf
diff --git a/yt/yql/tests/sql/suites/type_v3/ignore_v3_pragma.sql b/yt/yql/tests/sql/suites/type_v3/ignore_v3_pragma.sql
new file mode 100644
index 0000000000..9e04d09cb9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/ignore_v3_pragma.sql
@@ -0,0 +1,10 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+pragma yt.IgnoreTypeV3;
+
+select
+ key,
+ Yson::LookupString(subkey, "a") as a,
+from Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/type_v3/insert_struct_v3_with_native.cfg b/yt/yql/tests/sql/suites/type_v3/insert_struct_v3_with_native.cfg
new file mode 100644
index 0000000000..d381049510
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/insert_struct_v3_with_native.cfg
@@ -0,0 +1,3 @@
+in Input1 native.txt
+in Input2 native1.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/type_v3/insert_struct_v3_with_native.sql b/yt/yql/tests/sql/suites/type_v3/insert_struct_v3_with_native.sql
new file mode 100644
index 0000000000..1a8440f48c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/insert_struct_v3_with_native.sql
@@ -0,0 +1,25 @@
+/* syntax version 1 */
+/* multirun can not */
+/* postgres can not */
+/* kikimr can not */
+use plato;
+
+pragma yt.UseNativeYtTypes="1";
+
+insert into @a with truncate
+select * from concat(Input1, Input2);
+
+commit;
+
+insert into @a with truncate
+select * from Input1;
+
+commit;
+
+insert into @a
+select * from Input2;
+
+commit;
+
+insert into @a
+select * from concat(Input1, Input2);
diff --git a/yt/yql/tests/sql/suites/type_v3/insert_struct_v3_wo_native.cfg b/yt/yql/tests/sql/suites/type_v3/insert_struct_v3_wo_native.cfg
new file mode 100644
index 0000000000..d381049510
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/insert_struct_v3_wo_native.cfg
@@ -0,0 +1,3 @@
+in Input1 native.txt
+in Input2 native1.txt
+out Output output.txt
diff --git a/yt/yql/tests/sql/suites/type_v3/insert_struct_v3_wo_native.sql b/yt/yql/tests/sql/suites/type_v3/insert_struct_v3_wo_native.sql
new file mode 100644
index 0000000000..f2812ad5ce
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/insert_struct_v3_wo_native.sql
@@ -0,0 +1,25 @@
+/* syntax version 1 */
+/* multirun can not */
+/* postgres can not */
+/* kikimr can not */
+use plato;
+
+pragma yt.UseNativeYtTypes="0";
+
+insert into Output with truncate
+select * from concat(Input1, Input2);
+
+commit;
+
+insert into Output with truncate
+select * from Input1;
+
+commit;
+
+insert into Output
+select * from Input2;
+
+commit;
+
+insert into Output
+select * from concat(Input1, Input2);
diff --git a/yt/yql/tests/sql/suites/type_v3/json.cfg b/yt/yql/tests/sql/suites/type_v3/json.cfg
new file mode 100644
index 0000000000..4e524d6239
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/json.cfg
@@ -0,0 +1 @@
+in Output output.txt
diff --git a/yt/yql/tests/sql/suites/type_v3/json.sql b/yt/yql/tests/sql/suites/type_v3/json.sql
new file mode 100644
index 0000000000..33d3b27e10
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/json.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+pragma yt.UseNativeYtTypes="1";
+
+insert into Output
+select * from (
+ select Json(@@{"a": 4.7, "c": "abc"}@@) as j
+ union all
+ select Json(@@{"d": "fff"}@@) as j
+);
+
+commit;
+
+select * from Output where ToBytes(j) != "";
diff --git a/yt/yql/tests/sql/suites/type_v3/mergejoin_with_sort.cfg b/yt/yql/tests/sql/suites/type_v3/mergejoin_with_sort.cfg
new file mode 100644
index 0000000000..8bb3b795de
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/mergejoin_with_sort.cfg
@@ -0,0 +1,2 @@
+in Input1 native.txt
+in Input2 native_sorted.txt
diff --git a/yt/yql/tests/sql/suites/type_v3/mergejoin_with_sort.sql b/yt/yql/tests/sql/suites/type_v3/mergejoin_with_sort.sql
new file mode 100644
index 0000000000..0c579ffd74
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/mergejoin_with_sort.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+pragma yt.JoinMergeTablesLimit="100";
+pragma yt.JoinMergeForce="true";
+
+select a.key as key, a.subkey as s1, b.subkey as s2
+from Input1 as a
+join Input2 as b using(key)
+order by key;
diff --git a/yt/yql/tests/sql/suites/type_v3/mixed.txt.attr b/yt/yql/tests/sql/suites/type_v3/mixed.txt.attr
new file mode 100644
index 0000000000..27e89f554e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/mixed.txt.attr
@@ -0,0 +1,40 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "name" = "dt";
+ "required" = %true;
+ "type" = "date";
+ "type_v3" = "date";
+ };
+ {
+ "name" = "dt_yson";
+ "required" = %false;
+ "type" = "any";
+ "type_v3" = {
+ "type_name" = "optional";
+ "item" = "yson";
+ };
+ };
+ {
+ "name" = "lst";
+ "required" = %true;
+ "type" = "any";
+ "type_v3" = {
+ "type_name" = "list";
+ "item" = "int32";
+ };
+ };
+ {
+ "name" = "lst_yson";
+ "required" = %false;
+ "type" = "any";
+ "type_v3" = {
+ "type_name" = "optional";
+ "item" = "yson";
+ };
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/type_v3/mixed_with_columns.cfg b/yt/yql/tests/sql/suites/type_v3/mixed_with_columns.cfg
new file mode 100644
index 0000000000..66d8ecc478
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/mixed_with_columns.cfg
@@ -0,0 +1 @@
+in Input mixed.txt
diff --git a/yt/yql/tests/sql/suites/type_v3/mixed_with_columns.sql b/yt/yql/tests/sql/suites/type_v3/mixed_with_columns.sql
new file mode 100644
index 0000000000..1092d16c3b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/mixed_with_columns.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+use plato;
+
+select dt_yson, lst_yson, dt, lst from Input
+with columns Struct<lst_yson: List<int32>?,dt_yson:Date?>; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/type_v3/native.txt.attr b/yt/yql/tests/sql/suites/type_v3/native.txt.attr
new file mode 100644
index 0000000000..9ec4ef5162
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/native.txt.attr
@@ -0,0 +1,36 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "type_v3" = "string";
+ "required" = %true;
+ "name" = "key";
+ };
+ {
+ "type_v3" = {
+ "type_name" = "struct";
+ "members" = [
+ {
+ "type" = {
+ "type_name" = "optional";
+ "item" = "int32";
+ };
+ "name" = "b";
+ };
+ {
+ "type" = "string";
+ "name" = "a";
+ };
+ {
+ "type" = "string";
+ "name" = "c";
+ };
+ ];
+ };
+ "required" = %true;
+ "name" = "subkey";
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/type_v3/native1.txt.attr b/yt/yql/tests/sql/suites/type_v3/native1.txt.attr
new file mode 100644
index 0000000000..69b61addb6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/native1.txt.attr
@@ -0,0 +1,36 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "type_v3" = "string";
+ "required" = %true;
+ "name" = "key";
+ };
+ {
+ "type_v3" = {
+ "type_name" = "struct";
+ "members" = [
+ {
+ "type" = {
+ "type_name" = "optional";
+ "item" = "int32";
+ };
+ "name" = "b";
+ };
+ {
+ "type" = "string";
+ "name" = "c";
+ };
+ {
+ "type" = "string";
+ "name" = "a";
+ };
+ ];
+ };
+ "required" = %true;
+ "name" = "subkey";
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/type_v3/native_opt.txt.attr b/yt/yql/tests/sql/suites/type_v3/native_opt.txt.attr
new file mode 100644
index 0000000000..e6dfe29775
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/native_opt.txt.attr
@@ -0,0 +1,39 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "type_v3" = "string";
+ "required" = %true;
+ "name" = "key";
+ };
+ {
+ "type_v3" = {
+ "type_name" = "optional";
+ "item" = {
+ "type_name" = "struct";
+ "members" = [
+ {
+ "type" = {
+ "type_name" = "optional";
+ "item" = "int32";
+ };
+ "name" = "b";
+ };
+ {
+ "type" = "string";
+ "name" = "c";
+ };
+ {
+ "type" = "string";
+ "name" = "a";
+ };
+ ];
+ };
+ };
+ "required" = %false;
+ "name" = "subkey";
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/type_v3/native_proto.txt.attr b/yt/yql/tests/sql/suites/type_v3/native_proto.txt.attr
new file mode 100644
index 0000000000..6d2ac56a57
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/native_proto.txt.attr
@@ -0,0 +1,37 @@
+{
+ "_yql_proto_field_key"="{\"name\":\"TA\",\"meta\":\"H4sIAAAAAAAAA42Puw6CQBBFszw0DEp0Y4E2GmyolriJHyAPS6rVflFMTBCUR8Hn+KcuD0ui3WRy59wzcIJ1co9yntfOM8/KLKpuTv1KnKp0rqTdWBQk5uM5SEFhKhvZNqhKmE8CPAHF5yU30QbZmqUDCvAIpONuhmA/jL30WCywXsMI+SPuGJAOn0XdGVZDFhfl6qf1VuBdPAX1zJOq46vYAOSbkhh1Kosf4I2GC/mfhb3YcOD78EoYHfACkNva6FQjLZow11rCmJ3SqoivjaPXB4Sj9wEBmoL3ogEAAA==\",\"lists\":{\"optional\":true}}";
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "type_v3" = "string";
+ "required" = %true;
+ "name" = "key";
+ };
+ {
+ "type_v3" = {
+ "type_name" = "struct";
+ "members" = [
+ {
+ "type" = {
+ "type_name" = "optional";
+ "item" = "int32";
+ };
+ "name" = "b";
+ };
+ {
+ "type" = "string";
+ "name" = "a";
+ };
+ {
+ "type" = "string";
+ "name" = "c";
+ };
+ ];
+ };
+ "required" = %true;
+ "name" = "subkey";
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/type_v3/native_sorted.txt.attr b/yt/yql/tests/sql/suites/type_v3/native_sorted.txt.attr
new file mode 100644
index 0000000000..e09d645e5e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/native_sorted.txt.attr
@@ -0,0 +1,37 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "type_v3" = "string";
+ "required" = %true;
+ "name" = "key";
+ "sort_order" = "ascending";
+ };
+ {
+ "type_v3" = {
+ "type_name" = "struct";
+ "members" = [
+ {
+ "type" = {
+ "type_name" = "optional";
+ "item" = "int32";
+ };
+ "name" = "b";
+ };
+ {
+ "type" = "string";
+ "name" = "a";
+ };
+ {
+ "type" = "string";
+ "name" = "c";
+ };
+ ];
+ };
+ "required" = %true;
+ "name" = "subkey";
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/type_v3/native_sorted1.txt.attr b/yt/yql/tests/sql/suites/type_v3/native_sorted1.txt.attr
new file mode 100644
index 0000000000..5e4d231c78
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/native_sorted1.txt.attr
@@ -0,0 +1,37 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "type_v3" = "string";
+ "required" = %true;
+ "name" = "key";
+ "sort_order" = "ascending";
+ };
+ {
+ "type_v3" = {
+ "type_name" = "struct";
+ "members" = [
+ {
+ "type" = {
+ "type_name" = "optional";
+ "item" = "int32";
+ };
+ "name" = "b";
+ };
+ {
+ "type" = "string";
+ "name" = "c";
+ };
+ {
+ "type" = "string";
+ "name" = "a";
+ };
+ ];
+ };
+ "required" = %true;
+ "name" = "subkey";
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/type_v3/native_tag_opt.txt.attr b/yt/yql/tests/sql/suites/type_v3/native_tag_opt.txt.attr
new file mode 100644
index 0000000000..d8710922f6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/native_tag_opt.txt.attr
@@ -0,0 +1,43 @@
+{
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "type_v3" = "string";
+ "required" = %true;
+ "name" = "key";
+ };
+ {
+ "type_v3" = {
+ "type_name" = "tagged";
+ "tag" = "tag";
+ "item" = {
+ "type_name" = "optional";
+ "item" = {
+ "type_name" = "struct";
+ "members" = [
+ {
+ "type" = {
+ "type_name" = "optional";
+ "item" = "int32";
+ };
+ "name" = "b";
+ };
+ {
+ "type" = "string";
+ "name" = "c";
+ };
+ {
+ "type" = "string";
+ "name" = "a";
+ };
+ ];
+ };
+ };
+ };
+ "required" = %false;
+ "name" = "subkey";
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/type_v3/non_strict.cfg b/yt/yql/tests/sql/suites/type_v3/non_strict.cfg
new file mode 100644
index 0000000000..b5f401ea5c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/non_strict.cfg
@@ -0,0 +1,2 @@
+in Input other.txt
+in Output output.txt
diff --git a/yt/yql/tests/sql/suites/type_v3/non_strict.sql b/yt/yql/tests/sql/suites/type_v3/non_strict.sql
new file mode 100644
index 0000000000..d9900ca7a5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/non_strict.sql
@@ -0,0 +1,12 @@
+/* syntax version 1 */
+/* multirun can not */
+/* postgres can not */
+use plato;
+
+pragma yt.UseNativeYtTypes="1";
+pragma yt.NativeYtTypeCompatibility="complex";
+
+insert into Output
+select t.*, CAST(TableRecordIndex() as UInt64) as record_idx
+from Input as t
+order by record_idx;
diff --git a/yt/yql/tests/sql/suites/type_v3/other.txt.attr b/yt/yql/tests/sql/suites/type_v3/other.txt.attr
new file mode 100644
index 0000000000..49d98771a8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/other.txt.attr
@@ -0,0 +1,17 @@
+{
+ "_read_schema" = <"strict" = %false>[
+ {"type"="string";"name"="key"};
+ {"type"="string";"name"="subkey"};
+ ];
+ "schema" = <"strict" = %false; "unique_keys" = %false>
+ [
+ {
+ "name" = "key";
+ "type" = "string"
+ };
+ {
+ "name" = "subkey";
+ "type" = "string"
+ }
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/type_v3/replace_diff_layout.cfg b/yt/yql/tests/sql/suites/type_v3/replace_diff_layout.cfg
new file mode 100644
index 0000000000..f88f151e72
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/replace_diff_layout.cfg
@@ -0,0 +1,4 @@
+in Input native_sorted.txt yson1
+out Output1 native.txt
+out Output2 native1.txt
+out Output3 native_sorted1.txt
diff --git a/yt/yql/tests/sql/suites/type_v3/replace_diff_layout.sql b/yt/yql/tests/sql/suites/type_v3/replace_diff_layout.sql
new file mode 100644
index 0000000000..e3e62f71cc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/replace_diff_layout.sql
@@ -0,0 +1,40 @@
+/* multirun can not */
+/* postgres can not */
+use plato;
+
+pragma yt.UseNativeYtTypes="1";
+pragma yt.NativeYtTypeCompatibility="complex";
+
+$udf = YQL::@@(lambda '(x) (block '(
+ (let structType (StructType '('key (DataType 'String)) '('subkey (StructType '('a (DataType 'String)) '('b (OptionalType (DataType 'Int32))) '('c (DataType 'String))))))
+ (let varType (VariantType (TupleType structType structType structType)))
+ (let res (Map x
+ (lambda '(r)
+ (If
+ (Coalesce (> (SafeCast (Member r 'key) (DataType 'Int32)) (Int32 '200)) (Bool 'false))
+ (Variant r '0 varType)
+ (If
+ (Coalesce (< (SafeCast (Member r 'key) (DataType 'Int32)) (Int32 '50)) (Bool 'false))
+ (Variant r '1 varType)
+ (Variant r '2 varType)
+ )
+ )
+ )
+ ))
+ (return res)
+)))@@;
+
+$i, $j, $k = (PROCESS Input USING $udf(TableRows()));
+
+insert into Output1 with (truncate, keepmeta)
+select *
+from $i;
+
+insert into Output2 with (truncate, keepmeta)
+select *
+from $j
+limit 2;
+
+insert into Output3 with (truncate, keepmeta)
+select *
+from $k;
diff --git a/yt/yql/tests/sql/suites/type_v3/singulars.cfg b/yt/yql/tests/sql/suites/type_v3/singulars.cfg
new file mode 100644
index 0000000000..bb349dd8ab
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/singulars.cfg
@@ -0,0 +1 @@
+providers yt
diff --git a/yt/yql/tests/sql/suites/type_v3/singulars.sql b/yt/yql/tests/sql/suites/type_v3/singulars.sql
new file mode 100644
index 0000000000..0f6e789c43
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/singulars.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+use plato;
+
+pragma yt.UseNativeYtTypes="1";
+pragma yt.NativeYtTypeCompatibility="null;void";
+
+INSERT INTO @tmp
+SELECT null AS ttt, Yql::Void AS v
+;
+
+COMMIT;
+SELECT * FROM @tmp
diff --git a/yt/yql/tests/sql/suites/type_v3/split.cfg b/yt/yql/tests/sql/suites/type_v3/split.cfg
new file mode 100644
index 0000000000..356360ad58
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/split.cfg
@@ -0,0 +1,5 @@
+in Input1 float.txt
+in Input2 float.txt
+in Input3 float.txt
+in Output output.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/type_v3/split.sql b/yt/yql/tests/sql/suites/type_v3/split.sql
new file mode 100644
index 0000000000..97045d6e69
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/split.sql
@@ -0,0 +1,6 @@
+USE plato;
+PRAGMA yt.MaxInputTables="2";
+
+insert into Output
+select * from concat(Input1, Input2, Input3);
+
diff --git a/yt/yql/tests/sql/suites/type_v3/type_subset.cfg b/yt/yql/tests/sql/suites/type_v3/type_subset.cfg
new file mode 100644
index 0000000000..382a04dfda
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/type_subset.cfg
@@ -0,0 +1,6 @@
+in Input1 native.txt
+in Input2 native.txt
+in Input3 native.txt
+in Input4 native.txt
+in Output output.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/type_v3/type_subset.sql b/yt/yql/tests/sql/suites/type_v3/type_subset.sql
new file mode 100644
index 0000000000..310fdb303b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/type_subset.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* multirun can not */
+/* postgres can not */
+use plato;
+
+pragma yt.UseNativeYtTypes="1";
+pragma yt.NativeYtTypeCompatibility="complex";
+
+pragma yt.MaxInputTables="2";
+
+insert into Output with truncate
+select
+ key
+from range("")
+where key > "000";
diff --git a/yt/yql/tests/sql/suites/type_v3/uuid.cfg b/yt/yql/tests/sql/suites/type_v3/uuid.cfg
new file mode 100644
index 0000000000..9761526bb7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/uuid.cfg
@@ -0,0 +1 @@
+in Output output.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/type_v3/uuid.sql b/yt/yql/tests/sql/suites/type_v3/uuid.sql
new file mode 100644
index 0000000000..56390c09c1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/uuid.sql
@@ -0,0 +1,23 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+pragma yt.UseNativeYtTypes="1";
+pragma yt.NativeYtTypeCompatibility="uuid";
+
+insert into Output
+select * from (
+ select Uuid("00000000-0000-0000-0000-100000000000")
+ union all
+ select Uuid("00000000-0000-0000-0000-200000000000")
+ union all
+ select Uuid("00000000-0000-0000-0000-400000000000")
+ union all
+ select Uuid("FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF")
+ union all
+ select Uuid("3200ec12-4ded-4f6c-a981-4b0ff18bbdd5")
+);
+
+commit;
+
+select * from Output; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/type_v3/with_datetime.txt.attr b/yt/yql/tests/sql/suites/type_v3/with_datetime.txt.attr
new file mode 100644
index 0000000000..067d81a082
--- /dev/null
+++ b/yt/yql/tests/sql/suites/type_v3/with_datetime.txt.attr
@@ -0,0 +1,29 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key"; ["DataType"; "String"]];
+ ["subkey"; ["DataType"; "Datetime"]];
+ ]];
+ "UseNativeYtTypes" = %true;
+ "SortMembers" = ["key"];
+ "SortedBy" = ["key"];
+ "SortDirections" = [1];
+ "SortedByTypes" = [["DataType";"String"]];
+ };
+ "schema" = <
+ "strict" = %true;
+ "unique_keys" = %false;
+ > [
+ {
+ "type_v3" = "string";
+ "required" = %true;
+ "name" = "key";
+ "sort_order" = "ascending";
+ };
+ {
+ "type_v3" = "datetime";
+ "required" = %true;
+ "name" = "subkey";
+ };
+ ];
+}
diff --git a/yt/yql/tests/sql/suites/udf/default.cfg b/yt/yql/tests/sql/suites/udf/default.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/default.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/udf/named_args_for_script.cfg b/yt/yql/tests/sql/suites/udf/named_args_for_script.cfg
new file mode 100644
index 0000000000..f773dab653
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/named_args_for_script.cfg
@@ -0,0 +1,3 @@
+in Input input_tutorial_users.txt
+udf python3_udf
+
diff --git a/yt/yql/tests/sql/suites/udf/named_args_for_script.sql b/yt/yql/tests/sql/suites/udf/named_args_for_script.sql
new file mode 100644
index 0000000000..523b97853a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/named_args_for_script.sql
@@ -0,0 +1,18 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+$udfScript = @@
+def AppendInfo(a_name, a_age = None, a_region = None):
+ res = a_name.decode('utf-8')
+ if a_age:
+ res += ", age: " + repr(a_age)
+ if a_region:
+ res += ", region: " + repr(a_region)
+ return res.encode('utf-8')
+@@;
+
+$udf = Python3::AppendInfo(Callable<(name:String, [age:Int32?, region:Int32?])->String>, $udfScript);
+
+$data = (select cast(key as int32) as age, cast(subkey as int32) as region, value as name from Input);
+
+select $udf(region as region, name as name) as val from $data;
diff --git a/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs.cfg b/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs.cfg
new file mode 100644
index 0000000000..289c4251bb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf python3_udf
diff --git a/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs.sql b/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs.sql
new file mode 100644
index 0000000000..e393ea92d0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs.sql
@@ -0,0 +1,18 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+$udfScript = @@
+def AppendInfo(a_name, a_age = None, a_region = None):
+ res = a_name.decode('utf-8')
+ if a_age:
+ res += ", age: " + repr(a_age)
+ if a_region:
+ res += ", region: " + repr(a_region)
+ return res.encode('utf-8')
+@@;
+
+$udf = Python3::AppendInfo(Callable<(name:String, [age:Int32?, region:Int32?])->String>, $udfScript);
+
+$data = (select cast(key as int32) as age, cast(subkey as int32) as region, value as name from Input);
+
+select $udf(name, region as region, age as age) as val from $data;
diff --git a/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs2.cfg b/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs2.cfg
new file mode 100644
index 0000000000..289c4251bb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs2.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf python3_udf
diff --git a/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs2.sql b/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs2.sql
new file mode 100644
index 0000000000..bcc8bfebaf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs2.sql
@@ -0,0 +1,18 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+$udfScript = @@
+def AppendInfo(a_name, a_age = None, a_region = None):
+ res = a_name.decode('utf-8')
+ if a_age:
+ res += ", age: " + repr(a_age)
+ if a_region:
+ res += ", region: " + repr(a_region)
+ return res.encode('utf-8')
+@@;
+
+$udf = Python3::AppendInfo(Callable<(name:String, [age:Int32?, region:Int32?])->String>, $udfScript);
+
+$data = (select cast(key as int32) as age, cast(subkey as int32) as region, value as name from Input);
+
+select $udf(name, age, region as region) as val from $data;
diff --git a/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs_reuse_args_fail.cfg b/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs_reuse_args_fail.cfg
new file mode 100644
index 0000000000..0311eba913
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs_reuse_args_fail.cfg
@@ -0,0 +1,3 @@
+xfail
+in Input input_tutorial_users.txt
+udf python3_udf
diff --git a/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs_reuse_args_fail.sql b/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs_reuse_args_fail.sql
new file mode 100644
index 0000000000..7efb78e427
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/named_args_for_script_with_posargs_reuse_args_fail.sql
@@ -0,0 +1,17 @@
+/* custom error:Argument with name age was already used for positional argument #2*/
+use plato;
+$udfScript = @@
+def AppendInfo(a_name, a_age = None, a_region = None):
+ res = a_name.decode('utf-8')
+ if a_age:
+ res += ", age: " + repr(a_age)
+ if a_region:
+ res += ", region: " + repr(a_region)
+ return res.encode('utf-8')
+@@;
+
+$udf = Python3::AppendInfo(Callable<(name:String, [age:Int32?, region:Int32?])->String>, $udfScript);
+
+$data = (select cast(key as int32) as age, cast(subkey as int32) as region, value as name from Input);
+
+select $udf(name, age, age as age) as val from $data; -- age is reused as named after positional
diff --git a/yt/yql/tests/sql/suites/udf/python_script.cfg b/yt/yql/tests/sql/suites/udf/python_script.cfg
new file mode 100644
index 0000000000..289c4251bb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/python_script.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf python3_udf
diff --git a/yt/yql/tests/sql/suites/udf/python_script.py b/yt/yql/tests/sql/suites/udf/python_script.py
new file mode 100644
index 0000000000..29f52fab0c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/python_script.py
@@ -0,0 +1,2 @@
+def AppendNum(s, n):
+ return s + str(n).encode('utf-8')
diff --git a/yt/yql/tests/sql/suites/udf/python_script.sql b/yt/yql/tests/sql/suites/udf/python_script.sql
new file mode 100644
index 0000000000..cb3c5075c9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/python_script.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+$udfScript = @@
+def AppendNum(name, age):
+ return name + str(age).encode('utf-8')
+@@;
+
+$udf = Python3::AppendNum(Callable<(String, Int32?)->String>, $udfScript);
+
+select $udf(value, cast(subkey as Int32)) as val from Input;
diff --git a/yt/yql/tests/sql/suites/udf/python_script_from_file.cfg b/yt/yql/tests/sql/suites/udf/python_script_from_file.cfg
new file mode 100644
index 0000000000..79b7571fec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/python_script_from_file.cfg
@@ -0,0 +1,4 @@
+in Input input.txt
+file python_script.py python_script.py
+udf python2_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/udf/python_script_from_file.sql b/yt/yql/tests/sql/suites/udf/python_script_from_file.sql
new file mode 100644
index 0000000000..259ec838aa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/python_script_from_file.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+$udfScript = FileContent("python_script.py");
+$udf = Python::AppendNum(Callable<(String, Int32?)->String>, $udfScript);
+
+select $udf(value, cast(subkey as Int32)) as value from Input;
diff --git a/yt/yql/tests/sql/suites/udf/python_struct.cfg b/yt/yql/tests/sql/suites/udf/python_struct.cfg
new file mode 100644
index 0000000000..3c11f9c54b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/python_struct.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+udf python3_udf
+providers yt
diff --git a/yt/yql/tests/sql/suites/udf/python_struct.sql b/yt/yql/tests/sql/suites/udf/python_struct.sql
new file mode 100644
index 0000000000..82e43427d2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/python_struct.sql
@@ -0,0 +1,23 @@
+/* postgres can not */
+use plato;
+
+$udf = YQL::@@(block '(
+ (let $udfScript (String '@@@@
+class Person:
+ def __init__(self, name, age):
+ self.name = name
+ self.age = age
+
+def NewPerson(name, age):
+ return Person(name, age)
+@@@@))
+ (let ui32 (DataType 'Uint32))
+ (let str (DataType 'String))
+ (let personType (StructType '('name str) '('age ui32)))
+ (let udfType (CallableType '() '(personType) '(str) '(ui32)))
+ (let udf (ScriptUdf 'Python3 'NewPerson udfType $udfScript))
+ (return udf)
+))@@;
+
+$persons = (select $udf(value, 100) as val from Input);
+select val from $persons;
diff --git a/yt/yql/tests/sql/suites/udf/regexp_udf.cfg b/yt/yql/tests/sql/suites/udf/regexp_udf.cfg
new file mode 100644
index 0000000000..ce7c51a32a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/regexp_udf.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf pire_udf
diff --git a/yt/yql/tests/sql/suites/udf/regexp_udf.sql b/yt/yql/tests/sql/suites/udf/regexp_udf.sql
new file mode 100644
index 0000000000..f3fba96738
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/regexp_udf.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+$regexp = Pire::Match("q.*");
+select * from plato.Input where $regexp(value);
diff --git a/yt/yql/tests/sql/suites/udf/two_regexps.cfg b/yt/yql/tests/sql/suites/udf/two_regexps.cfg
new file mode 100644
index 0000000000..ce7c51a32a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/two_regexps.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf pire_udf
diff --git a/yt/yql/tests/sql/suites/udf/two_regexps.sql b/yt/yql/tests/sql/suites/udf/two_regexps.sql
new file mode 100644
index 0000000000..23c16a81cd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/two_regexps.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+$is_abc = Pire::Match(".*abc");
+$_is_wtf = Pire::Match(".*wtf");
+
+SELECT * FROM plato.Input WHERE $is_abc(value) LIMIT 10;
diff --git a/yt/yql/tests/sql/suites/udf/udaf.cfg b/yt/yql/tests/sql/suites/udf/udaf.cfg
new file mode 100644
index 0000000000..289c4251bb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/udaf.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf python3_udf
diff --git a/yt/yql/tests/sql/suites/udf/udaf.sql b/yt/yql/tests/sql/suites/udf/udaf.sql
new file mode 100644
index 0000000000..ea2d7fa7ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/udaf.sql
@@ -0,0 +1,49 @@
+/* postgres can not */
+/* syntax version 1 */
+$script = @@
+import heapq
+import json
+
+N_SMALLEST = 3
+
+def create(item):
+ return [item]
+
+def add(state, item):
+ heapq.heappush(state, item)
+ return heapq.nsmallest(N_SMALLEST, state)
+
+def merge(state_a, state_b):
+ merged = heapq.merge(state_a, state_b)
+ return heapq.nsmallest(N_SMALLEST, merged)
+
+def get_result(state):
+ result = heapq.nsmallest(N_SMALLEST, state)
+ return '%d smallest items: %s' % (
+ N_SMALLEST,
+ ', '.join(map(str, result))
+ )
+
+def serialize(state):
+ return json.dumps(state)
+
+def deserialize(serialized):
+ return json.loads(serialized)
+@@;
+
+$create = Python3::create(Callable<(Double)->Resource<Python3>>, $script);
+$add = Python3::add(Callable<(Resource<Python3>,Double)->Resource<Python3>>, $script);
+$merge = Python3::merge(Callable<(Resource<Python3>,Resource<Python3>)->Resource<Python3>>, $script);
+$get_result = Python3::get_result(Callable<(Resource<Python3>)->String>, $script);
+$serialize = Python3::serialize(Callable<(Resource<Python3>)->String>, $script);
+$deserialize = Python3::deserialize(Callable<(String)->Resource<Python3>>, $script);
+
+SELECT UDAF(
+ CAST(key AS Double),
+ $create,
+ $add,
+ $merge,
+ $get_result,
+ $serialize,
+ $deserialize
+) FROM plato.Input;
diff --git a/yt/yql/tests/sql/suites/udf/udaf_distinct.cfg b/yt/yql/tests/sql/suites/udf/udaf_distinct.cfg
new file mode 100644
index 0000000000..289c4251bb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/udaf_distinct.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf python3_udf
diff --git a/yt/yql/tests/sql/suites/udf/udaf_distinct.sql b/yt/yql/tests/sql/suites/udf/udaf_distinct.sql
new file mode 100644
index 0000000000..2bde48ca55
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/udaf_distinct.sql
@@ -0,0 +1,53 @@
+/* postgres can not */
+/* syntax version 1 */
+$script = @@
+import heapq
+import json
+
+N_SMALLEST = 3
+
+def create(item):
+ return [item]
+
+def add(state, item):
+ heapq.heappush(state, item)
+ return heapq.nsmallest(N_SMALLEST, state)
+
+def merge(state_a, state_b):
+ merged = heapq.merge(state_a, state_b)
+ return heapq.nsmallest(N_SMALLEST, merged)
+
+def get_result(state):
+ result = heapq.nsmallest(N_SMALLEST, state)
+ return '%d smallest items: %s' % (
+ N_SMALLEST,
+ ', '.join(map(str, result))
+ )
+
+def serialize(state):
+ return json.dumps(state)
+
+def deserialize(serialized):
+ return json.loads(serialized)
+@@;
+
+$create = Python3::create(Callable<(Int64)->Resource<Python3>>, $script);
+$add = Python3::add(Callable<(Resource<Python3>,Int64)->Resource<Python3>>, $script);
+$merge = Python3::merge(Callable<(Resource<Python3>,Resource<Python3>)->Resource<Python3>>, $script);
+$get_result = Python3::get_result(Callable<(Resource<Python3>)->String>, $script);
+$serialize = Python3::serialize(Callable<(Resource<Python3>)->String>, $script);
+$deserialize = Python3::deserialize(Callable<(String)->Resource<Python3>>, $script);
+
+SELECT UDAF(
+ DISTINCT item,
+ $create,
+ $add,
+ $merge,
+ $get_result,
+ $serialize,
+ $deserialize
+) FROM (
+ SELECT
+ CAST(LENGTH(value) AS Int64) AS item
+ FROM plato.Input
+);
diff --git a/yt/yql/tests/sql/suites/udf/udaf_lambda.sql b/yt/yql/tests/sql/suites/udf/udaf_lambda.sql
new file mode 100644
index 0000000000..9e2a4d11b5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/udaf_lambda.sql
@@ -0,0 +1,18 @@
+/* postgres can not */
+$create = ($item, $_parent) -> { return $item };
+$add = ($state, $item, $_parent) -> { return $item + $state };
+$merge = ($state1, $state2) -> { return $state1 + $state2 };
+$get_result = ($state) -> { return $state };
+$serialize = ($state) -> { return $state };
+$deserialize = ($state) -> { return $state };
+
+SELECT UDAF(
+ length(key),
+ $create,
+ $add,
+ $merge,
+ $get_result,
+ $serialize,
+ $deserialize,
+ 0u
+) FROM plato.Input;
diff --git a/yt/yql/tests/sql/suites/udf/udaf_short.cfg b/yt/yql/tests/sql/suites/udf/udaf_short.cfg
new file mode 100644
index 0000000000..289c4251bb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/udaf_short.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf python3_udf
diff --git a/yt/yql/tests/sql/suites/udf/udaf_short.sql b/yt/yql/tests/sql/suites/udf/udaf_short.sql
new file mode 100644
index 0000000000..9072ffb8cc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/udaf_short.sql
@@ -0,0 +1,27 @@
+/* postgres can not */
+/* syntax version 1 */
+$script = @@
+def create(item):
+ return item
+
+def add(state, item):
+ return state + item
+
+def merge(state_a, state_b):
+ return state_a + state_b
+@@;
+
+$create = Python3::create(Callable<(Int64)->Int64>, $script);
+$add = Python3::add(Callable<(Int64,Int64)->Int64>, $script);
+$merge = Python3::merge(Callable<(Int64,Int64)->Int64>, $script);
+
+SELECT UDAF(
+ item,
+ $create,
+ $add,
+ $merge
+) FROM (
+ SELECT
+ CAST(LENGTH(value) AS Int64) AS item
+ FROM plato.Input
+);
diff --git a/yt/yql/tests/sql/suites/udf/udf.cfg b/yt/yql/tests/sql/suites/udf/udf.cfg
new file mode 100644
index 0000000000..abdcfc8271
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/udf.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf simple_udf
diff --git a/yt/yql/tests/sql/suites/udf/udf.sql b/yt/yql/tests/sql/suites/udf/udf.sql
new file mode 100644
index 0000000000..8b6d115640
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/udf.sql
@@ -0,0 +1,2 @@
+/* postgres can not */
+select key, subkey, SimpleUdf::Concat(value, "test") as value from plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/udf/udf_call_with_group_and_limit.cfg b/yt/yql/tests/sql/suites/udf/udf_call_with_group_and_limit.cfg
new file mode 100644
index 0000000000..abdcfc8271
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/udf_call_with_group_and_limit.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf simple_udf
diff --git a/yt/yql/tests/sql/suites/udf/udf_call_with_group_and_limit.sql b/yt/yql/tests/sql/suites/udf/udf_call_with_group_and_limit.sql
new file mode 100644
index 0000000000..c2285575ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/udf/udf_call_with_group_and_limit.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+select SimpleUdf::Echo(key) as key, count(*) as count
+ from plato.Input
+ group by key
+ order by key /* sort for stable results only */
+ limit 2; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/union/default.cfg b/yt/yql/tests/sql/suites/union/default.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union/default.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/union/union_multiin.cfg b/yt/yql/tests/sql/suites/union/union_multiin.cfg
new file mode 100644
index 0000000000..311e41d04b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union/union_multiin.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+in Input2 input2.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/union/union_multiin.sql b/yt/yql/tests/sql/suites/union/union_multiin.sql
new file mode 100644
index 0000000000..b13293562a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union/union_multiin.sql
@@ -0,0 +1,4 @@
+SELECT * FROM plato.Input
+UNION
+SELECT * FROM plato.Input2
+ORDER BY key, subkey, value;
diff --git a/yt/yql/tests/sql/suites/union/union_trivial.sql b/yt/yql/tests/sql/suites/union/union_trivial.sql
new file mode 100644
index 0000000000..e4112d94ce
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union/union_trivial.sql
@@ -0,0 +1,4 @@
+SELECT * FROM plato.Input
+UNION
+SELECT * FROM plato.Input
+ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/union_all/default.cfg b/yt/yql/tests/sql/suites/union_all/default.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/default.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/union_all/infer_3.sql b/yt/yql/tests/sql/suites/union_all/infer_3.sql
new file mode 100644
index 0000000000..ba01618d8a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/infer_3.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+use plato;
+
+select Just(1) as x,1 as y
+union all
+select Just(1l) as x, 2 as y
+union all
+select 3 as y;
diff --git a/yt/yql/tests/sql/suites/union_all/inner_union_all_with_limits.sql b/yt/yql/tests/sql/suites/union_all/inner_union_all_with_limits.sql
new file mode 100644
index 0000000000..07ec3df9ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/inner_union_all_with_limits.sql
@@ -0,0 +1,21 @@
+USE plato;
+
+SELECT
+ key,
+ value
+FROM (
+ (select * from Input limit 3)
+ union all
+ (select * from Input limit 2)
+)
+WHERE key < "100";
+
+SELECT
+ key,
+ value
+FROM (
+ (select * from Input limit 3)
+ union all
+ select * from Input
+)
+WHERE key < "200";
diff --git a/yt/yql/tests/sql/suites/union_all/input_infer.txt.attr b/yt/yql/tests/sql/suites/union_all/input_infer.txt.attr
new file mode 100644
index 0000000000..ada1f836f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/input_infer.txt.attr
@@ -0,0 +1,3 @@
+{
+ "infer_schema"=%true
+}
diff --git a/yt/yql/tests/sql/suites/union_all/mix_map_and_project-trivial_map.cfg b/yt/yql/tests/sql/suites/union_all/mix_map_and_project-trivial_map.cfg
new file mode 100644
index 0000000000..c557142061
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/mix_map_and_project-trivial_map.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+in Input2 input_infer.txt
diff --git a/yt/yql/tests/sql/suites/union_all/mix_map_and_project.cfg b/yt/yql/tests/sql/suites/union_all/mix_map_and_project.cfg
new file mode 100644
index 0000000000..0e44b7c5ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/mix_map_and_project.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+in Input2 input.txt
diff --git a/yt/yql/tests/sql/suites/union_all/mix_map_and_project.sql b/yt/yql/tests/sql/suites/union_all/mix_map_and_project.sql
new file mode 100644
index 0000000000..60d039f9a5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/mix_map_and_project.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+/* kikimr can not */
+PRAGMA yt.InferSchema;
+
+SELECT * FROM (
+ SELECT key, '' as value FROM plato.Input
+ UNION ALL
+ SELECT key, value from plato.Input2
+ UNION ALL
+ SELECT '' as key, value from plato.Input
+)
+ORDER BY key, value
+; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/union_all/mix_map_and_read.sql b/yt/yql/tests/sql/suites/union_all/mix_map_and_read.sql
new file mode 100644
index 0000000000..43f7bcef57
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/mix_map_and_read.sql
@@ -0,0 +1,9 @@
+SELECT * FROM (
+ SELECT key, subkey, '' as value FROM plato.Input
+ UNION ALL
+ SELECT * from plato.Input
+ UNION ALL
+ SELECT '' as key, subkey, value from plato.Input
+)
+ORDER BY key, subkey, value
+; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/union_all/path_and_record.sql b/yt/yql/tests/sql/suites/union_all/path_and_record.sql
new file mode 100644
index 0000000000..9aa42057eb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/path_and_record.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+SELECT * FROM (
+ select key, value, TablePath() as path, TableRecordIndex() as record from Input
+ union all
+ select key, value, "" as path, TableRecordIndex() as record from Input
+)
+ORDER BY key, path, record
+;
diff --git a/yt/yql/tests/sql/suites/union_all/union_all_fields.sql b/yt/yql/tests/sql/suites/union_all/union_all_fields.sql
new file mode 100644
index 0000000000..4d313c3659
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/union_all_fields.sql
@@ -0,0 +1,7 @@
+SELECT * FROM (
+ SELECT CAST(key AS int) as key, '' as value FROM plato.Input
+ UNION ALL
+ SELECT 0 as key, value from plato.Input
+)
+ORDER BY key, value
+; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/union_all/union_all_multiin.cfg b/yt/yql/tests/sql/suites/union_all/union_all_multiin.cfg
new file mode 100644
index 0000000000..8d2f379d10
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/union_all_multiin.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+in Input2 input2.txt
diff --git a/yt/yql/tests/sql/suites/union_all/union_all_multiin.sql b/yt/yql/tests/sql/suites/union_all/union_all_multiin.sql
new file mode 100644
index 0000000000..284528b526
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/union_all_multiin.sql
@@ -0,0 +1,9 @@
+USE plato;
+
+SELECT * FROM (
+ SELECT key, value from Input
+ UNION ALL
+ SELECT subkey as key, value from Input2
+)
+ORDER BY key, value
+;
diff --git a/yt/yql/tests/sql/suites/union_all/union_all_multiple.sql b/yt/yql/tests/sql/suites/union_all/union_all_multiple.sql
new file mode 100644
index 0000000000..d5fc95436f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/union_all_multiple.sql
@@ -0,0 +1,9 @@
+SELECT * FROM (
+ SELECT CAST(key AS int) as key, '' as subkey, '' as value FROM plato.Input
+ UNION ALL
+ SELECT 1 as key, subkey, '' as value from plato.Input
+ UNION ALL
+ SELECT 1 as key, '' as subkey, value from plato.Input
+)
+ORDER BY key, subkey, value
+; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/union_all/union_all_subexpr.sql b/yt/yql/tests/sql/suites/union_all/union_all_subexpr.sql
new file mode 100644
index 0000000000..9f7f840ce9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/union_all_subexpr.sql
@@ -0,0 +1,7 @@
+SELECT *
+FROM (
+ SELECT key, CAST(subkey AS int) as subkey, NULL as value FROM plato.Input
+ UNION ALL
+ SELECT key, NULL as subkey, value from plato.Input
+) as x
+ORDER BY key, subkey, value; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/union_all/union_all_trivial.sql b/yt/yql/tests/sql/suites/union_all/union_all_trivial.sql
new file mode 100644
index 0000000000..6ba8ed0790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/union_all_trivial.sql
@@ -0,0 +1,3 @@
+SELECT * FROM plato.Input
+UNION ALL
+SELECT * FROM plato.Input; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/union_all/union_all_with_discard_into_result_ansi.sql b/yt/yql/tests/sql/suites/union_all/union_all_with_discard_into_result_ansi.sql
new file mode 100644
index 0000000000..d3d7107e79
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/union_all_with_discard_into_result_ansi.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+
+use plato;
+pragma AnsiOrderByLimitInUnionAll;
+
+select * from Input
+union all
+select * from Input into result aaa;
+
+discard
+select * from Input
+union all
+select * from Input;
diff --git a/yt/yql/tests/sql/suites/union_all/union_all_with_limits.sql b/yt/yql/tests/sql/suites/union_all/union_all_with_limits.sql
new file mode 100644
index 0000000000..ad00f72d99
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/union_all_with_limits.sql
@@ -0,0 +1,3 @@
+(SELECT * FROM plato.Input WHERE key < "100" LIMIT 2)
+UNION ALL
+(SELECT * FROM plato.Input WHERE key > "100" LIMIT 2);
diff --git a/yt/yql/tests/sql/suites/union_all/union_all_with_parenthesis.sql b/yt/yql/tests/sql/suites/union_all/union_all_with_parenthesis.sql
new file mode 100644
index 0000000000..b782887269
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/union_all_with_parenthesis.sql
@@ -0,0 +1,4 @@
+(SELECT * FROM plato.Input)
+UNION ALL
+(SELECT * FROM plato.Input)
+
diff --git a/yt/yql/tests/sql/suites/union_all/union_all_with_top_level_limits_ansi.sql b/yt/yql/tests/sql/suites/union_all/union_all_with_top_level_limits_ansi.sql
new file mode 100644
index 0000000000..304bf54999
--- /dev/null
+++ b/yt/yql/tests/sql/suites/union_all/union_all_with_top_level_limits_ansi.sql
@@ -0,0 +1,28 @@
+/* syntax version 1 */
+/* postgres can not */
+
+use plato;
+pragma AnsiOrderByLimitInUnionAll;
+
+$foo =
+select * from Input
+union all
+select * from Input limit 2;
+
+$bar =
+select * from Input
+union all
+(select * from Input limit 2);
+
+
+select * from $foo order by subkey;
+select * from $bar order by subkey;
+
+select 1 as key
+union all
+select 2 as key assume order by key into result aaa;
+
+discard
+select 1 as key
+union all
+select 2 as key assume order by key;
diff --git a/yt/yql/tests/sql/suites/view/all_from_view.cfg b/yt/yql/tests/sql/suites/view/all_from_view.cfg
new file mode 100644
index 0000000000..8b7633b301
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/all_from_view.cfg
@@ -0,0 +1 @@
+in Input view_input.txt
diff --git a/yt/yql/tests/sql/suites/view/all_from_view.sql b/yt/yql/tests/sql/suites/view/all_from_view.sql
new file mode 100644
index 0000000000..9deea8173f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/all_from_view.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+/* syntax version 1 */
+SELECT * FROM plato.`Input` VIEW `key`;
diff --git a/yt/yql/tests/sql/suites/view/default.cfg b/yt/yql/tests/sql/suites/view/default.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/default.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/view/file_eval.cfg b/yt/yql/tests/sql/suites/view/file_eval.cfg
new file mode 100644
index 0000000000..3c3eef57dc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/file_eval.cfg
@@ -0,0 +1,2 @@
+in Input view_file.txt
+xfail \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/view/file_eval.sql b/yt/yql/tests/sql/suites/view/file_eval.sql
new file mode 100644
index 0000000000..6e64be4356
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/file_eval.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* syntax version 1 */
+/* custom error:FileContent function can't be used inside generated code in views*/
+pragma yt.ViewIsolation = 'true';
+USE plato;
+SELECT k, s, v FROM Input VIEW file_eval;
diff --git a/yt/yql/tests/sql/suites/view/file_inner.cfg b/yt/yql/tests/sql/suites/view/file_inner.cfg
new file mode 100644
index 0000000000..6ec6d9a459
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/file_inner.cfg
@@ -0,0 +1,2 @@
+in Input view_file.txt
+http_file foo.txt foo.txt
diff --git a/yt/yql/tests/sql/suites/view/file_inner.sql b/yt/yql/tests/sql/suites/view/file_inner.sql
new file mode 100644
index 0000000000..fb8dd1ce41
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/file_inner.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+/* syntax version 1 */
+pragma yt.ViewIsolation = 'true';
+USE plato;
+SELECT k, s, v FROM Input VIEW file_inner;
diff --git a/yt/yql/tests/sql/suites/view/file_inner_library.cfg b/yt/yql/tests/sql/suites/view/file_inner_library.cfg
new file mode 100644
index 0000000000..51e0aafced
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/file_inner_library.cfg
@@ -0,0 +1,2 @@
+in Input view_file_inner_library.txt
+http_file mylib.sql mylib.sql.txt
diff --git a/yt/yql/tests/sql/suites/view/file_inner_library.sql b/yt/yql/tests/sql/suites/view/file_inner_library.sql
new file mode 100644
index 0000000000..f81464e158
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/file_inner_library.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+/* syntax version 1 */
+pragma yt.ViewIsolation = 'true';
+USE plato;
+SELECT k, s, v FROM Input VIEW file_inner_library;
diff --git a/yt/yql/tests/sql/suites/view/file_inner_udf.cfg b/yt/yql/tests/sql/suites/view/file_inner_udf.cfg
new file mode 100644
index 0000000000..9e38dc624d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/file_inner_udf.cfg
@@ -0,0 +1,4 @@
+in Input view_file_inner_udf.txt
+http_file myfile yql/essentials/udfs/test/test_import/libtest_import_udf.so
+os linux
+providers yt
diff --git a/yt/yql/tests/sql/suites/view/file_inner_udf.sql b/yt/yql/tests/sql/suites/view/file_inner_udf.sql
new file mode 100644
index 0000000000..9b1a90e856
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/file_inner_udf.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+/* syntax version 1 */
+pragma yt.ViewIsolation = 'true';
+USE plato;
+SELECT k, s, v FROM Input VIEW file_inner_udf1
+UNION ALL
+SELECT k, s, v FROM Input VIEW file_inner_udf2;
+
diff --git a/yt/yql/tests/sql/suites/view/file_outer.cfg b/yt/yql/tests/sql/suites/view/file_outer.cfg
new file mode 100644
index 0000000000..331e1aedcc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/file_outer.cfg
@@ -0,0 +1,3 @@
+in Input view_file.txt
+file foo.txt foo.txt
+xfail \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/view/file_outer.sql b/yt/yql/tests/sql/suites/view/file_outer.sql
new file mode 100644
index 0000000000..952a4d8d92
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/file_outer.sql
@@ -0,0 +1,4 @@
+/* custom error:File not found*/
+pragma yt.ViewIsolation = 'true';
+USE plato;
+SELECT k, s, v FROM Input VIEW file_outer;
diff --git a/yt/yql/tests/sql/suites/view/file_outer_library.cfg b/yt/yql/tests/sql/suites/view/file_outer_library.cfg
new file mode 100644
index 0000000000..cf7d8cce56
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/file_outer_library.cfg
@@ -0,0 +1,4 @@
+in Input view_file_outer_library.txt
+http_file mylib.sql mylib.sql.txt
+xfail
+
diff --git a/yt/yql/tests/sql/suites/view/file_outer_library.sql b/yt/yql/tests/sql/suites/view/file_outer_library.sql
new file mode 100644
index 0000000000..e994026f4b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/file_outer_library.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+/* syntax version 1 */
+/* custom error: does not exist*/
+pragma yt.ViewIsolation = 'true';
+USE plato;
+PRAGMA library('mylib.sql');
+SELECT k, s, v FROM Input VIEW file_outer_library;
diff --git a/yt/yql/tests/sql/suites/view/init_view_after_eval.sql b/yt/yql/tests/sql/suites/view/init_view_after_eval.sql
new file mode 100644
index 0000000000..3dafc5f598
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/init_view_after_eval.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+use plato;
+
+$i = select * from Input;
+$i = process $i;
+
+$members = StructTypeComponents(ListItemType(TypeHandle(TypeOf($i))));
+$filteredMembers = ListFilter(ListMap($members, ($x) -> { return $x.Name }), ($x) -> { return $x > "k" });
+
+select ChooseMembers(TableRow(), $filteredMembers) from Input view raw;
diff --git a/yt/yql/tests/sql/suites/view/input_lambda.txt.attr b/yt/yql/tests/sql/suites/view/input_lambda.txt.attr
new file mode 100644
index 0000000000..c9e8e9e38d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/input_lambda.txt.attr
@@ -0,0 +1,32 @@
+{
+ "_yql_view_lambda"="$update_key = ($key) -> ($key || '.updated'); SELECT $update_key(key) as key, subkey, value from self";
+ "_yql_view_lambda_process"="$update_row = ($row) -> (AddMember($row, 'new_value', 'NEW_VALUE')); PROCESS self USING $update_row(TableRow());";
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/view/input_library.txt.attr b/yt/yql/tests/sql/suites/view/input_library.txt.attr
new file mode 100644
index 0000000000..f053d1dea6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/input_library.txt.attr
@@ -0,0 +1,32 @@
+{
+ "_yql_view_library"="PRAGMA Library('nested_library.sql', 'http_test://nested_library.sql.txt'); import nested_library symbols $to_lower; SELECT key, subkey, value, $to_lower(key) as lower_key from self";
+ "_yql_syntax_version_library"=1;
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/view/secure.cfg b/yt/yql/tests/sql/suites/view/secure.cfg
new file mode 100644
index 0000000000..faeeed07f3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/secure.cfg
@@ -0,0 +1,2 @@
+in Input view_secure.txt
+xfail \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/view/secure.sql b/yt/yql/tests/sql/suites/view/secure.sql
new file mode 100644
index 0000000000..15ef309d96
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/secure.sql
@@ -0,0 +1,4 @@
+/* custom error:SecureParam function can't be used in views*/
+pragma yt.ViewIsolation = 'true';
+USE plato;
+SELECT k, s, v FROM Input VIEW secure;
diff --git a/yt/yql/tests/sql/suites/view/secure_eval.cfg b/yt/yql/tests/sql/suites/view/secure_eval.cfg
new file mode 100644
index 0000000000..faeeed07f3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/secure_eval.cfg
@@ -0,0 +1,2 @@
+in Input view_secure.txt
+xfail \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/view/secure_eval.sql b/yt/yql/tests/sql/suites/view/secure_eval.sql
new file mode 100644
index 0000000000..13acee4487
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/secure_eval.sql
@@ -0,0 +1,4 @@
+/* custom error:SecureParam function can't be used in views*/
+pragma yt.ViewIsolation = 'true';
+USE plato;
+SELECT k, s, v FROM Input VIEW secure_eval;
diff --git a/yt/yql/tests/sql/suites/view/secure_eval_dyn.cfg b/yt/yql/tests/sql/suites/view/secure_eval_dyn.cfg
new file mode 100644
index 0000000000..faeeed07f3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/secure_eval_dyn.cfg
@@ -0,0 +1,2 @@
+in Input view_secure.txt
+xfail \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/view/secure_eval_dyn.sql b/yt/yql/tests/sql/suites/view/secure_eval_dyn.sql
new file mode 100644
index 0000000000..0a1b696155
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/secure_eval_dyn.sql
@@ -0,0 +1,4 @@
+/* custom error:FuncCode should have constant function name in views*/
+pragma yt.ViewIsolation = 'true';
+USE plato;
+SELECT k, s, v FROM Input VIEW secure_eval_dynamic;
diff --git a/yt/yql/tests/sql/suites/view/standalone_view_lambda.cfg b/yt/yql/tests/sql/suites/view/standalone_view_lambda.cfg
new file mode 100644
index 0000000000..b4c7e23249
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/standalone_view_lambda.cfg
@@ -0,0 +1,3 @@
+in InputView standalone_view_lambda.txt
+in Input input.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/view/standalone_view_lambda.sql b/yt/yql/tests/sql/suites/view/standalone_view_lambda.sql
new file mode 100644
index 0000000000..7edb28296d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/standalone_view_lambda.sql
@@ -0,0 +1,8 @@
+use plato;
+
+$stream = process InputView;
+$type = EvaluateType(TypeHandle(ListItemType(TypeOf($stream))));
+
+$lambda = ($row) -> (Cast($row as $type));
+
+process InputView using $lambda(TableRow());
diff --git a/yt/yql/tests/sql/suites/view/standalone_view_lambda.txt.attr b/yt/yql/tests/sql/suites/view/standalone_view_lambda.txt.attr
new file mode 100644
index 0000000000..2666763633
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/standalone_view_lambda.txt.attr
@@ -0,0 +1,4 @@
+{
+ "_yql_type" = <syntax_version=1>"view";
+ "type" = "document";
+}
diff --git a/yt/yql/tests/sql/suites/view/system_udf.cfg b/yt/yql/tests/sql/suites/view/system_udf.cfg
new file mode 100644
index 0000000000..3760566137
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/system_udf.cfg
@@ -0,0 +1,2 @@
+in Input view_system_udf.txt
+udf string_udf
diff --git a/yt/yql/tests/sql/suites/view/system_udf.sql b/yt/yql/tests/sql/suites/view/system_udf.sql
new file mode 100644
index 0000000000..e5599aa9c2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/system_udf.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+/* syntax version 1 */
+pragma yt.ViewIsolation = 'true';
+USE plato;
+SELECT k, s, v FROM Input VIEW system_udf;
diff --git a/yt/yql/tests/sql/suites/view/trivial_view.cfg b/yt/yql/tests/sql/suites/view/trivial_view.cfg
new file mode 100644
index 0000000000..8b7633b301
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/trivial_view.cfg
@@ -0,0 +1 @@
+in Input view_input.txt
diff --git a/yt/yql/tests/sql/suites/view/trivial_view.sql b/yt/yql/tests/sql/suites/view/trivial_view.sql
new file mode 100644
index 0000000000..d126465c8c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/trivial_view.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+SELECT k, s, v FROM Input VIEW ksv;
diff --git a/yt/yql/tests/sql/suites/view/trivial_view_concat.cfg b/yt/yql/tests/sql/suites/view/trivial_view_concat.cfg
new file mode 100644
index 0000000000..8b7633b301
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/trivial_view_concat.cfg
@@ -0,0 +1 @@
+in Input view_input.txt
diff --git a/yt/yql/tests/sql/suites/view/trivial_view_concat.sql b/yt/yql/tests/sql/suites/view/trivial_view_concat.sql
new file mode 100644
index 0000000000..bad7874f6b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/trivial_view_concat.sql
@@ -0,0 +1,4 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+SELECT k, s, v FROM concat(Input view ksv, Input view ksv);
diff --git a/yt/yql/tests/sql/suites/view/view_file.txt.attr b/yt/yql/tests/sql/suites/view/view_file.txt.attr
new file mode 100644
index 0000000000..b70ac5691b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/view_file.txt.attr
@@ -0,0 +1,33 @@
+{
+ "_yql_view_file_eval"="SELECT EvaluateCode(FuncCode('FileContent', AtomCode('foo.txt'))) as k, subkey as s, value as v FROM self";
+ "_yql_view_file_outer"="SELECT FileContent('foo' || '.txt') as k, subkey as s, value as v FROM self";
+ "_yql_view_file_inner"="pragma file('foo.txt','http_test://foo.txt');SELECT FileContent('foo.txt') 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/view/view_file_inner_library.txt.attr b/yt/yql/tests/sql/suites/view/view_file_inner_library.txt.attr
new file mode 100644
index 0000000000..43581a8c93
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/view_file_inner_library.txt.attr
@@ -0,0 +1,31 @@
+{
+ "_yql_view_file_inner_library"="PRAGMA library('mylib.sql','http_test://mylib.sql');IMPORT mylib SYMBOLS $x;select $x as k, 2 as s, 3 as v";
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/view/view_file_inner_udf.txt.attr b/yt/yql/tests/sql/suites/view/view_file_inner_udf.txt.attr
new file mode 100644
index 0000000000..51babfc5e8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/view_file_inner_udf.txt.attr
@@ -0,0 +1,32 @@
+{
+ "_yql_view_file_inner_udf1"="PRAGMA file('myfile','http_test://myfile');PRAGMA udf('myfile');select TestImportUdf::Concat(key,'!') as k, 2 as s, 3 as v from self";
+ "_yql_view_file_inner_udf2"="PRAGMA file('myfile','http_test://myfile');PRAGMA udf('myfile');select TestImportUdf::Concat(key,'?') as k, 2 as s, 3 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/view/view_file_outer_library.txt.attr b/yt/yql/tests/sql/suites/view/view_file_outer_library.txt.attr
new file mode 100644
index 0000000000..c0e969f6f1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/view_file_outer_library.txt.attr
@@ -0,0 +1,31 @@
+{
+ "_yql_view_file_outer_library"="IMPORT mylib SYMBOLS $x;select $x as k, 2 as s, 3 as v";
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/view/view_input.txt.attr b/yt/yql/tests/sql/suites/view/view_input.txt.attr
new file mode 100644
index 0000000000..07386c98e5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/view_input.txt.attr
@@ -0,0 +1,32 @@
+{
+ "_yql_view_ksv"="SELECT key as k, subkey as s, value as v FROM self";
+ "_yql_view_key"="SELECT key FROM self";
+ "_yql_row_spec" = {
+ "Type" = [
+ "StructType";
+ [
+ [
+ "key";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "subkey";
+ [
+ "DataType";
+ "String"
+ ]
+ ];
+ [
+ "value";
+ [
+ "DataType";
+ "String"
+ ]
+ ]
+ ]
+ ]
+ }
+}
diff --git a/yt/yql/tests/sql/suites/view/view_secure.txt.attr b/yt/yql/tests/sql/suites/view/view_secure.txt.attr
new file mode 100644
index 0000000000..2d8ed382fc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/view_secure.txt.attr
@@ -0,0 +1,33 @@
+{
+ "_yql_view_secure"="SELECT SecureParam('api:oauth') as k, subkey as s, value as v FROM self";
+ "_yql_view_secure_eval"="SELECT EvaluateCode(FuncCode('SecureParam', AtomCode('api:oauth'))) as k, subkey as s, value as v FROM self";
+ "_yql_view_secure_eval_dynamic"="SELECT EvaluateCode(FuncCode('S' || 'ecureParam', AtomCode('api:oauth'))) 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/view/view_system_udf.txt.attr b/yt/yql/tests/sql/suites/view/view_system_udf.txt.attr
new file mode 100644
index 0000000000..2badea2c2a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/view_system_udf.txt.attr
@@ -0,0 +1,31 @@
+{
+ "_yql_view_system_udf"="SELECT String::Strip(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/view/view_with_lambda.cfg b/yt/yql/tests/sql/suites/view/view_with_lambda.cfg
new file mode 100644
index 0000000000..8cb4920700
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/view_with_lambda.cfg
@@ -0,0 +1,2 @@
+in Input input_lambda.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/view/view_with_lambda.sql b/yt/yql/tests/sql/suites/view/view_with_lambda.sql
new file mode 100644
index 0000000000..c698d5c100
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/view_with_lambda.sql
@@ -0,0 +1,2 @@
+use plato;
+select * from Input view lambda;
diff --git a/yt/yql/tests/sql/suites/view/view_with_lambda_process.cfg b/yt/yql/tests/sql/suites/view/view_with_lambda_process.cfg
new file mode 100644
index 0000000000..8cb4920700
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/view_with_lambda_process.cfg
@@ -0,0 +1,2 @@
+in Input input_lambda.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/view/view_with_lambda_process.sql b/yt/yql/tests/sql/suites/view/view_with_lambda_process.sql
new file mode 100644
index 0000000000..0db9c8b8ce
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/view_with_lambda_process.sql
@@ -0,0 +1,2 @@
+use plato;
+select * from Input view lambda_process;
diff --git a/yt/yql/tests/sql/suites/view/view_with_library.cfg b/yt/yql/tests/sql/suites/view/view_with_library.cfg
new file mode 100644
index 0000000000..fa1b395601
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/view_with_library.cfg
@@ -0,0 +1,3 @@
+in Input input_library.txt
+http_file nested_library.sql.txt nested_library.sql.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/view/view_with_library.sql b/yt/yql/tests/sql/suites/view/view_with_library.sql
new file mode 100644
index 0000000000..3d10f4272f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/view/view_with_library.sql
@@ -0,0 +1,2 @@
+use plato;
+select * from Input view `library`;
diff --git a/yt/yql/tests/sql/suites/weak_field/default.cfg b/yt/yql/tests/sql/suites/weak_field/default.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/default.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/few_source_different_columns.cfg b/yt/yql/tests/sql/suites/weak_field/few_source_different_columns.cfg
new file mode 100644
index 0000000000..84859da06f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/few_source_different_columns.cfg
@@ -0,0 +1,2 @@
+in Input1 infer_scheme.txt
+in Input2 input_other_yson_esc.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/few_source_different_columns.sql b/yt/yql/tests/sql/suites/weak_field/few_source_different_columns.sql
new file mode 100644
index 0000000000..321ffdf307
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/few_source_different_columns.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+/* syntax version 1 */
+PRAGMA yt.InferSchema="2";
+
+USE plato;
+
+SELECT
+ WeakField(key, "String", "funny"),
+ WeakField(subkey, "String", "bunny"),
+ WeakField(value, "String", "boom")
+FROM RANGE(``, ``, ``)
+--FROM Concat(Input1, Input2)
diff --git a/yt/yql/tests/sql/suites/weak_field/hor_join_with_mix_weak_access.cfg b/yt/yql/tests/sql/suites/weak_field/hor_join_with_mix_weak_access.cfg
new file mode 100644
index 0000000000..400d2341a2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/hor_join_with_mix_weak_access.cfg
@@ -0,0 +1 @@
+in Input other1.txt \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/weak_field/hor_join_with_mix_weak_access.sql b/yt/yql/tests/sql/suites/weak_field/hor_join_with_mix_weak_access.sql
new file mode 100644
index 0000000000..74aad3d484
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/hor_join_with_mix_weak_access.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+select key, WeakField(value1, "String", "funny") as value from Input
+union all
+select key, _other["value1"] as value from Input;
diff --git a/yt/yql/tests/sql/suites/weak_field/infer_scheme.txt.attr b/yt/yql/tests/sql/suites/weak_field/infer_scheme.txt.attr
new file mode 100644
index 0000000000..3c0f7e55c1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/infer_scheme.txt.attr
@@ -0,0 +1,3 @@
+{
+ "infer_schema" = %true
+} \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/weak_field/input_other_yson.txt.attr b/yt/yql/tests/sql/suites/weak_field/input_other_yson.txt.attr
new file mode 100644
index 0000000000..49d98771a8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/input_other_yson.txt.attr
@@ -0,0 +1,17 @@
+{
+ "_read_schema" = <"strict" = %false>[
+ {"type"="string";"name"="key"};
+ {"type"="string";"name"="subkey"};
+ ];
+ "schema" = <"strict" = %false; "unique_keys" = %false>
+ [
+ {
+ "name" = "key";
+ "type" = "string"
+ };
+ {
+ "name" = "subkey";
+ "type" = "string"
+ }
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/weak_field/input_other_yson_esc.txt.attr b/yt/yql/tests/sql/suites/weak_field/input_other_yson_esc.txt.attr
new file mode 100644
index 0000000000..49d98771a8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/input_other_yson_esc.txt.attr
@@ -0,0 +1,17 @@
+{
+ "_read_schema" = <"strict" = %false>[
+ {"type"="string";"name"="key"};
+ {"type"="string";"name"="subkey"};
+ ];
+ "schema" = <"strict" = %false; "unique_keys" = %false>
+ [
+ {
+ "name" = "key";
+ "type" = "string"
+ };
+ {
+ "name" = "subkey";
+ "type" = "string"
+ }
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/weak_field/input_rest.txt.attr b/yt/yql/tests/sql/suites/weak_field/input_rest.txt.attr
new file mode 100644
index 0000000000..68b8ac17ed
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/input_rest.txt.attr
@@ -0,0 +1,11 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"String"]];
+ ["subkey";["DataType";"String"]];
+ ["_rest";["DictType";["DataType";"String"];["DataType";"Yson"]]]
+ ]];
+ "SortDirections"=[1;1;];
+ "SortedBy"=["key";"subkey";];
+ "SortedByTypes"=[["DataType";"String";];["DataType";"String";];];
+ "SortMembers"=["key";"subkey";];
+}}
diff --git a/yt/yql/tests/sql/suites/weak_field/input_tutorial_email_short_as_other.txt.attr b/yt/yql/tests/sql/suites/weak_field/input_tutorial_email_short_as_other.txt.attr
new file mode 100644
index 0000000000..8f81910ca5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/input_tutorial_email_short_as_other.txt.attr
@@ -0,0 +1,12 @@
+{
+ "_read_schema" = <"strict" = %false>[
+ {"type"="uint64";"name"="yandexuid"};
+ ];
+ "schema" = <"strict" = %false; "unique_keys" = %false>
+ [
+ {
+ "name" = "yandexuid";
+ "type" = "uint64"
+ }
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields.txt.attr b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields.txt.attr
new file mode 100644
index 0000000000..ada1f836f8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields.txt.attr
@@ -0,0 +1,3 @@
+{
+ "infer_schema"=%true
+}
diff --git a/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_combine.cfg b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_combine.cfg
new file mode 100644
index 0000000000..548d8860d2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_combine.cfg
@@ -0,0 +1 @@
+in Input optimize_weak_fields.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_combine.sql b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_combine.sql
new file mode 100644
index 0000000000..7050c55069
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_combine.sql
@@ -0,0 +1,4 @@
+/* kikimr can not */
+pragma yt.InferSchema;
+USE plato;
+SELECT key, min(WeakField(subkey, "Int64")), max(WeakField(value, "String")) FROM Input GROUP BY key ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_filter_combine.cfg b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_filter_combine.cfg
new file mode 100644
index 0000000000..548d8860d2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_filter_combine.cfg
@@ -0,0 +1 @@
+in Input optimize_weak_fields.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_filter_combine.sql b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_filter_combine.sql
new file mode 100644
index 0000000000..f981ba133b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_filter_combine.sql
@@ -0,0 +1,4 @@
+/* kikimr can not */
+pragma yt.InferSchema;
+USE plato;
+SELECT min(key),subkey,max(WeakField(value, "String")) FROM Input where WeakField(subkey, "Int64") > 0 group by WeakField(subkey, "Int64") as subkey order by subkey;
diff --git a/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_map.cfg b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_map.cfg
new file mode 100644
index 0000000000..548d8860d2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_map.cfg
@@ -0,0 +1 @@
+in Input optimize_weak_fields.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_map.sql b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_map.sql
new file mode 100644
index 0000000000..6cbe12e979
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_map.sql
@@ -0,0 +1,4 @@
+/* kikimr can not */
+pragma yt.InferSchema;
+USE plato;
+SELECT key, WeakField(subkey, "Int64"), WeakField(value, "String") FROM Input;
diff --git a/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_map_combine.cfg b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_map_combine.cfg
new file mode 100644
index 0000000000..548d8860d2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_map_combine.cfg
@@ -0,0 +1 @@
+in Input optimize_weak_fields.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_map_combine.sql b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_map_combine.sql
new file mode 100644
index 0000000000..ec5fe0a26f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/optimize_weak_fields_map_combine.sql
@@ -0,0 +1,4 @@
+/* kikimr can not */
+pragma yt.InferSchema;
+USE plato;
+SELECT min(key),subkey,max(WeakField(value, "String")) FROM Input group by WeakField(subkey, "Int64") as subkey order by subkey;
diff --git a/yt/yql/tests/sql/suites/weak_field/optional.txt.attr b/yt/yql/tests/sql/suites/weak_field/optional.txt.attr
new file mode 100644
index 0000000000..7962199d3e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/optional.txt.attr
@@ -0,0 +1,85 @@
+{
+ "_yql_row_spec" = {"Type" = [
+ "StructType";
+ [
+ [
+ "first_null";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ]
+ ];
+ [
+ "first_num";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ]
+ ];
+ [
+ "second_null";
+ [
+ "OptionalType";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ]
+ ]
+ ];
+ [
+ "second_num";
+ [
+ "OptionalType";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ]
+ ]
+ ];
+ [
+ "third_null";
+ [
+ "OptionalType";
+ [
+ "OptionalType";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ]
+ ]
+ ]
+ ];
+ [
+ "third_num";
+ [
+ "OptionalType";
+ [
+ "OptionalType";
+ [
+ "OptionalType";
+ [
+ "DataType";
+ "Uint32"
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]
+ ]};
+}
diff --git a/yt/yql/tests/sql/suites/weak_field/other1.txt.attr b/yt/yql/tests/sql/suites/weak_field/other1.txt.attr
new file mode 100644
index 0000000000..49d98771a8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/other1.txt.attr
@@ -0,0 +1,17 @@
+{
+ "_read_schema" = <"strict" = %false>[
+ {"type"="string";"name"="key"};
+ {"type"="string";"name"="subkey"};
+ ];
+ "schema" = <"strict" = %false; "unique_keys" = %false>
+ [
+ {
+ "name" = "key";
+ "type" = "string"
+ };
+ {
+ "name" = "subkey";
+ "type" = "string"
+ }
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/weak_field/other2.txt.attr b/yt/yql/tests/sql/suites/weak_field/other2.txt.attr
new file mode 100644
index 0000000000..49d98771a8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/other2.txt.attr
@@ -0,0 +1,17 @@
+{
+ "_read_schema" = <"strict" = %false>[
+ {"type"="string";"name"="key"};
+ {"type"="string";"name"="subkey"};
+ ];
+ "schema" = <"strict" = %false; "unique_keys" = %false>
+ [
+ {
+ "name" = "key";
+ "type" = "string"
+ };
+ {
+ "name" = "subkey";
+ "type" = "string"
+ }
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/weak_field/other3.txt.attr b/yt/yql/tests/sql/suites/weak_field/other3.txt.attr
new file mode 100644
index 0000000000..49d98771a8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/other3.txt.attr
@@ -0,0 +1,17 @@
+{
+ "_read_schema" = <"strict" = %false>[
+ {"type"="string";"name"="key"};
+ {"type"="string";"name"="subkey"};
+ ];
+ "schema" = <"strict" = %false; "unique_keys" = %false>
+ [
+ {
+ "name" = "key";
+ "type" = "string"
+ };
+ {
+ "name" = "subkey";
+ "type" = "string"
+ }
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/weak_field/other4.txt.attr b/yt/yql/tests/sql/suites/weak_field/other4.txt.attr
new file mode 100644
index 0000000000..49d98771a8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/other4.txt.attr
@@ -0,0 +1,17 @@
+{
+ "_read_schema" = <"strict" = %false>[
+ {"type"="string";"name"="key"};
+ {"type"="string";"name"="subkey"};
+ ];
+ "schema" = <"strict" = %false; "unique_keys" = %false>
+ [
+ {
+ "name" = "key";
+ "type" = "string"
+ };
+ {
+ "name" = "subkey";
+ "type" = "string"
+ }
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field.cfg
new file mode 100644
index 0000000000..1410268275
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field.cfg
@@ -0,0 +1,2 @@
+in Input1 other1.txt
+in Input2 other2.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field.sql b/yt/yql/tests/sql/suites/weak_field/weak_field.sql
new file mode 100644
index 0000000000..96e155080d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+use plato;
+select "input1-value1" as src, key, WeakField(value1, "String", "funny") as ozer from Input1
+union all
+select "input2-value1" as src, key, WeakField(value1, "String", "funny") as ozer from Input2
+union all
+select "input1-value2" as src, key, WeakField(value2, "String") as ozer from Input1
+union all
+select "input2-value2" as src, key, WeakField(value2, "String") as ozer from Input2
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_aggregation.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field_aggregation.cfg
new file mode 100644
index 0000000000..b41a784aca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_aggregation.cfg
@@ -0,0 +1 @@
+in Input4 other4.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_aggregation.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_aggregation.sql
new file mode 100644
index 0000000000..904f01470d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_aggregation.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+USE plato;
+
+--INSERT INTO Output
+SELECT
+ odd,
+ sum(WeakField(data3, "int32") + WeakField(datahole3, "uint32", 999)) as score
+FROM Input4
+GROUP BY cast(subkey as uint32) % 2 as odd
+ORDER BY odd, score
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_data.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field_data.cfg
new file mode 100644
index 0000000000..2c8cfa4101
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_data.cfg
@@ -0,0 +1 @@
+in Input3 other3.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_data.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_data.sql
new file mode 100644
index 0000000000..e3d3002084
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_data.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+use plato;
+select subkey, WeakField(data1, "Int32", 32) as d1, WeakField(data3, "Int32", 32) as d3 from Input3 order by subkey
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_esc_string.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field_esc_string.cfg
new file mode 100644
index 0000000000..ec92471037
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_esc_string.cfg
@@ -0,0 +1 @@
+in Input input_other_yson_esc.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_esc_string.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_esc_string.sql
new file mode 100644
index 0000000000..9c394f9ca9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_esc_string.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+USE plato;
+
+--INSERT INTO Output
+SELECT WeakField(subkey, 'string'), WeakField(strE1, 'string')
+FROM Input
+ORDER BY subkey;
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_esc_yson.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field_esc_yson.cfg
new file mode 100644
index 0000000000..ec92471037
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_esc_yson.cfg
@@ -0,0 +1 @@
+in Input input_other_yson_esc.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_esc_yson.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_esc_yson.sql
new file mode 100644
index 0000000000..28482d250f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_esc_yson.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+USE plato;
+
+--INSERT INTO Output
+SELECT
+ Cast(WeakField(subkey, 'string') as uint32) as subkey,
+ WeakField(strE1, 'string'),
+ YQL::FromYsonSimpleType(WeakField(strE1, "Yson"), AsAtom("String")) AS strE1overYson
+FROM Input
+ORDER BY subkey;
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_in_group_by.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field_in_group_by.cfg
new file mode 100644
index 0000000000..b1dd7b3cd5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_in_group_by.cfg
@@ -0,0 +1 @@
+in Input input_other_yson.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_in_group_by.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_in_group_by.sql
new file mode 100644
index 0000000000..a1bf197bb5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_in_group_by.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+USE plato;
+
+SELECT
+ sk,
+ count(*) as count
+FROM Input
+GROUP BY WeakField(uiData, 'uint64') as sk
+ORDER BY sk \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_infer_scheme.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field_infer_scheme.cfg
new file mode 100644
index 0000000000..4895b73f21
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_infer_scheme.cfg
@@ -0,0 +1 @@
+in Input infer_scheme.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_infer_scheme.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_infer_scheme.sql
new file mode 100644
index 0000000000..a403fed293
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_infer_scheme.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+/* kikimr can not */
+USE plato;
+pragma yt.InferSchema;
+
+SELECT key, subkey, WeakField(value, "String") as value FROM Input;
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_join.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field_join.cfg
new file mode 100644
index 0000000000..1410268275
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_join.cfg
@@ -0,0 +1,2 @@
+in Input1 other1.txt
+in Input2 other2.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_join.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_join.sql
new file mode 100644
index 0000000000..dd834f50a3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_join.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+use plato;
+
+SELECT
+ i1.subkey as sk,
+ WeakField(i1.value1, "String", "funny") as i1v1,
+ WeakField(i1.value2, "String", "bunny") as i1v2,
+ WeakField(i2.value1, "String", "short") as i2v1,
+ WeakField(i2.value2, "String", "circuit") as i2v2
+FROM Input1 as i1 join Input2 as i2 USING(subkey) ORDER BY sk
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_join_condition.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field_join_condition.cfg
new file mode 100644
index 0000000000..1410268275
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_join_condition.cfg
@@ -0,0 +1,2 @@
+in Input1 other1.txt
+in Input2 other2.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_join_condition.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_join_condition.sql
new file mode 100644
index 0000000000..7818c68f11
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_join_condition.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+USE plato;
+
+--INSERT INTO Output
+SELECT
+ i1.subkey as sk,
+ WeakField(i1.value1, "String", "funny") as i1v1,
+ WeakField(i1.value2, "String", "bunny") as i1v2,
+ WeakField(i2.value1, "String", "short") as i2v1,
+ WeakField(i2.value2, "String", "circuit") as i2v2
+FROM Input1 as i1 JOIN Input2 as i2 ON WeakField(i1.value1, "String") == WeakField(i2.value2, "String") ORDER BY sk
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_join_where.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field_join_where.cfg
new file mode 100644
index 0000000000..1410268275
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_join_where.cfg
@@ -0,0 +1,2 @@
+in Input1 other1.txt
+in Input2 other2.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_join_where.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_join_where.sql
new file mode 100644
index 0000000000..0807940069
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_join_where.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+USE plato;
+
+--INSERT INTO Output
+SELECT
+ i1.subkey as sk,
+ WeakField(i1.value1, "String", "funny") as i1v1,
+ WeakField(i1.value2, "String", "bunny") as i1v2,
+ WeakField(i2.value1, "String", "short") as i2v1,
+ WeakField(i2.value2, "String", "circuit") as i2v2
+FROM Input1 as i1 JOIN Input2 as i2 ON WeakField(i1.value1, "String") == WeakField(i2.value2, "String")
+WHERE WeakField(i2.key, "String") == "150" or WeakField(i1.key, "String") == "075"
+ORDER BY sk
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_long_fields.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field_long_fields.cfg
new file mode 100644
index 0000000000..11c3f04b25
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_long_fields.cfg
@@ -0,0 +1 @@
+in Input input_tutorial_email_short_as_other.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_long_fields.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_long_fields.sql
new file mode 100644
index 0000000000..81cc5bacd9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_long_fields.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+USE plato;
+
+--INSERT INTO Output
+SELECT
+ WeakField(email, "String"),
+ WeakField(yandexuid, "Uint64")
+FROM Input
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_long_name.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field_long_name.cfg
new file mode 100644
index 0000000000..e85c3febf4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_long_name.cfg
@@ -0,0 +1 @@
+in Input other1.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_long_name.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_long_name.sql
new file mode 100644
index 0000000000..ab439e9cc9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_long_name.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+USE plato;
+
+--INSERT INTO Output
+SELECT
+ WeakField(long_long_long_column_name, 'string')
+FROM Input
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_num_access.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field_num_access.cfg
new file mode 100644
index 0000000000..b41a784aca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_num_access.cfg
@@ -0,0 +1 @@
+in Input4 other4.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_num_access.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_num_access.sql
new file mode 100644
index 0000000000..eb6365bff3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_num_access.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+USE plato;
+
+--INSERT INTO Output
+SELECT
+ subkey,
+ WeakField(data3, "int32") as data3,
+ WeakField(datahole3, "uint32", 999) as holes3
+FROM Input4
+ORDER BY subkey
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_opt.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field_opt.cfg
new file mode 100644
index 0000000000..2c8cfa4101
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_opt.cfg
@@ -0,0 +1 @@
+in Input3 other3.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_opt.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_opt.sql
new file mode 100644
index 0000000000..8f66299362
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_opt.sql
@@ -0,0 +1,3 @@
+/* postgres can not */
+use plato;
+select subkey, WeakField(data3, "int32") as data3str, WeakField(datahole3, "int32", 999) as holes3 from Input3 order by subkey
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_real_col.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_real_col.sql
new file mode 100644
index 0000000000..3249bbc634
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_real_col.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+USE plato;
+
+--INSERT INTO Output
+SELECT
+ WeakField(key, "String", 'test'),
+ WeakField(balu, "String", 'bebe'),
+ WeakField(value, "String", 'zzz')
+FROM Input
+WHERE key < "200"
+ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_rest.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field_rest.cfg
new file mode 100644
index 0000000000..2c0d92202d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_rest.cfg
@@ -0,0 +1 @@
+in Input input_rest.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_rest.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_rest.sql
new file mode 100644
index 0000000000..a330421f3f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_rest.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+USE plato;
+
+--INSERT INTO Output
+SELECT
+ WeakField(animal, "String"),
+ WeakField(size, "String") as sizeRating,
+ WeakField(weightMin, "Float"),
+ WeakField(weightMax, "Float"),
+ WeakField(wild, "Bool"),
+ WeakField(pet, "Bool", false),
+ WeakField(miss, "Bool", true)
+FROM Input
+ORDER BY weightMin
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_strict.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field_strict.cfg
new file mode 100644
index 0000000000..64b3f61710
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_strict.cfg
@@ -0,0 +1 @@
+in Input optional.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_strict.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_strict.sql
new file mode 100644
index 0000000000..e156940290
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_strict.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+use plato;
+SELECT
+ WeakField(first_num, "uint32") as num_nodef,
+ WeakField(first_num, "uint32", 11) as num_def,
+ WeakField(first_null, "uint32") as null_nodef,
+ WeakField(first_null, "uint32", 42) as null_def,
+ WeakField(val, "string") as missed_nodef,
+ WeakField(val, "string", "no value") as missed_def
+FROM Input
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_to_yson.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field_to_yson.cfg
new file mode 100644
index 0000000000..b1dd7b3cd5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_to_yson.cfg
@@ -0,0 +1 @@
+in Input input_other_yson.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_to_yson.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_to_yson.sql
new file mode 100644
index 0000000000..bc00acf465
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_to_yson.sql
@@ -0,0 +1,5 @@
+USE plato;
+
+SELECT
+ YQL::FromYsonSimpleType(WeakField(uiData, "Yson"), AsAtom("Uint32")) AS val
+FROM Input
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_type.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_type.sql
new file mode 100644
index 0000000000..0411ee0b98
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_type.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+use plato;
+select
+ WeakField(key, DataType("String")),
+ WeakField(subkey, OptionalType(DataType("String"))),
+ WeakField(value, "String")
+from Input;
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_wrong_types_fail.cfg b/yt/yql/tests/sql/suites/weak_field/weak_field_wrong_types_fail.cfg
new file mode 100644
index 0000000000..faca17b0b2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_wrong_types_fail.cfg
@@ -0,0 +1,2 @@
+xfail
+in Input optional.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/weak_field_wrong_types_fail.sql b/yt/yql/tests/sql/suites/weak_field/weak_field_wrong_types_fail.sql
new file mode 100644
index 0000000000..447c2a5804
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/weak_field_wrong_types_fail.sql
@@ -0,0 +1,5 @@
+/* custom error:incompatible WeakField types: Optional<Int32!=Uint32>*/
+use plato;
+SELECT
+ WeakField(first_num, "int32", 42) -- first_num column have another type
+FROM Input
diff --git a/yt/yql/tests/sql/suites/weak_field/yql-7888_input.txt.attr b/yt/yql/tests/sql/suites/weak_field/yql-7888_input.txt.attr
new file mode 100644
index 0000000000..5976cdb9c2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/yql-7888_input.txt.attr
@@ -0,0 +1,22 @@
+{
+ "_read_schema" = <"strict" = %false>[
+ {"type"="string";"name"="key"};
+ {"type"="string";"name"="subkey"};
+ {"type"="string";"name"="value"};
+ ];
+ "schema" = <"strict" = %false; "unique_keys" = %false>
+ [
+ {
+ "name" = "key";
+ "type" = "string"
+ };
+ {
+ "name" = "subkey";
+ "type" = "string"
+ };
+ {
+ "name" = "value";
+ "type" = "string"
+ }
+ ]
+}
diff --git a/yt/yql/tests/sql/suites/weak_field/yql-7888_mapfieldsubset.cfg b/yt/yql/tests/sql/suites/weak_field/yql-7888_mapfieldsubset.cfg
new file mode 100644
index 0000000000..b4421ba5f3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/yql-7888_mapfieldsubset.cfg
@@ -0,0 +1 @@
+in Input yql-7888_input.txt
diff --git a/yt/yql/tests/sql/suites/weak_field/yql-7888_mapfieldsubset.sql b/yt/yql/tests/sql/suites/weak_field/yql-7888_mapfieldsubset.sql
new file mode 100644
index 0000000000..34b7271562
--- /dev/null
+++ b/yt/yql/tests/sql/suites/weak_field/yql-7888_mapfieldsubset.sql
@@ -0,0 +1,27 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+define subquery $input() as
+ select
+ value,
+ WeakField(strongest_id, "String") as strongest_id,
+ WeakField(video_position_sec, "String") as video_position_sec,
+ key,
+ subkey
+ from concat(Input, Input)
+ where key in ("heartbeat", "show", "click")
+ and subkey in ("native", "gif");
+end define;
+
+-- Native:
+define subquery $native_show_and_clicks($input) as
+ select
+ value, strongest_id, key
+ from $input()
+ where subkey == "native"
+ and key in ("click", "show");
+end define;
+
+select count(distinct strongest_id) as native_users from $native_show_and_clicks($input);
+select count(distinct strongest_id) as native_users_with_click from $native_show_and_clicks($input) where key == "click"; \ No newline at end of file
diff --git a/yt/yql/tests/sql/suites/window/all_columns_hide_window_special_ones.sql b/yt/yql/tests/sql/suites/window/all_columns_hide_window_special_ones.sql
new file mode 100644
index 0000000000..b9b356c939
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/all_columns_hide_window_special_ones.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+use plato;
+pragma simplecolumns;
+
+select
+a.*,
+(ROW_NUMBER() over w) - 1 as position_cnt,
+lag(key) over w as pkey,
+lead(key) over w as nkey
+from Input as a
+window w as (
+ order by value desc
+)
+order by position_cnt;
diff --git a/yt/yql/tests/sql/suites/window/current/aggregations.cfg b/yt/yql/tests/sql/suites/window/current/aggregations.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/aggregations.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/current/aggregations.sql b/yt/yql/tests/sql/suites/window/current/aggregations.sql
new file mode 100644
index 0000000000..444ea196cc
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/aggregations.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ COUNT(*) over w1 as count1,
+ ListSort(AGGREGATE_LIST_DISTINCT(subkey) over w1) as agglist_distinct1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ AGGREGATE_LIST(subkey) over w2 as agglist2,
+FROM plato.Input
+WINDOW
+ w1 as (PARTITION BY key ORDER BY value),
+ w2 as ( ORDER BY value)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/current/aggregations_leadlag.cfg b/yt/yql/tests/sql/suites/window/current/aggregations_leadlag.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/aggregations_leadlag.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/current/aggregations_leadlag.sql b/yt/yql/tests/sql/suites/window/current/aggregations_leadlag.sql
new file mode 100644
index 0000000000..c73f26cb67
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/aggregations_leadlag.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ LEAD(value || value, 3) over w1 as dvalue_lead1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ LAG(cast(value as uint32)) over w2 as value_lag2,
+FROM plato.Input
+WINDOW
+ w1 as (PARTITION BY key ORDER BY value),
+ w2 as ( ORDER BY value)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/current/ansi_current.cfg b/yt/yql/tests/sql/suites/window/current/ansi_current.cfg
new file mode 100644
index 0000000000..812be3893b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/ansi_current.cfg
@@ -0,0 +1 @@
+in Input input4.txt
diff --git a/yt/yql/tests/sql/suites/window/current/ansi_current.sql b/yt/yql/tests/sql/suites/window/current/ansi_current.sql
new file mode 100644
index 0000000000..d005c57dc2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/ansi_current.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+pragma AnsiCurrentRow;
+
+SELECT
+ value,
+ key,
+ subkey,
+ SUM(cast(subkey as Int32)) over w as subkey_sum,
+FROM plato.Input
+WINDOW w AS (
+ PARTITION BY value
+ ORDER BY key
+)
+ORDER BY value, key, subkey;
diff --git a/yt/yql/tests/sql/suites/window/current/ansi_current_mixed.cfg b/yt/yql/tests/sql/suites/window/current/ansi_current_mixed.cfg
new file mode 100644
index 0000000000..812be3893b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/ansi_current_mixed.cfg
@@ -0,0 +1 @@
+in Input input4.txt
diff --git a/yt/yql/tests/sql/suites/window/current/ansi_current_mixed.sql b/yt/yql/tests/sql/suites/window/current/ansi_current_mixed.sql
new file mode 100644
index 0000000000..b89caf963f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/ansi_current_mixed.sql
@@ -0,0 +1,25 @@
+/* syntax version 1 */
+/* postgres can not */
+pragma AnsiCurrentRow;
+
+SELECT
+ value,
+ key,
+ subkey,
+ SUM(cast(subkey as Int32)) over w as subkey_sum_ansi,
+ SUM(cast(subkey as Int32)) over w1 as subkey_sum,
+ SUM(cast(subkey as Int32)) over w2 as subkey_sum_next,
+FROM plato.Input
+WINDOW w AS (
+ PARTITION BY value
+ ORDER BY key
+), w1 AS (
+ PARTITION BY value
+ ORDER BY key
+ ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
+), w2 AS (
+ PARTITION BY value
+ ORDER BY key
+ ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING
+)
+ORDER BY value, key, subkey;
diff --git a/yt/yql/tests/sql/suites/window/current/ansi_current_with_win.cfg b/yt/yql/tests/sql/suites/window/current/ansi_current_with_win.cfg
new file mode 100644
index 0000000000..812be3893b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/ansi_current_with_win.cfg
@@ -0,0 +1 @@
+in Input input4.txt
diff --git a/yt/yql/tests/sql/suites/window/current/ansi_current_with_win.sql b/yt/yql/tests/sql/suites/window/current/ansi_current_with_win.sql
new file mode 100644
index 0000000000..8baa348440
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/ansi_current_with_win.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+pragma AnsiCurrentRow;
+
+SELECT
+ value,
+ key,
+ subkey,
+ SUM(cast(subkey as Int32)) over w as subkey_sum_ansi,
+ LEAD(cast(subkey as Int32)) over w as subkey_next,
+FROM plato.Input
+WINDOW w AS (
+ PARTITION BY value
+ ORDER BY key
+)
+ORDER BY value, key, subkey;
diff --git a/yt/yql/tests/sql/suites/window/current/session.cfg b/yt/yql/tests/sql/suites/window/current/session.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/session.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/window/current/session.sql b/yt/yql/tests/sql/suites/window/current/session.sql
new file mode 100644
index 0000000000..10ae2c44d3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/session.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ user,
+ ts,
+ payload,
+ AGGREGATE_LIST(ts) over w as ts_session,
+ COUNT(1) over w as session_len,
+FROM plato.Input
+WINDOW w AS (
+ PARTITION BY user, SessionWindow(ts, 10)
+ ORDER BY ts
+)
+ORDER BY user, payload;
diff --git a/yt/yql/tests/sql/suites/window/current/session_aliases.cfg b/yt/yql/tests/sql/suites/window/current/session_aliases.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/session_aliases.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/window/current/session_aliases.sql b/yt/yql/tests/sql/suites/window/current/session_aliases.sql
new file mode 100644
index 0000000000..9aa080e22c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/session_aliases.sql
@@ -0,0 +1,21 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ user,
+ ts,
+ SessionStart() over w1 as ss1,
+ SessionStart() over w as ss,
+
+ AGGREGATE_LIST(ts) over w as ts_session,
+ COUNT(1) over w as session_len,
+FROM plato.Input
+WINDOW w AS (
+ PARTITION BY user, SessionWindow(ts, 10) as ss0
+ ORDER BY ts
+),
+w1 AS (
+ PARTITION BY SessionWindow(ts, 10), user
+ ORDER BY ts
+)
+ORDER BY user, ts, session_len;
diff --git a/yt/yql/tests/sql/suites/window/current/session_extended.cfg b/yt/yql/tests/sql/suites/window/current/session_extended.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/session_extended.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/window/current/session_extended.sql b/yt/yql/tests/sql/suites/window/current/session_extended.sql
new file mode 100644
index 0000000000..5990b4ec12
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/session_extended.sql
@@ -0,0 +1,29 @@
+/* syntax version 1 */
+/* postgres can not */
+
+$init = ($row) -> (AsStruct($row.ts ?? 0 as value, 1 as count));
+
+$calculate = ($_row, $state) -> ($state.value);
+-- split partition into two-element grooups, make session key to be cumulative sum of ts from partition start
+$update = ($row, $state) -> {
+ $state = AsStruct($state.count + 1 as count, $state.value as value);
+ $state = AsStruct($state.count as count, $state.value + ($row.ts ?? 0) as value);
+ return AsTuple(Unwrap($state.count % 2) == 1, $state);
+};
+
+
+SELECT
+ user,
+ ts,
+ payload,
+ AGGREGATE_LIST(cast(ts as string) ?? "null") over w as ts_session,
+ COUNT(1) over w as session_len,
+ SessionStart() over w as session_start,
+ SessionState() over w as session_state,
+FROM plato.Input
+WINDOW w AS (
+ PARTITION BY user, SessionWindow(ts + 1, $init, $update, $calculate)
+ ORDER BY ts
+)
+ORDER BY user, payload;
+
diff --git a/yt/yql/tests/sql/suites/window/current/session_incompat_sort.cfg b/yt/yql/tests/sql/suites/window/current/session_incompat_sort.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/session_incompat_sort.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/window/current/session_incompat_sort.sql b/yt/yql/tests/sql/suites/window/current/session_incompat_sort.sql
new file mode 100644
index 0000000000..81efa941a6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/current/session_incompat_sort.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ user,
+ ts,
+ payload,
+ AGGREGATE_LIST(ts) over w as ts_session,
+ COUNT(1) over w as session_len,
+ SessionStart() over w as session_start,
+FROM plato.Input
+WINDOW w AS (
+ PARTITION BY SessionWindow(ts, 10), user
+ ORDER BY payload
+)
+ORDER BY user, payload;
diff --git a/yt/yql/tests/sql/suites/window/default.cfg b/yt/yql/tests/sql/suites/window/default.cfg
new file mode 100644
index 0000000000..0b7e11f3c5
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/default.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+in Input4 input4.txt
diff --git a/yt/yql/tests/sql/suites/window/distinct_over_window.cfg b/yt/yql/tests/sql/suites/window/distinct_over_window.cfg
new file mode 100644
index 0000000000..ed883e79be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/distinct_over_window.cfg
@@ -0,0 +1 @@
+in Input input3.txt
diff --git a/yt/yql/tests/sql/suites/window/distinct_over_window.sql b/yt/yql/tests/sql/suites/window/distinct_over_window.sql
new file mode 100644
index 0000000000..536db81911
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/distinct_over_window.sql
@@ -0,0 +1,20 @@
+/* syntax version 1 */
+/* postgres can not */
+
+USE plato;
+
+PRAGMA DistinctOverWindow;
+
+$input = (SELECT cast(key AS Int32) AS key, cast(subkey AS Int32) AS subkey, value FROM Input);
+
+SELECT
+ subkey,
+ key,
+ value,
+ -- assuming ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
+ count(DISTINCT key) OVER (PARTITION BY subkey ORDER BY key) AS count_by_key,
+ count(DISTINCT value || "force_preagg") OVER (PARTITION BY subkey ORDER BY key) AS count_by_value,
+ sum(DISTINCT key) OVER (PARTITION BY subkey ORDER BY key) AS sum,
+ median(DISTINCT key) OVER (PARTITION BY subkey ORDER BY key) AS median,
+FROM $input
+ORDER BY subkey, key, value;
diff --git a/yt/yql/tests/sql/suites/window/distinct_over_window_full_frames.cfg b/yt/yql/tests/sql/suites/window/distinct_over_window_full_frames.cfg
new file mode 100644
index 0000000000..ed883e79be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/distinct_over_window_full_frames.cfg
@@ -0,0 +1 @@
+in Input input3.txt
diff --git a/yt/yql/tests/sql/suites/window/distinct_over_window_full_frames.sql b/yt/yql/tests/sql/suites/window/distinct_over_window_full_frames.sql
new file mode 100644
index 0000000000..973a23db8c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/distinct_over_window_full_frames.sql
@@ -0,0 +1,22 @@
+/* syntax version 1 */
+/* postgres can not */
+
+USE plato;
+
+PRAGMA DistinctOverWindow;
+
+$input = (SELECT cast(key AS Int32) AS key, cast(subkey AS Int32) AS subkey, value FROM Input);
+
+SELECT
+ subkey,
+ key,
+ value,
+ -- assuming ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
+ count(DISTINCT key) OVER () AS cnt_distinct_total,
+ sum(DISTINCT key) OVER () AS sum_distinct_total,
+ median(DISTINCT key) OVER () AS median_distinct_total,
+ count(DISTINCT key) OVER (PARTITION BY subkey) AS cnt_distinct_part,
+ sum(DISTINCT key) OVER (PARTITION BY subkey) AS sum_distinct_part,
+ median(DISTINCT key) OVER (PARTITION BY subkey) AS median_distinct_part,
+FROM $input
+ORDER BY subkey, key, value;
diff --git a/yt/yql/tests/sql/suites/window/distinct_over_window_struct.sql b/yt/yql/tests/sql/suites/window/distinct_over_window_struct.sql
new file mode 100644
index 0000000000..57e76a0935
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/distinct_over_window_struct.sql
@@ -0,0 +1,37 @@
+/* syntax version 1 */
+/* postgres can not */
+
+USE plato;
+
+PRAGMA DistinctOverWindow;
+
+$input = AsList(
+ AsStruct(1 AS key, 1 AS subkey, AsStruct(1 AS i1, 2 AS i2, 3 AS i3) AS col),
+ AsStruct(2 AS key, 1 AS subkey, AsStruct(1 AS i1, 2 AS i2, 3 AS i3) AS col),
+ AsStruct(3 AS key, 1 AS subkey, AsStruct(1 AS i1, 2 AS i2, 3 AS i3) AS col),
+ AsStruct(4 AS key, 2 AS subkey, AsStruct(3 AS i1, 4 AS i2, 5 AS i3) AS col),
+ AsStruct(5 AS key, 2 AS subkey, AsStruct(3 AS i1, 4 AS i2, 5 AS i3) AS col),
+ AsStruct(6 AS key, 2 AS subkey, AsStruct(5 AS i1, 5 AS i2, 5 AS i3) AS col),
+ AsStruct(7 AS key, 3 AS subkey, AsStruct(5 AS i1, 6 AS i2, 7 AS i3) AS col),
+ AsStruct(8 AS key, 3 AS subkey, AsStruct(6 AS i1, 7 AS i2, 8 AS i3) AS col),
+ AsStruct(9 AS key, 3 AS subkey, AsStruct(7 AS i1, 8 AS i2, 9 AS i3) AS col),
+);
+
+SELECT
+ key,
+ subkey,
+ col,
+ -- assuming ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
+ count(DISTINCT col) OVER (PARTITION BY subkey ORDER BY key ASC) AS cnt1_asc,
+ count(DISTINCT col) OVER (PARTITION BY subkey ORDER BY key DESC) AS cnt2_desc,
+FROM AS_TABLE($input)
+ORDER BY key;
+
+SELECT
+ key,
+ subkey,
+ col,
+ -- assuming ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
+ count(DISTINCT col) OVER (PARTITION BY subkey) AS cnt,
+FROM AS_TABLE($input)
+ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/window/empty/aggregations.cfg b/yt/yql/tests/sql/suites/window/empty/aggregations.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/empty/aggregations.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/empty/aggregations.sql b/yt/yql/tests/sql/suites/window/empty/aggregations.sql
new file mode 100644
index 0000000000..673e724f83
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/empty/aggregations.sql
@@ -0,0 +1,18 @@
+/* syntax version 1 */
+/* postgres can not */
+
+PRAGMA warning("disable", "4520");
+
+SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ COUNT(*) over w1 as count1,
+ ListSort(AGGREGATE_LIST_DISTINCT(subkey) over w1) as agglist_distinct1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ AGGREGATE_LIST(subkey) over w2 as agglist2,
+FROM plato.Input
+WINDOW
+ w1 as (PARTITION BY key ORDER BY value ROWS BETWEEN 5 PRECEDING AND 10 PRECEDING),
+ w2 as ( ROWS BETWEEN 3 FOLLOWING AND 2 FOLLOWING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/empty/aggregations_leadlag.cfg b/yt/yql/tests/sql/suites/window/empty/aggregations_leadlag.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/empty/aggregations_leadlag.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/empty/aggregations_leadlag.sql b/yt/yql/tests/sql/suites/window/empty/aggregations_leadlag.sql
new file mode 100644
index 0000000000..c305328b8b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/empty/aggregations_leadlag.sql
@@ -0,0 +1,17 @@
+/* syntax version 1 */
+/* postgres can not */
+
+PRAGMA warning("disable", "4520");
+
+SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ LEAD(value || value, 3) over w1 as dvalue_lead1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ LAG(cast(value as uint32)) over w2 as value_lag2,
+FROM plato.Input
+WINDOW
+ w1 as (PARTITION BY key ORDER BY value ROWS BETWEEN 5 PRECEDING AND 10 PRECEDING),
+ w2 as (ORDER BY value DESC ROWS BETWEEN 3 FOLLOWING AND 2 FOLLOWING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/full/aggregations.cfg b/yt/yql/tests/sql/suites/window/full/aggregations.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/aggregations.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/full/aggregations.sql b/yt/yql/tests/sql/suites/window/full/aggregations.sql
new file mode 100644
index 0000000000..b413db5f7c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/aggregations.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ COUNT(*) over w1 as count1,
+ ListSort(AGGREGATE_LIST_DISTINCT(subkey) over w1) as agglist_distinct1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ AGGREGATE_LIST(subkey) over w2 as agglist2,
+FROM (SELECT * FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (),
+ w2 as (PARTITION BY key ORDER BY value DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/full/aggregations_compact.cfg b/yt/yql/tests/sql/suites/window/full/aggregations_compact.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/aggregations_compact.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/full/aggregations_compact.sql b/yt/yql/tests/sql/suites/window/full/aggregations_compact.sql
new file mode 100644
index 0000000000..1c18473298
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/aggregations_compact.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ COUNT(*) over w1 as count1,
+ ListSort(AGGREGATE_LIST_DISTINCT(subkey) over w1) as agglist_distinct1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ AGGREGATE_LIST(subkey) over w2 as agglist2,
+FROM (SELECT * FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (PARTITION COMPACT BY ()),
+ w2 as (PARTITION COMPACT BY key ORDER BY value DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/full/aggregations_leadlag.cfg b/yt/yql/tests/sql/suites/window/full/aggregations_leadlag.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/aggregations_leadlag.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/full/aggregations_leadlag.sql b/yt/yql/tests/sql/suites/window/full/aggregations_leadlag.sql
new file mode 100644
index 0000000000..413e1a0ddd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/aggregations_leadlag.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ LEAD(value || value, 3) over w1 as dvalue_lead1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ LAG(cast(value as uint32)) over w2 as value_lag2,
+FROM (SELECT * FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
+ w2 as (PARTITION BY key ORDER BY value DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/full/aggregations_leadlag_compact.cfg b/yt/yql/tests/sql/suites/window/full/aggregations_leadlag_compact.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/aggregations_leadlag_compact.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/full/aggregations_leadlag_compact.sql b/yt/yql/tests/sql/suites/window/full/aggregations_leadlag_compact.sql
new file mode 100644
index 0000000000..c68f9946a1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/aggregations_leadlag_compact.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ LEAD(value || value, 3) over w1 as dvalue_lead1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ LAG(cast(value as uint32)) over w2 as value_lag2,
+FROM (SELECT * FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (PARTITION COMPACT BY () ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
+ w2 as (PARTITION COMPACT BY key ORDER BY value DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/full/leadlag.cfg b/yt/yql/tests/sql/suites/window/full/leadlag.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/leadlag.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/full/leadlag.sql b/yt/yql/tests/sql/suites/window/full/leadlag.sql
new file mode 100644
index 0000000000..1fccdfd276
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/leadlag.sql
@@ -0,0 +1,17 @@
+/* syntax version 1 */
+/* postgres can not */
+
+$in = SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ LEAD(value || value, 3) over w1 as dvalue_lead1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ LAG(cast(value as uint32)) over w2 as value_lag2,
+FROM (SELECT * FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
+ w2 as (PARTITION BY key ORDER BY value DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
+;
+
+SELECT value, dvalue_lead1, value_lag2 FROM $in ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/full/leadlag_compact.cfg b/yt/yql/tests/sql/suites/window/full/leadlag_compact.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/leadlag_compact.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/full/leadlag_compact.sql b/yt/yql/tests/sql/suites/window/full/leadlag_compact.sql
new file mode 100644
index 0000000000..45a8a6232f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/leadlag_compact.sql
@@ -0,0 +1,17 @@
+/* syntax version 1 */
+/* postgres can not */
+
+$in = SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ LEAD(value || value, 3) over w1 as dvalue_lead1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ LAG(cast(value as uint32)) over w2 as value_lag2,
+FROM (SELECT * FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (PARTITION /*+ COMPACT() */ BY () ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
+ w2 as (PARTITION COMPACT BY key ORDER BY value DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
+;
+
+SELECT value, dvalue_lead1, value_lag2 FROM $in ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/full/noncompact_with_nulls.cfg b/yt/yql/tests/sql/suites/window/full/noncompact_with_nulls.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/noncompact_with_nulls.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/full/noncompact_with_nulls.sql b/yt/yql/tests/sql/suites/window/full/noncompact_with_nulls.sql
new file mode 100644
index 0000000000..019551ef7e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/noncompact_with_nulls.sql
@@ -0,0 +1,23 @@
+/* syntax version 1 */
+/* postgres can not */
+
+$input = (
+SELECT * FROM plato.Input WHERE key = '1'
+UNION ALL
+SELECT NULL AS key, "9" as subkey, "000" as value
+UNION ALL
+SELECT NULL AS key, "9" as subkey, "001" as value
+);
+
+
+SELECT
+ key,
+ subkey,
+ value,
+
+ AGGREGATE_LIST(value) over w1 as agglist1,
+
+FROM $input
+WINDOW
+ w1 as (PARTITION BY key, subkey ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/full/noncompact_with_nulls_tuple_key.cfg b/yt/yql/tests/sql/suites/window/full/noncompact_with_nulls_tuple_key.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/noncompact_with_nulls_tuple_key.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/full/noncompact_with_nulls_tuple_key.sql b/yt/yql/tests/sql/suites/window/full/noncompact_with_nulls_tuple_key.sql
new file mode 100644
index 0000000000..81c3fe43ff
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/noncompact_with_nulls_tuple_key.sql
@@ -0,0 +1,23 @@
+/* syntax version 1 */
+/* postgres can not */
+
+$input = (
+SELECT * FROM plato.Input WHERE key = '1'
+UNION ALL
+SELECT NULL AS key, "9" as subkey, "000" as value
+UNION ALL
+SELECT NULL AS key, "9" as subkey, "001" as value
+);
+
+
+SELECT
+ key,
+ subkey,
+ value,
+
+ AGGREGATE_LIST(value) over w1 as agglist1,
+
+FROM $input
+WINDOW
+ w1 as (PARTITION BY (key, subkey) as pkey ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/full/noncompact_with_tablerow.cfg b/yt/yql/tests/sql/suites/window/full/noncompact_with_tablerow.cfg
new file mode 100644
index 0000000000..bcf4082c5c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/noncompact_with_tablerow.cfg
@@ -0,0 +1 @@
+in Input input_optkey2.txt
diff --git a/yt/yql/tests/sql/suites/window/full/noncompact_with_tablerow.sql b/yt/yql/tests/sql/suites/window/full/noncompact_with_tablerow.sql
new file mode 100644
index 0000000000..1b3778fc96
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/noncompact_with_tablerow.sql
@@ -0,0 +1,14 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ key,
+ subkey,
+ value,
+
+ AGGREGATE_LIST(TableRow()) OVER w AS frame,
+
+FROM plato.Input
+WINDOW
+ w as (PARTITION BY key, subkey ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/full/session.cfg b/yt/yql/tests/sql/suites/window/full/session.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/session.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/window/full/session.sql b/yt/yql/tests/sql/suites/window/full/session.sql
new file mode 100644
index 0000000000..76ee7bd0c8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/session.sql
@@ -0,0 +1,21 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+-- add non-optional partition key
+$src = SELECT t.*, user ?? "u0" as user_nonopt FROM Input as t;
+
+SELECT
+ user,
+ user_nonopt,
+ ts,
+ payload,
+ AGGREGATE_LIST(TableRow()) over w as full_session,
+ COUNT(1) over w as session_len,
+FROM $src
+WINDOW w AS (
+ PARTITION BY user, user_nonopt, SessionWindow(ts, 10)
+ ORDER BY ts
+ ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
+)
+ORDER BY user, payload;
diff --git a/yt/yql/tests/sql/suites/window/full/session_aliases.cfg b/yt/yql/tests/sql/suites/window/full/session_aliases.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/session_aliases.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/window/full/session_aliases.sql b/yt/yql/tests/sql/suites/window/full/session_aliases.sql
new file mode 100644
index 0000000000..b809c6b534
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/session_aliases.sql
@@ -0,0 +1,19 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ user,
+ ts,
+ SessionStart() over w1 as ss1,
+ SessionStart() over w as ss,
+
+ ListSort(AGGREGATE_LIST(ts) over w) as ts_session,
+ COUNT(1) over w as session_len,
+FROM plato.Input
+WINDOW w AS (
+ PARTITION BY user, SessionWindow(ts, 10) as ss0
+),
+w1 AS (
+ PARTITION BY SessionWindow(ts, 10), user
+)
+ORDER BY user, ts;
diff --git a/yt/yql/tests/sql/suites/window/full/session_aliases_compact.cfg b/yt/yql/tests/sql/suites/window/full/session_aliases_compact.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/session_aliases_compact.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/window/full/session_aliases_compact.sql b/yt/yql/tests/sql/suites/window/full/session_aliases_compact.sql
new file mode 100644
index 0000000000..2bd49f12f1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/session_aliases_compact.sql
@@ -0,0 +1,19 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ user,
+ ts,
+ SessionStart() over w1 as ss1,
+ SessionStart() over w as ss,
+
+ ListSort(AGGREGATE_LIST(ts) over w) as ts_session,
+ COUNT(1) over w as session_len,
+FROM plato.Input
+WINDOW w AS (
+ PARTITION COMPACT BY user, SessionWindow(ts, 10) as ss0
+),
+w1 AS (
+ PARTITION COMPACT BY SessionWindow(ts, 10), user
+)
+ORDER BY user, ts;
diff --git a/yt/yql/tests/sql/suites/window/full/session_compact.cfg b/yt/yql/tests/sql/suites/window/full/session_compact.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/session_compact.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/window/full/session_compact.sql b/yt/yql/tests/sql/suites/window/full/session_compact.sql
new file mode 100644
index 0000000000..8c86df8e1c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/session_compact.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ user,
+ ts,
+ payload,
+ AGGREGATE_LIST(ts) over w as ts_session,
+ COUNT(1) over w as session_len,
+FROM plato.Input
+WINDOW w AS (
+ PARTITION COMPACT BY user, SessionWindow(ts, 10)
+ ORDER BY ts
+ ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
+)
+ORDER BY user, payload;
diff --git a/yt/yql/tests/sql/suites/window/full/session_incompat_sort.cfg b/yt/yql/tests/sql/suites/window/full/session_incompat_sort.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/session_incompat_sort.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/window/full/session_incompat_sort.sql b/yt/yql/tests/sql/suites/window/full/session_incompat_sort.sql
new file mode 100644
index 0000000000..6280f571af
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/session_incompat_sort.sql
@@ -0,0 +1,21 @@
+/* syntax version 1 */
+/* postgres can not */
+USE plato;
+
+-- add non-optional partition key
+$src = SELECT t.*, user ?? "u0" as user_nonopt FROM Input as t;
+
+SELECT
+ user,
+ user_nonopt,
+ ts,
+ payload,
+ AGGREGATE_LIST(TableRow()) over w as full_session,
+ COUNT(1) over w as session_len,
+FROM $src
+WINDOW w AS (
+ PARTITION BY user, user_nonopt, SessionWindow(ts, 10)
+ ORDER BY ts DESC
+ ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
+)
+ORDER BY user, payload;
diff --git a/yt/yql/tests/sql/suites/window/full/syscolumns.cfg b/yt/yql/tests/sql/suites/window/full/syscolumns.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/syscolumns.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/full/syscolumns.sql b/yt/yql/tests/sql/suites/window/full/syscolumns.sql
new file mode 100644
index 0000000000..d2533c062b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/full/syscolumns.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+select
+ value,
+ max(value) over (partition by cast(TableName() as Utf8)),
+ cast(TableName() as Utf8),
+from Input order by value;
+
+select
+ value,
+ max(value) over (order by cast(TableName() as Utf8) rows between unbounded preceding and unbounded following),
+ cast(TableName() as Utf8),
+from Input order by value;
diff --git a/yt/yql/tests/sql/suites/window/generic/aggregations_after_current.cfg b/yt/yql/tests/sql/suites/window/generic/aggregations_after_current.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/generic/aggregations_after_current.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/generic/aggregations_after_current.sql b/yt/yql/tests/sql/suites/window/generic/aggregations_after_current.sql
new file mode 100644
index 0000000000..aca3f1c6e6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/generic/aggregations_after_current.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ COUNT(*) over w1 as count1,
+ ListSort(AGGREGATE_LIST_DISTINCT(subkey) over w1) as agglist_distinct1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ AGGREGATE_LIST(subkey) over w2 as agglist2,
+FROM (SELECT * FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (PARTITION BY key ORDER BY value ROWS BETWEEN 3 FOLLOWING AND 5 FOLLOWING),
+ w2 as (PARTITION BY key ORDER BY value ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/generic/aggregations_before_current.cfg b/yt/yql/tests/sql/suites/window/generic/aggregations_before_current.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/generic/aggregations_before_current.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/generic/aggregations_before_current.sql b/yt/yql/tests/sql/suites/window/generic/aggregations_before_current.sql
new file mode 100644
index 0000000000..e3adba7ded
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/generic/aggregations_before_current.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ COUNT(*) over w1 as count1,
+ ListSort(AGGREGATE_LIST_DISTINCT(subkey) over w1) as agglist_distinct1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ AGGREGATE_LIST(subkey) over w2 as agglist2,
+FROM (SELECT * FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (PARTITION BY key ORDER BY value ROWS BETWEEN 5 PRECEDING AND 3 PRECEDING),
+ w2 as (PARTITION BY key ORDER BY value ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/generic/aggregations_include_current.cfg b/yt/yql/tests/sql/suites/window/generic/aggregations_include_current.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/generic/aggregations_include_current.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/generic/aggregations_include_current.sql b/yt/yql/tests/sql/suites/window/generic/aggregations_include_current.sql
new file mode 100644
index 0000000000..8b43cd6699
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/generic/aggregations_include_current.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ COUNT(*) over w1 as count1,
+ ListSort(AGGREGATE_LIST_DISTINCT(subkey) over w1) as agglist_distinct1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ AGGREGATE_LIST(subkey) over w2 as agglist2,
+FROM (SELECT * FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (PARTITION BY key ORDER BY value ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING),
+ w2 as (PARTITION BY key ORDER BY value ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/generic/aggregations_mixed.cfg b/yt/yql/tests/sql/suites/window/generic/aggregations_mixed.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/generic/aggregations_mixed.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/generic/aggregations_mixed.sql b/yt/yql/tests/sql/suites/window/generic/aggregations_mixed.sql
new file mode 100644
index 0000000000..f301c179de
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/generic/aggregations_mixed.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ COUNT(*) over w1 as count1,
+ ListSort(AGGREGATE_LIST_DISTINCT(subkey) over w1) as agglist_distinct1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ AGGREGATE_LIST(subkey) over w2 as agglist2,
+FROM (SELECT * FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (PARTITION BY key ORDER BY value ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING),
+ w2 as (PARTITION BY key ORDER BY value ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/generic/aggregations_mixed_leadlag.cfg b/yt/yql/tests/sql/suites/window/generic/aggregations_mixed_leadlag.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/generic/aggregations_mixed_leadlag.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/generic/aggregations_mixed_leadlag.sql b/yt/yql/tests/sql/suites/window/generic/aggregations_mixed_leadlag.sql
new file mode 100644
index 0000000000..2b744948ca
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/generic/aggregations_mixed_leadlag.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ LEAD(value || value, 3) over w1 as dvalue_lead1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ LAG(cast(value as uint32)) over w2 as value_lag2,
+FROM (SELECT * FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (PARTITION BY key ORDER BY value ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING),
+ w2 as (PARTITION BY key ORDER BY value ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/generic/session.cfg b/yt/yql/tests/sql/suites/window/generic/session.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/generic/session.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/window/generic/session.sql b/yt/yql/tests/sql/suites/window/generic/session.sql
new file mode 100644
index 0000000000..998f12e1ea
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/generic/session.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ user,
+ ts,
+ payload,
+ AGGREGATE_LIST(ts) over w as ts_session,
+ COUNT(1) over w as session_len,
+FROM plato.Input
+WINDOW w AS (
+ PARTITION BY user, SessionWindow(ts, 10)
+ ORDER BY ts
+ ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
+)
+ORDER BY user, payload;
diff --git a/yt/yql/tests/sql/suites/window/generic/session_aliases.cfg b/yt/yql/tests/sql/suites/window/generic/session_aliases.cfg
new file mode 100644
index 0000000000..c788a7d1ec
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/generic/session_aliases.cfg
@@ -0,0 +1 @@
+in Input session1.txt
diff --git a/yt/yql/tests/sql/suites/window/generic/session_aliases.sql b/yt/yql/tests/sql/suites/window/generic/session_aliases.sql
new file mode 100644
index 0000000000..2375d56064
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/generic/session_aliases.sql
@@ -0,0 +1,23 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ user,
+ ts,
+ SessionStart() over w1 as ss1,
+ SessionStart() over w as ss,
+
+ AGGREGATE_LIST(ts) over w as ts_session,
+ COUNT(1) over w as session_len,
+FROM plato.Input
+WINDOW w AS (
+ PARTITION BY user, SessionWindow(ts, 10) as ss0
+ ORDER BY ts
+ ROWS BETWEEN 10 PRECEDING AND 10 FOLLOWING
+),
+w1 AS (
+ PARTITION BY SessionWindow(ts, 10), user
+ ORDER BY ts
+ ROWS BETWEEN 100 PRECEDING AND 100 FOLLOWING
+)
+ORDER BY user, ts;
diff --git a/yt/yql/tests/sql/suites/window/input_optkey1.txt.attr b/yt/yql/tests/sql/suites/window/input_optkey1.txt.attr
new file mode 100644
index 0000000000..1ca6ee6155
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/input_optkey1.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["DataType";"Int32"]];
+ ["optkey";["OptionalType";["DataType";"Int32"]]];
+ ["value";["DataType";"String"]]]
+ ];
+}}
diff --git a/yt/yql/tests/sql/suites/window/input_optkey2.txt.attr b/yt/yql/tests/sql/suites/window/input_optkey2.txt.attr
new file mode 100644
index 0000000000..14e8d693aa
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/input_optkey2.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key";["OptionalType";["DataType";"Int32"]]];
+ ["subkey";["DataType";"Uint32"]];
+ ["value";["DataType";"String"]]]
+ ];
+}}
diff --git a/yt/yql/tests/sql/suites/window/lagging/aggregations.cfg b/yt/yql/tests/sql/suites/window/lagging/aggregations.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/lagging/aggregations.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/lagging/aggregations.sql b/yt/yql/tests/sql/suites/window/lagging/aggregations.sql
new file mode 100644
index 0000000000..bd38e584e8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/lagging/aggregations.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ COUNT(*) over w1 as count1,
+ ListSort(AGGREGATE_LIST_DISTINCT(subkey) over w1) as agglist_distinct1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ AGGREGATE_LIST(subkey) over w2 as agglist2,
+FROM (SELECT * FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (PARTITION BY key ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND 3 PRECEDING),
+ w2 as (PARTITION BY key ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/lagging/aggregations_leadlag.cfg b/yt/yql/tests/sql/suites/window/lagging/aggregations_leadlag.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/lagging/aggregations_leadlag.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/lagging/aggregations_leadlag.sql b/yt/yql/tests/sql/suites/window/lagging/aggregations_leadlag.sql
new file mode 100644
index 0000000000..f87bf21f0e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/lagging/aggregations_leadlag.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ LEAD(value || value, 3) over w1 as dvalue_lead1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ LAG(cast(value as uint32)) over w2 as value_lag2,
+FROM (SELECT * FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (PARTITION BY key ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND 3 PRECEDING),
+ w2 as (PARTITION BY key ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/leading/aggregations.cfg b/yt/yql/tests/sql/suites/window/leading/aggregations.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/leading/aggregations.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/leading/aggregations.sql b/yt/yql/tests/sql/suites/window/leading/aggregations.sql
new file mode 100644
index 0000000000..9e2fb4090d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/leading/aggregations.sql
@@ -0,0 +1,16 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ COUNT(*) over w1 as count1,
+ ListSort(AGGREGATE_LIST_DISTINCT(subkey) over w1) as agglist_distinct1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ AGGREGATE_LIST(subkey) over w2 as agglist2,
+FROM (SELECT * FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (PARTITION BY key ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND 3 FOLLOWING),
+ w2 as (PARTITION BY key ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/leading/aggregations_leadlag.cfg b/yt/yql/tests/sql/suites/window/leading/aggregations_leadlag.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/leading/aggregations_leadlag.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/leading/aggregations_leadlag.sql b/yt/yql/tests/sql/suites/window/leading/aggregations_leadlag.sql
new file mode 100644
index 0000000000..23f6c5ae87
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/leading/aggregations_leadlag.sql
@@ -0,0 +1,15 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ value,
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ LEAD(value || value, 3) over w1 as dvalue_lead1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ LAG(cast(value as uint32)) over w2 as value_lag2,
+FROM (SELECT * FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (PARTITION BY key ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND 3 FOLLOWING),
+ w2 as (PARTITION BY key ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/mixed/aggregations.cfg b/yt/yql/tests/sql/suites/window/mixed/aggregations.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/mixed/aggregations.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/mixed/aggregations.sql b/yt/yql/tests/sql/suites/window/mixed/aggregations.sql
new file mode 100644
index 0000000000..d54d034301
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/mixed/aggregations.sql
@@ -0,0 +1,17 @@
+/* syntax version 1 */
+/* postgres can not */
+
+SELECT
+ value,
+
+ SUM(unwrap(cast(subkey as uint32))) over w1 as sum1,
+ AGGREGATE_LIST(subkey) over w1 as agglist1,
+
+ SUM(cast(subkey as uint32)) over w2 as sum2,
+ AGGREGATE_LIST(subkey) over w2 as agglist2,
+
+FROM (SELECT * FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (PARTITION BY key ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
+ w2 as (PARTITION BY key ORDER BY value ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
+ORDER BY value;
diff --git a/yt/yql/tests/sql/suites/window/p_int32.json b/yt/yql/tests/sql/suites/window/p_int32.json
new file mode 100644
index 0000000000..18d17df026
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/p_int32.json
@@ -0,0 +1 @@
+"3"
diff --git a/yt/yql/tests/sql/suites/window/presort_window_order_by_table.sql b/yt/yql/tests/sql/suites/window/presort_window_order_by_table.sql
new file mode 100644
index 0000000000..a635674af9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/presort_window_order_by_table.sql
@@ -0,0 +1,16 @@
+/* postgres can not */
+use plato;
+
+$list = AsList(
+ AsList(3,1),
+ AsList(1,1),
+ AsList(1),
+ );
+
+insert into @foo
+select x from (select $list as x)
+flatten by x;
+commit;
+select x,row_number() over w as r from @foo
+window w as (order by x asc);
+
diff --git a/yt/yql/tests/sql/suites/window/presort_window_partition_by_table.sql b/yt/yql/tests/sql/suites/window/presort_window_partition_by_table.sql
new file mode 100644
index 0000000000..402496130b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/presort_window_partition_by_table.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+use plato;
+SELECT
+ key, row_number() over w
+FROM (SELECT AsList(key) as key, value from Input)
+WINDOW w AS (partition by key order by value)
+ORDER BY key;
diff --git a/yt/yql/tests/sql/suites/window/rank/opt.cfg b/yt/yql/tests/sql/suites/window/rank/opt.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/rank/opt.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/rank/opt.sql b/yt/yql/tests/sql/suites/window/rank/opt.sql
new file mode 100644
index 0000000000..3260ffb6ea
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/rank/opt.sql
@@ -0,0 +1,23 @@
+/* syntax version 1 */
+/* postgres can not */
+
+PRAGMA warning("disable", "4520");
+PRAGMA AnsiRankForNullableKeys;
+
+SELECT
+ key,
+ subkey,
+ RANK() over w1 as r1,
+ DENSE_RANK() over w1 as r2,
+ RANK(subkey) over w1 as r3,
+ DENSE_RANK(subkey) over w1 as r4,
+
+ RANK() over w2 as r5,
+ DENSE_RANK() over w2 as r6,
+ RANK(subkey || subkey) over w2 as r7,
+ DENSE_RANK(subkey || subkey) over w2 as r8,
+FROM (SELECT cast(key as uint32) as key, subkey, value FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (PARTITION BY key ORDER BY subkey ROWS BETWEEN UNBOUNDED PRECEDING AND 5 PRECEDING),
+ w2 as ( ORDER BY key, subkey ROWS BETWEEN 3 FOLLOWING AND 2 FOLLOWING)
+ORDER BY key,subkey;
diff --git a/yt/yql/tests/sql/suites/window/rank/plain.cfg b/yt/yql/tests/sql/suites/window/rank/plain.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/rank/plain.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/rank/plain.sql b/yt/yql/tests/sql/suites/window/rank/plain.sql
new file mode 100644
index 0000000000..dee09aefe6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/rank/plain.sql
@@ -0,0 +1,23 @@
+/* syntax version 1 */
+/* postgres can not */
+
+PRAGMA warning("disable", "4520");
+PRAGMA AnsiRankForNullableKeys;
+
+SELECT
+ key,
+ subkey,
+ RANK() over w1 as r1,
+ DENSE_RANK() over w1 as r2,
+ RANK(subkey) over w1 as r3,
+ DENSE_RANK(subkey) over w1 as r4,
+
+ RANK() over w2 as r5,
+ DENSE_RANK() over w2 as r6,
+ RANK(subkey || subkey) over w2 as r7,
+ DENSE_RANK(subkey || subkey) over w2 as r8,
+FROM (SELECT * FROM plato.Input WHERE key = '1')
+WINDOW
+ w1 as (PARTITION BY key ORDER BY subkey ROWS BETWEEN UNBOUNDED PRECEDING AND 5 PRECEDING),
+ w2 as ( ORDER BY key, subkey ROWS BETWEEN 3 FOLLOWING AND 2 FOLLOWING)
+ORDER BY key,subkey;
diff --git a/yt/yql/tests/sql/suites/window/rank/unordered.cfg b/yt/yql/tests/sql/suites/window/rank/unordered.cfg
new file mode 100644
index 0000000000..000848a05d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/rank/unordered.cfg
@@ -0,0 +1 @@
+in Input input5.txt
diff --git a/yt/yql/tests/sql/suites/window/rank/unordered.sql b/yt/yql/tests/sql/suites/window/rank/unordered.sql
new file mode 100644
index 0000000000..c8213f505e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/rank/unordered.sql
@@ -0,0 +1,20 @@
+/* syntax version 1 */
+/* postgres can not */
+
+PRAGMA warning("disable", "4520");
+PRAGMA warning("disable", "4521");
+PRAGMA AnsiRankForNullableKeys;
+
+SELECT
+ key,
+ subkey,
+ RANK() over w1 as r1,
+ DENSE_RANK() over w1 as r2,
+
+ RANK() over w2 as r3,
+ DENSE_RANK() over w2 as r4,
+FROM plato.Input
+WINDOW
+ w1 as (PARTITION BY key ROWS BETWEEN UNBOUNDED PRECEDING AND 5 PRECEDING),
+ w2 as ( ROWS BETWEEN 3 FOLLOWING AND 2 FOLLOWING)
+ORDER BY key,subkey;
diff --git a/yt/yql/tests/sql/suites/window/row_number_no_part_from_subq.sql b/yt/yql/tests/sql/suites/window/row_number_no_part_from_subq.sql
new file mode 100644
index 0000000000..1b767deceb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/row_number_no_part_from_subq.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+USE plato;
+
+SELECT key, ROW_NUMBER() OVER w AS row_num
+FROM (select * from Input where key != "020")
+WINDOW w AS ();
diff --git a/yt/yql/tests/sql/suites/window/row_number_no_part_multi_input.sql b/yt/yql/tests/sql/suites/window/row_number_no_part_multi_input.sql
new file mode 100644
index 0000000000..df8eebf750
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/row_number_no_part_multi_input.sql
@@ -0,0 +1,25 @@
+/* postgres can not */
+USE plato;
+
+insert into @foo select * from Input;
+
+commit;
+
+$input = (
+ select * from Input where key != "020"
+ union all
+ select * from @foo
+ union all
+ select * from Input
+);
+
+$output = SELECT key, ROW_NUMBER() OVER w AS row_num
+FROM $input
+WINDOW w AS ();
+
+select
+ min(key) as min_key,
+ count(distinct row_num) as dist_rn,
+ min(row_num) as min_rn,
+ max(row_num) as max_rn,
+from $output;
diff --git a/yt/yql/tests/sql/suites/window/row_number_to_map.sql b/yt/yql/tests/sql/suites/window/row_number_to_map.sql
new file mode 100644
index 0000000000..914b36e574
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/row_number_to_map.sql
@@ -0,0 +1,18 @@
+/* postgres can not */
+/* syntax version 1 */
+
+USE plato;
+
+SELECT key, subkey,
+ ROW_NUMBER() OVER w1 AS rn1,
+ ROW_NUMBER() OVER w2 AS rn2,
+ COUNT(*) OVER w2 AS w2_cnt,
+ ROW_NUMBER() OVER w3 AS rn3,
+ ROW_NUMBER() OVER w4 AS rn4,
+FROM Input
+WINDOW
+ w1 AS (),
+ w2 AS (ORDER BY subkey ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
+ w3 AS (ORDER BY subkey DESC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW),
+ w4 AS (ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)
+ORDER BY subkey;
diff --git a/yt/yql/tests/sql/suites/window/row_number_to_map_multiple.sql b/yt/yql/tests/sql/suites/window/row_number_to_map_multiple.sql
new file mode 100644
index 0000000000..979699b5af
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/row_number_to_map_multiple.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+/* syntax version 1 */
+
+USE plato;
+
+SELECT key, subkey,
+ ROW_NUMBER() OVER w1 AS rn1,
+ ROW_NUMBER() OVER w2 AS rn2,
+ ROW_NUMBER() OVER w3 AS rn3,
+FROM Input
+WINDOW
+ w1 AS (),
+ w2 AS (ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
+ w3 AS (ORDER BY subkey DESC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)
+ORDER BY subkey;
diff --git a/yt/yql/tests/sql/suites/window/row_number_to_map_noncompact.sql b/yt/yql/tests/sql/suites/window/row_number_to_map_noncompact.sql
new file mode 100644
index 0000000000..7d870be944
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/row_number_to_map_noncompact.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+/* syntax version 1 */
+
+USE plato;
+
+SELECT
+ ROW_NUMBER() OVER w AS rn,
+ COUNT(*) OVER w AS cnt,
+FROM Input
+WINDOW
+ w AS ()
+ORDER BY rn;
diff --git a/yt/yql/tests/sql/suites/window/session1.txt.attr b/yt/yql/tests/sql/suites/window/session1.txt.attr
new file mode 100644
index 0000000000..0df1a044c1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/session1.txt.attr
@@ -0,0 +1,7 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["user";["OptionalType";["DataType";"String"]]];
+ ["ts";["OptionalType";["DataType";"Int32"]]];
+ ["payload";["DataType";"Int32"]]]
+ ];
+}}
diff --git a/yt/yql/tests/sql/suites/window/udaf_window.cfg b/yt/yql/tests/sql/suites/window/udaf_window.cfg
new file mode 100644
index 0000000000..289c4251bb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/udaf_window.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf python3_udf
diff --git a/yt/yql/tests/sql/suites/window/udaf_window.sql b/yt/yql/tests/sql/suites/window/udaf_window.sql
new file mode 100644
index 0000000000..34f9f56c6a
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/udaf_window.sql
@@ -0,0 +1,51 @@
+/* postgres can not */
+/* syntax version 1 */
+$script = @@
+import heapq
+import json
+
+N_SMALLEST = 3
+
+def create(item):
+ return [item]
+
+def add(state, item):
+ heapq.heappush(state, item)
+ return heapq.nsmallest(N_SMALLEST, state)
+
+def merge(state_a, state_b):
+ merged = heapq.merge(state_a, state_b)
+ return heapq.nsmallest(N_SMALLEST, merged)
+
+def get_result(state):
+ result = heapq.nsmallest(N_SMALLEST, state)
+ return '%d smallest items: %s' % (
+ N_SMALLEST,
+ ', '.join(map(str, result))
+ )
+
+def serialize(state):
+ return json.dumps(state)
+
+def deserialize(serialized):
+ return json.loads(serialized)
+@@;
+
+$create = Python3::create(Callable<(Double)->Resource<Python3>>, $script);
+$add = Python3::add(Callable<(Resource<Python3>,Double)->Resource<Python3>>, $script);
+$merge = Python3::merge(Callable<(Resource<Python3>,Resource<Python3>)->Resource<Python3>>, $script);
+$get_result = Python3::get_result(Callable<(Resource<Python3>)->String>, $script);
+$serialize = Python3::serialize(Callable<(Resource<Python3>)->String>, $script);
+$deserialize = Python3::deserialize(Callable<(String)->Resource<Python3>>, $script);
+
+SELECT UDAF(
+ CAST(key AS Double),
+ $create,
+ $add,
+ $merge,
+ $get_result,
+ $serialize,
+ $deserialize
+) OVER w
+FROM plato.Input
+WINDOW w AS (ORDER by value);
diff --git a/yt/yql/tests/sql/suites/window/win_by_all_aggregate.cfg b/yt/yql/tests/sql/suites/window/win_by_all_aggregate.cfg
new file mode 100644
index 0000000000..0dba2231fb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_by_all_aggregate.cfg
@@ -0,0 +1,4 @@
+in Input input_tutorial_users.txt
+udf histogram_udf
+udf math_udf
+udf stat_udf
diff --git a/yt/yql/tests/sql/suites/window/win_by_all_aggregate.sql b/yt/yql/tests/sql/suites/window/win_by_all_aggregate.sql
new file mode 100644
index 0000000000..d144fc095d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_by_all_aggregate.sql
@@ -0,0 +1,38 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+$data = (select cast(key as uint32) as age, cast(subkey as uint32) as region, value as name from Input);
+
+-- insert into Output
+select
+ region,
+ name,
+ sum(age) over w1 as sum,
+ min(age) over w1 as min,
+ max(age) over w1 as max,
+ count(age) over w1 as count,
+ count(*) over w1 as count_all,
+ count_if(age>20) over w1 as count_if,
+ some(age) over w1 as some,
+ bit_and(age) over w1 as bit_and,
+ bit_or(age) over w1 as bit_or,
+ bit_xor(age) over w1 as bit_xor,
+ bool_and(age>20) over w1 as bool_and,
+ bool_or(age>20) over w1 as bool_or,
+ avg(age) over w1 as avg,
+ aggr_list(age) over w1 as `list`,
+ min_by(age, name) over w1 as min_by,
+ max_by(age, name) over w1 as max_by,
+ nanvl(variance(age) over w1, -999.0) as variance,
+ nanvl(stddev(age) over w1, -999.0) as stddev,
+ nanvl(populationvariance(age) over w1, -999.0) as popvar,
+ nanvl(stddevpopulation(age) over w1, -999.0) as popstddev,
+ histogram(age) over w1 as hist,
+ median(age) over w1 as median,
+ percentile(age, 0.9) over w1 as perc90,
+ aggregate_by(age, aggregation_factory("count")) over w1 as aggby
+from $data
+window w1 as (partition by region order by name desc)
+order by region, name desc
+;
diff --git a/yt/yql/tests/sql/suites/window/win_by_all_avg_interval.sql b/yt/yql/tests/sql/suites/window/win_by_all_avg_interval.sql
new file mode 100644
index 0000000000..c2ff089f9e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_by_all_avg_interval.sql
@@ -0,0 +1,19 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+$data = (select cast(key as uint32) as age, cast(subkey as uint32) as region, value as name from Input);
+
+-- insert into Output
+$data2 = (select
+ region,
+ name,
+ avg(CAST(age as Interval)) over w1 as avg_age,
+from $data
+window w1 as (partition by region order by name desc)
+);
+
+discard select
+ EnsureType(avg_age, Interval?) as avg_age
+from $data2
+;
diff --git a/yt/yql/tests/sql/suites/window/win_by_all_percentile_interval.sql b/yt/yql/tests/sql/suites/window/win_by_all_percentile_interval.sql
new file mode 100644
index 0000000000..b7c1cf8a79
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_by_all_percentile_interval.sql
@@ -0,0 +1,36 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+$zero = unwrap( cast(0 as Interval) );
+
+-- safely cast data to get rid of optionals after cast
+$prepared = select
+ cast(key as Interval) ?? $zero as age
+ , cast(subkey as uint32) as region
+ , value as name
+ from Input;
+
+-- we want to check both optional<interval> and plain interval
+$data = (select
+ age
+ , just(age) as age_opt
+ , region
+ , name
+ from $prepared);
+
+$data2 = (select
+ region,
+ name,
+ percentile(age, 0.8) over w1 as age_p80,
+ percentile(age_opt, 0.8) over w1 as age_opt_p80,
+from $data
+window w1 as (partition by region order by name desc)
+);
+
+select
+ EnsureType(age_p80, Interval) as age_p80
+ , EnsureType(age_opt_p80, Interval?) as age_opt_p80
+from $data2
+;
+
diff --git a/yt/yql/tests/sql/suites/window/win_expr_bounds.cfg b/yt/yql/tests/sql/suites/window/win_expr_bounds.cfg
new file mode 100644
index 0000000000..10325bfb63
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_expr_bounds.cfg
@@ -0,0 +1,2 @@
+in Input4 input4.txt
+param $begin p_int32.json
diff --git a/yt/yql/tests/sql/suites/window/win_expr_bounds.sql b/yt/yql/tests/sql/suites/window/win_expr_bounds.sql
new file mode 100644
index 0000000000..64e7387bc6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_expr_bounds.sql
@@ -0,0 +1,13 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+declare $begin as Int32;
+
+select
+ key, subkey,
+ COUNT(*) over w as cnt
+from Input4
+window
+ w as (order by key, subkey rows between $begin preceding and 1 + 1 following)
+order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/window/win_extract_members.sql b/yt/yql/tests/sql/suites/window/win_extract_members.sql
new file mode 100644
index 0000000000..7785cf9eb9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_extract_members.sql
@@ -0,0 +1,21 @@
+/* postgres can not */
+use plato;
+
+$foo = (
+ select key, subkey, value,
+ sum(cast(subkey as uint32)) over w as sks
+ from Input
+ window w as (partition by key order by subkey)
+);
+
+$bar = (
+ select key, subkey,
+ sum(cast(subkey as uint32)) over w as sks,
+ avg(cast(subkey as uint32)) over w as ska
+ from Input4
+ window w as (partition by key order by subkey)
+);
+
+select key,subkey, value from $foo order by key, subkey;
+select key,ska from $bar order by key,ska;
+
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_4func.cfg b/yt/yql/tests/sql/suites/window/win_func_aggr_4func.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_4func.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_4func.sql b/yt/yql/tests/sql/suites/window/win_func_aggr_4func.sql
new file mode 100644
index 0000000000..245bbdf5b3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_4func.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+select
+ subkey,
+ 2 * sum(cast(key as uint32)) over w1 as dbl_sum,
+ count(key) over w1 as c,
+ min(key) over w1 as mink,
+ max(key) over w1 as maxk
+from plato.Input window w1 as (partition by subkey order by key)
+order by subkey, c;
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_4func_no_part.cfg b/yt/yql/tests/sql/suites/window/win_func_aggr_4func_no_part.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_4func_no_part.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_4func_no_part.sql b/yt/yql/tests/sql/suites/window/win_func_aggr_4func_no_part.sql
new file mode 100644
index 0000000000..6d15ae0b4b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_4func_no_part.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+select
+ 2 * sum(cast(key as uint32)) over w1 as dbl_sum,
+ count(key) over w1 as c,
+ min(key) over w1 as mink,
+ max(key) over w1 as maxk
+from plato.Input window w1 as (order by key desc)
+order by c;
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_4func_no_part_sorted.cfg b/yt/yql/tests/sql/suites/window/win_func_aggr_4func_no_part_sorted.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_4func_no_part_sorted.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_4func_no_part_sorted.sql b/yt/yql/tests/sql/suites/window/win_func_aggr_4func_no_part_sorted.sql
new file mode 100644
index 0000000000..34f8c138f6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_4func_no_part_sorted.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+select
+ 2 * sum(cast(key as uint32)) over w1 as dbl_sum,
+ count(key) over w1 as c,
+ min(key) over w1 as mink,
+ max(key) over w1 as maxk
+from plato.Input
+window w1 as (order by key)
+order by c;
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_4func_sort.cfg b/yt/yql/tests/sql/suites/window/win_func_aggr_4func_sort.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_4func_sort.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_4func_sort.sql b/yt/yql/tests/sql/suites/window/win_func_aggr_4func_sort.sql
new file mode 100644
index 0000000000..821da3fefd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_4func_sort.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+select
+ subkey,
+ sum(cast(key as uint32)) over w1 as s,
+ count(key) over w1 as c,
+ min(key) over w1 as mink,
+ max(key) over w1 as maxk
+from plato.Input window w1 as (partition by subkey order by key)
+order by subkey, c;
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_4func_sort_desc.cfg b/yt/yql/tests/sql/suites/window/win_func_aggr_4func_sort_desc.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_4func_sort_desc.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_4func_sort_desc.sql b/yt/yql/tests/sql/suites/window/win_func_aggr_4func_sort_desc.sql
new file mode 100644
index 0000000000..3553711d4d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_4func_sort_desc.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+select
+ subkey,
+ sum(cast(key as uint32)) over w1 as s,
+ count(key) over w1 as c,
+ min(key) over w1 as mink,
+ max(key) over w1 as maxk
+from plato.Input window w1 as (partition by subkey order by key desc)
+order by subkey, c;
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_hist.cfg b/yt/yql/tests/sql/suites/window/win_func_aggr_hist.cfg
new file mode 100644
index 0000000000..79b8cf294f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_hist.cfg
@@ -0,0 +1,2 @@
+in Input input_intersect.txt
+udf histogram_udf
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_hist.sql b/yt/yql/tests/sql/suites/window/win_func_aggr_hist.sql
new file mode 100644
index 0000000000..c7c506e390
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_hist.sql
@@ -0,0 +1,5 @@
+/* postgres can not */
+select subkey, HISTOGRAM(cast(key as uint32) % 10, 2.) over w1 as hh, count(key) over w1 as c, min(key) over w1 as mink, max(key) over w1 as maxk
+from plato.Input
+window w1 as (partition by subkey order by key)
+order by subkey, c;
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_stat.cfg b/yt/yql/tests/sql/suites/window/win_func_aggr_stat.cfg
new file mode 100644
index 0000000000..b0a6e1e6b6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_stat.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf math_udf
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_stat.sql b/yt/yql/tests/sql/suites/window/win_func_aggr_stat.sql
new file mode 100644
index 0000000000..7d7ed2bb52
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_stat.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+select
+ key, subkey,
+ nanvl(correlation(cast(key as double), cast(subkey as double)) over w, NULL) as corr,
+ nanvl(covariance(cast(key as double), cast(subkey as double)) over w, -9.9) as covar,
+ hll(value, 18) over w as hll
+from plato.Input
+window w as (order by subkey);
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_with_qualified_all.cfg b/yt/yql/tests/sql/suites/window/win_func_aggr_with_qualified_all.cfg
new file mode 100644
index 0000000000..144f0dd840
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_with_qualified_all.cfg
@@ -0,0 +1 @@
+in Input input2.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_with_qualified_all.sql b/yt/yql/tests/sql/suites/window/win_func_aggr_with_qualified_all.sql
new file mode 100644
index 0000000000..976046bcc8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_with_qualified_all.sql
@@ -0,0 +1,6 @@
+pragma SimpleColumns;
+use plato;
+
+$q = (select CAST(key as Int32) as key, CAST(subkey as Int32) as subkey, value from Input);
+
+select t.*, sum(subkey) over w as subkey_sum, sum(key) over w from $q as t window w as (partition by key order by value) order by key,subkey;
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_with_qualified_all_no_simple_columns.cfg b/yt/yql/tests/sql/suites/window/win_func_aggr_with_qualified_all_no_simple_columns.cfg
new file mode 100644
index 0000000000..144f0dd840
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_with_qualified_all_no_simple_columns.cfg
@@ -0,0 +1 @@
+in Input input2.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_aggr_with_qualified_all_no_simple_columns.sql b/yt/yql/tests/sql/suites/window/win_func_aggr_with_qualified_all_no_simple_columns.sql
new file mode 100644
index 0000000000..d790cfea62
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_aggr_with_qualified_all_no_simple_columns.sql
@@ -0,0 +1,7 @@
+pragma DisableSimpleColumns;
+
+use plato;
+
+$q = (select CAST(key as Int32) as key, CAST(subkey as Int32) as subkey, value from Input);
+
+select t.*, sum(subkey) over w as subkey_sum, sum(key) over w from $q as t window w as (partition by key order by value) order by `t.key`,`t.subkey`;
diff --git a/yt/yql/tests/sql/suites/window/win_func_auto_arg.sql b/yt/yql/tests/sql/suites/window/win_func_auto_arg.sql
new file mode 100644
index 0000000000..4dea9c50b1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_auto_arg.sql
@@ -0,0 +1,17 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+PRAGMA DisableAnsiRankForNullableKeys;
+
+SELECT
+ RANK() over w as rank_noarg,
+ DENSE_RANK() over w as dense_rank_noarg,
+ RANK(cast(subkey as uint32) / 10 % 2) over w as rank,
+ DENSE_RANK(cast(subkey as uint32) / 10 % 2) over w as dense_rank,
+ zz.*
+FROM
+ Input4 as zz
+WINDOW
+ w as (PARTITION BY key ORDER BY subkey)
+ORDER BY key, subkey, value
+;
diff --git a/yt/yql/tests/sql/suites/window/win_func_auto_arg_selective_rank.sql b/yt/yql/tests/sql/suites/window/win_func_auto_arg_selective_rank.sql
new file mode 100644
index 0000000000..aae50e65f4
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_auto_arg_selective_rank.sql
@@ -0,0 +1,18 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+PRAGMA DisableSimpleColumns;
+PRAGMA DisableAnsiRankForNullableKeys;
+
+--INSERT INTO Output
+SELECT
+ RANK() over w as rank_noarg,
+ DENSE_RANK() over w as dense_rank_noarg,
+ RANK(AsTuple(key, value)) over w as rank,
+ DENSE_RANK(AsTuple(key, value)) over w as dense_rank,
+ zz.*
+FROM
+ Input4 as zz
+WINDOW
+ w as (ORDER BY key, subkey, value)
+;
diff --git a/yt/yql/tests/sql/suites/window/win_func_auto_arg_two_sort.sql b/yt/yql/tests/sql/suites/window/win_func_auto_arg_two_sort.sql
new file mode 100644
index 0000000000..67f6c8cc5f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_auto_arg_two_sort.sql
@@ -0,0 +1,18 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+PRAGMA DisableAnsiRankForNullableKeys;
+
+--INSERT INTO Output
+SELECT
+ RANK() over w as rank_noarg,
+ DENSE_RANK() over w as dense_rank_noarg,
+ RANK(subkey) over w as rank,
+ DENSE_RANK(subkey) over w as dense_rank,
+ zz.*
+FROM
+ Input4 as zz
+WINDOW
+ w as (PARTITION BY key ORDER BY subkey, value)
+ORDER BY key, subkey, value
+;
diff --git a/yt/yql/tests/sql/suites/window/win_func_first_last.cfg b/yt/yql/tests/sql/suites/window/win_func_first_last.cfg
new file mode 100644
index 0000000000..1af92ac7be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_first_last.cfg
@@ -0,0 +1 @@
+in Input input_intersect_with_holes.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_first_last.sql b/yt/yql/tests/sql/suites/window/win_func_first_last.sql
new file mode 100644
index 0000000000..1e0c82e8fd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_first_last.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+SELECT
+ key,
+ FIRST_VALUE(cast(subkey as uint32)) RESPECT NULLS OVER w1,
+ FIRST_VALUE(cast(subkey as uint32)) IGNORE NULLS OVER w1,
+ LAST_VALUE(cast(subkey as uint32)) OVER w1,
+ LAST_VALUE(cast(subkey as uint32)) IGNORE NULLS OVER w1,
+ subkey
+FROM plato.Input
+WINDOW w1 as (ORDER BY key desc, subkey);
diff --git a/yt/yql/tests/sql/suites/window/win_func_first_last_over_nonopt.sql b/yt/yql/tests/sql/suites/window/win_func_first_last_over_nonopt.sql
new file mode 100644
index 0000000000..9303079983
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_first_last_over_nonopt.sql
@@ -0,0 +1,19 @@
+/* postgres can not */
+/* syntax version 1 */
+SELECT
+ key,
+
+ FIRST_VALUE(key) RESPECT NULLS OVER w1,
+ FIRST_VALUE(key) IGNORE NULLS OVER w1,
+ LAST_VALUE(key) OVER w1,
+ LAST_VALUE(key) IGNORE NULLS OVER w1,
+
+ FIRST_VALUE(null) RESPECT NULLS OVER w1,
+ FIRST_VALUE(null) IGNORE NULLS OVER w1,
+ LAST_VALUE(null) OVER w1,
+ LAST_VALUE(null) IGNORE NULLS OVER w1,
+
+ subkey
+FROM plato.Input
+WINDOW w1 as (ORDER BY subkey ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
+ORDER BY subkey;
diff --git a/yt/yql/tests/sql/suites/window/win_func_first_last_rev.cfg b/yt/yql/tests/sql/suites/window/win_func_first_last_rev.cfg
new file mode 100644
index 0000000000..1af92ac7be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_first_last_rev.cfg
@@ -0,0 +1 @@
+in Input input_intersect_with_holes.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_first_last_rev.sql b/yt/yql/tests/sql/suites/window/win_func_first_last_rev.sql
new file mode 100644
index 0000000000..ce137c76f3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_first_last_rev.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+SELECT
+ key,
+ FIRST_VALUE(cast(subkey as uint32)) OVER w1,
+ FIRST_VALUE(cast(subkey as uint32)) IGNORE NULLS OVER w1,
+ LAST_VALUE(cast(subkey as uint32)) RESPECT NULLS OVER w1,
+ LAST_VALUE(cast(subkey as uint32)) IGNORE NULLS OVER w1,
+ subkey
+FROM plato.Input
+WINDOW w1 as (ORDER BY key asc, subkey);
diff --git a/yt/yql/tests/sql/suites/window/win_func_first_last_with_part.cfg b/yt/yql/tests/sql/suites/window/win_func_first_last_with_part.cfg
new file mode 100644
index 0000000000..1af92ac7be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_first_last_with_part.cfg
@@ -0,0 +1 @@
+in Input input_intersect_with_holes.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_first_last_with_part.sql b/yt/yql/tests/sql/suites/window/win_func_first_last_with_part.sql
new file mode 100644
index 0000000000..84de1048c6
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_first_last_with_part.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+$input=(select cast(key as int32) / 100 as key_hundred, cast(key as int32) as key, cast(subkey as int32) as subkey, value from plato.Input);
+
+SELECT
+ key_hundred,
+ key,
+ FIRST_VALUE(cast(subkey as uint32)) RESPECT NULLS OVER w1 as first_res_null,
+ FIRST_VALUE(cast(subkey as uint32)) IGNORE NULLS OVER w1 as first_esc_null,
+ LAST_VALUE(cast(subkey as uint32)) OVER w1 as last_res_null,
+ LAST_VALUE(cast(subkey as uint32)) IGNORE NULLS OVER w1 as last_esc_null,
+ subkey
+FROM $input
+WINDOW w1 as (PARTITION BY key_hundred ORDER BY key)
+ORDER BY key_hundred, key, subkey;
diff --git a/yt/yql/tests/sql/suites/window/win_func_in_lib.cfg b/yt/yql/tests/sql/suites/window/win_func_in_lib.cfg
new file mode 100644
index 0000000000..b6318845f7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_in_lib.cfg
@@ -0,0 +1,2 @@
+file lib1.sql lib1.sql.txt
+in Input input.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_in_lib.sql b/yt/yql/tests/sql/suites/window/win_func_in_lib.sql
new file mode 100644
index 0000000000..3c6dd9719c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_in_lib.sql
@@ -0,0 +1,6 @@
+USE plato;
+PRAGMA library('lib1.sql');
+
+IMPORT lib1 symbols $subq;
+
+SELECT * FROM $subq();
diff --git a/yt/yql/tests/sql/suites/window/win_func_into_udf.cfg b/yt/yql/tests/sql/suites/window/win_func_into_udf.cfg
new file mode 100644
index 0000000000..061efc4f73
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_into_udf.cfg
@@ -0,0 +1,2 @@
+in Input input4.txt
+udf math_udf
diff --git a/yt/yql/tests/sql/suites/window/win_func_into_udf.sql b/yt/yql/tests/sql/suites/window/win_func_into_udf.sql
new file mode 100644
index 0000000000..45083bc46d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_into_udf.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+SELECT
+ key, Math::Sqrt(CAST(row_number() over w as double)) as sq
+FROM plato.Input
+WINDOW w AS (partition by key order by subkey)
+ORDER BY key, sq;
diff --git a/yt/yql/tests/sql/suites/window/win_func_lead_lag_opt.cfg b/yt/yql/tests/sql/suites/window/win_func_lead_lag_opt.cfg
new file mode 100644
index 0000000000..f0840473ba
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_lead_lag_opt.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+in InputOpt input_optkey1.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_lead_lag_opt.sql b/yt/yql/tests/sql/suites/window/win_func_lead_lag_opt.sql
new file mode 100644
index 0000000000..192103f030
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_lead_lag_opt.sql
@@ -0,0 +1,23 @@
+/* postgres can not */
+use plato;
+
+select
+ subkey,
+ lag(Just(subkey)) over w as opt_lag,
+ lead(Just(subkey)) over w as opt_lead,
+ lag(subkey, 0) over w as lag0,
+ lead(subkey, 0) over w as lead0
+from Input window w as ()
+order by subkey;
+
+
+select
+ key,
+ lag(optkey) over w as opt_lag,
+ lead(Just(optkey)) over w as opt_lead,
+ lag(Just(optkey), 0) over w as lag0,
+ lead(optkey, 0) over w as lead0
+from InputOpt window w as ()
+order by key;
+
+select lead(null) over w from (select 1 as key) window w as ();
diff --git a/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm.cfg b/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm.sql b/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm.sql
new file mode 100644
index 0000000000..4400f070f2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm.sql
@@ -0,0 +1,21 @@
+/* postgres can not */
+use plato;
+
+$input=(select cast(key as int32) as key, cast(subkey as int32) as subkey, value from Input);
+
+--insert into Output
+select
+ lead(key, 3) over w as keyL,
+ lead(key, 2) over w as keyM,
+ lead(key, 1) over w as keyN,
+ key as keyO,
+ lag(key, 1) over w as key_1,
+ lag(key, 2) over w as key_2,
+ lag(key, 3) over w as key_3,
+ lag(key, 4) over w as key_4,
+ lag(key, 5) over w as key_5,
+ value
+from $input
+window w as (order by key, value)
+order by keyO, value
+;
diff --git a/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm_with_part.cfg b/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm_with_part.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm_with_part.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm_with_part.sql b/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm_with_part.sql
new file mode 100644
index 0000000000..509cd93f05
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm_with_part.sql
@@ -0,0 +1,22 @@
+/* postgres can not */
+use plato;
+
+$input=(select cast(key as int32) / 100 as key_hundred, cast(key as int32) as key, cast(subkey as int32) as subkey, value from Input);
+
+--insert into Output
+select
+ key_hundred as a_part,
+ lead(key, 3) over w as keyL,
+ lead(key, 2) over w as keyM,
+ lead(key, 1) over w as keyN,
+ key as keyO,
+ lag(key, 1) over w as key_1,
+ lag(key, 2) over w as key_2,
+ lag(key, 3) over w as key_3,
+ lag(key, 4) over w as key_4,
+ lag(key, 5) over w as key_5,
+ value
+from $input
+window w as (partition by key_hundred order by key, value)
+order by a_part, keyO, value
+;
diff --git a/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm_with_part_other.cfg b/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm_with_part_other.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm_with_part_other.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm_with_part_other.sql b/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm_with_part_other.sql
new file mode 100644
index 0000000000..1da77dd086
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_lead_lag_worm_with_part_other.sql
@@ -0,0 +1,22 @@
+/* postgres can not */
+use plato;
+
+$input=(select cast(key as int32) % 4 as key_quad, cast(key as int32) as key, cast(subkey as int32) as subkey, value from Input);
+
+--insert into Output
+select
+ key_quad as a_part,
+ lead(key, 3) over w as keyL,
+ lead(key, 2) over w as keyM,
+ lead(key, 1) over w as keyN,
+ key as keyO,
+ lag(key, 1) over w as key_1,
+ lag(key, 2) over w as key_2,
+ lag(key, 3) over w as key_3,
+ lag(key, 4) over w as key_4,
+ lag(key, 5) over w as key_5,
+ value
+from $input
+window w as (partition by key_quad order by key, value)
+order by a_part, keyO, value
+;
diff --git a/yt/yql/tests/sql/suites/window/win_func_on_cloned_source.sql b/yt/yql/tests/sql/suites/window/win_func_on_cloned_source.sql
new file mode 100644
index 0000000000..a4cd401589
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_on_cloned_source.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+USE plato;
+
+$sub_raws = (SELECT ROW_NUMBER() OVER trivialWindow as RowNum
+FROM Input WINDOW trivialWindow As ()
+);
+
+--INSERT INTO Output
+SELECT
+ *
+FROM $sub_raws;
+
+SELECT
+ *
+FROM $sub_raws;
diff --git a/yt/yql/tests/sql/suites/window/win_func_order_by_udf_empty_rank.cfg b/yt/yql/tests/sql/suites/window/win_func_order_by_udf_empty_rank.cfg
new file mode 100644
index 0000000000..144f0dd840
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_order_by_udf_empty_rank.cfg
@@ -0,0 +1 @@
+in Input input2.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_order_by_udf_empty_rank.sql b/yt/yql/tests/sql/suites/window/win_func_order_by_udf_empty_rank.sql
new file mode 100644
index 0000000000..6508a8c827
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_order_by_udf_empty_rank.sql
@@ -0,0 +1,17 @@
+/* syntax version 1 */
+/* postgres can not */
+PRAGMA DisableAnsiRankForNullableKeys;
+
+USE plato;
+
+SELECT
+ key,
+ RANK() over w as ix,
+ subkey,
+ String::Base64Encode(subkey) as subkey_enc
+FROM Input
+WINDOW w AS (
+ PARTITION BY key
+ ORDER BY String::Base64Encode(subkey) DESC
+)
+ORDER BY key, ix;
diff --git a/yt/yql/tests/sql/suites/window/win_func_over_group_by.cfg b/yt/yql/tests/sql/suites/window/win_func_over_group_by.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_over_group_by.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_over_group_by.sql b/yt/yql/tests/sql/suites/window/win_func_over_group_by.sql
new file mode 100644
index 0000000000..2766549b6e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_over_group_by.sql
@@ -0,0 +1,17 @@
+/* postgres can not */
+use plato;
+
+$data = (select cast(key as uint32) as age, cast(subkey as uint32) as region, value as name from Input);
+
+--insert into Output
+select
+ prefix,
+ region,
+ avg(age) as avg_age,
+ sum(avg(age)) over w1 as sum_by_avg_age
+from $data
+group by region, SUBSTRING(name,0,1) as prefix
+-- how to use single avg_age?
+window w1 as (partition by region order by avg(age))
+order by region, avg_age
+;
diff --git a/yt/yql/tests/sql/suites/window/win_func_over_group_by_compl.cfg b/yt/yql/tests/sql/suites/window/win_func_over_group_by_compl.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_over_group_by_compl.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_over_group_by_compl.sql b/yt/yql/tests/sql/suites/window/win_func_over_group_by_compl.sql
new file mode 100644
index 0000000000..fda60ad550
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_over_group_by_compl.sql
@@ -0,0 +1,25 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+$data = (select cast(key as uint32) as age, cast(subkey as uint32) as region, value as name from Input);
+
+--insert into Output
+select
+ prefix,
+ region,
+ region + 2 as region_2,
+ --age,
+ avg(age) as avg_age,
+ sum(age) as sum_age,
+ sum(avg(age)) over w1 as sum_by_avg_age,
+ lag(region) over w1 as prev_region,
+ lag(aggr_list(region)) over w1 as prev_region_list,
+ 'test'
+from $data
+group by region, SUBSTRING(name,0,1) as prefix
+-- how to use single avg_age?
+window w1 as (partition by region order by avg(age) desc)
+--window w1 as (order by avg(age) desc)
+order by region, avg_age desc
+;
diff --git a/yt/yql/tests/sql/suites/window/win_func_over_group_by_list_names.cfg b/yt/yql/tests/sql/suites/window/win_func_over_group_by_list_names.cfg
new file mode 100644
index 0000000000..582479bcde
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_over_group_by_list_names.cfg
@@ -0,0 +1 @@
+in Input input_tutorial_users.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_over_group_by_list_names.sql b/yt/yql/tests/sql/suites/window/win_func_over_group_by_list_names.sql
new file mode 100644
index 0000000000..d6ec520dae
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_over_group_by_list_names.sql
@@ -0,0 +1,27 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+$data = (select cast(key as uint32) as age, cast(subkey as uint32) as region, value as name from Input);
+
+--insert into Output
+select
+ prefix,
+ region,
+ region + 2 as region_2,
+ --age,
+ avg(age) as avg_age,
+ sum(age) as sum_age,
+ sum(avg(age)) over w1 as sum_by_avg_age,
+ lag(region) over w1 as prev_region,
+ aggr_list(prefix) over w1 as prefix_list,
+ lag(prefix) over w1 as prev_prefix_list,
+ lag(aggr_list(name)) over w1 as prev_region_list,
+ 'test'
+from $data
+group by region, SUBSTRING(name,0,1) as prefix
+-- how to use single avg_age?
+window w1 as (partition by region order by avg(age) desc, prefix)
+--window w1 as (order by avg(age) desc)
+order by region, avg_age desc, prefix
+;
diff --git a/yt/yql/tests/sql/suites/window/win_func_over_group_by_list_names_order_prefix.cfg b/yt/yql/tests/sql/suites/window/win_func_over_group_by_list_names_order_prefix.cfg
new file mode 100644
index 0000000000..582479bcde
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_over_group_by_list_names_order_prefix.cfg
@@ -0,0 +1 @@
+in Input input_tutorial_users.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_over_group_by_list_names_order_prefix.sql b/yt/yql/tests/sql/suites/window/win_func_over_group_by_list_names_order_prefix.sql
new file mode 100644
index 0000000000..3050750f9b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_over_group_by_list_names_order_prefix.sql
@@ -0,0 +1,24 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+
+$data = (select cast(key as uint32) as age, cast(subkey as uint32) as region, value as name from Input);
+
+--insert into Output
+select
+ prefix,
+ region,
+ region + 2 as region_2,
+ avg(age) as avg_age,
+ sum(age) as sum_age,
+ sum(avg(age)) over w1 as sum_by_avg_age,
+ lag(region) over w1 as prev_region,
+ aggr_list(prefix) over w1 as prefix_list,
+ lag(prefix) over w1 as prev_prefix_list,
+ lag(agg_list(name)) over w1 as prev_region_list,
+ 'test'
+from $data
+group by region, SUBSTRING(name,0,1) as prefix
+window w1 as (partition by region order by prefix desc)
+order by region desc, prefix, sum_by_avg_age
+;
diff --git a/yt/yql/tests/sql/suites/window/win_func_part_by_expr.cfg b/yt/yql/tests/sql/suites/window/win_func_part_by_expr.cfg
new file mode 100644
index 0000000000..582479bcde
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_part_by_expr.cfg
@@ -0,0 +1 @@
+in Input input_tutorial_users.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_part_by_expr.sql b/yt/yql/tests/sql/suites/window/win_func_part_by_expr.sql
new file mode 100644
index 0000000000..f101052580
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_part_by_expr.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+use plato;
+
+$data = (select cast(key as uint32) as age, cast(subkey as uint32) as region, value as name from Input);
+
+--insert into Output
+select
+ prefix,
+ region,
+ name,
+ sum(age) over w1 as sum1
+from $data
+window w1 as (partition by SUBSTRING(name,0,1) as prefix order by name)
+order by prefix, region, name;
diff --git a/yt/yql/tests/sql/suites/window/win_func_part_by_expr_new.sql b/yt/yql/tests/sql/suites/window/win_func_part_by_expr_new.sql
new file mode 100644
index 0000000000..cec51e2e40
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_part_by_expr_new.sql
@@ -0,0 +1,9 @@
+/* postgres can not */
+/* syntax version 1 */
+-- YQL-1977
+use plato;
+
+--insert into Output
+select key_mod, aggr_list(value) over w, aggr_list(subkey) over w
+from Input window w as (partition by cast(key as uint32) % 10 as key_mod order by subkey)
+order by key_mod, column1;
diff --git a/yt/yql/tests/sql/suites/window/win_func_rank_by_all.cfg b/yt/yql/tests/sql/suites/window/win_func_rank_by_all.cfg
new file mode 100644
index 0000000000..1af92ac7be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_rank_by_all.cfg
@@ -0,0 +1 @@
+in Input input_intersect_with_holes.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_rank_by_all.sql b/yt/yql/tests/sql/suites/window/win_func_rank_by_all.sql
new file mode 100644
index 0000000000..963a93391f
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_rank_by_all.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+PRAGMA DisableAnsiRankForNullableKeys;
+
+$input=(select cast(key as int32) ?? 0 as key, cast(subkey as int32) as subkey, value from Input);
+
+SELECT
+ rank(key) over w1 as rank_key,
+ dense_rank(key) over w1 as dense_rank_key,
+ key
+FROM $input
+WINDOW w1 as (ORDER BY key);
diff --git a/yt/yql/tests/sql/suites/window/win_func_rank_by_opt_all.cfg b/yt/yql/tests/sql/suites/window/win_func_rank_by_opt_all.cfg
new file mode 100644
index 0000000000..1af92ac7be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_rank_by_opt_all.cfg
@@ -0,0 +1 @@
+in Input input_intersect_with_holes.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_rank_by_opt_all.sql b/yt/yql/tests/sql/suites/window/win_func_rank_by_opt_all.sql
new file mode 100644
index 0000000000..fd589fcba2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_rank_by_opt_all.sql
@@ -0,0 +1,13 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+PRAGMA DisableAnsiRankForNullableKeys;
+
+$input=(select cast(key as int32) as key, cast(subkey as int32) as subkey, value from Input);
+
+SELECT
+ rank(key) over w1 as rank_key,
+ dense_rank(key) over w1 as dense_rank_key,
+ key
+FROM $input
+WINDOW w1 as (ORDER BY key);
diff --git a/yt/yql/tests/sql/suites/window/win_func_rank_by_opt_part.cfg b/yt/yql/tests/sql/suites/window/win_func_rank_by_opt_part.cfg
new file mode 100644
index 0000000000..1af92ac7be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_rank_by_opt_part.cfg
@@ -0,0 +1 @@
+in Input input_intersect_with_holes.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_rank_by_opt_part.sql b/yt/yql/tests/sql/suites/window/win_func_rank_by_opt_part.sql
new file mode 100644
index 0000000000..72e506b183
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_rank_by_opt_part.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+PRAGMA DisableAnsiRankForNullableKeys;
+
+$input=(select cast(key as int32) % 4 as key_quad, cast(key as int32) as key, cast(subkey as int32) as subkey, value from Input);
+
+SELECT
+ rank(key) over w1 as rank_key,
+ dense_rank(key) over w1 as dense_rank_key,
+ key_quad,
+ key
+FROM $input
+WINDOW w1 as (PARTITION BY key_quad ORDER BY key)
+ORDER BY rank_key, dense_rank_key, key_quad;
diff --git a/yt/yql/tests/sql/suites/window/win_func_rank_by_part.cfg b/yt/yql/tests/sql/suites/window/win_func_rank_by_part.cfg
new file mode 100644
index 0000000000..1af92ac7be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_rank_by_part.cfg
@@ -0,0 +1 @@
+in Input input_intersect_with_holes.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_rank_by_part.sql b/yt/yql/tests/sql/suites/window/win_func_rank_by_part.sql
new file mode 100644
index 0000000000..6b94e82863
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_rank_by_part.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+/* syntax version 1 */
+use plato;
+PRAGMA DisableAnsiRankForNullableKeys;
+
+$input=(select cast(key as int32) % 4 as key_quad, cast(key as int32) ?? 0 as key, cast(subkey as int32) as subkey, value from Input);
+
+SELECT
+ rank(key) over w1 as rank_key,
+ dense_rank(key) over w1 as dense_rank_key,
+ key_quad,
+ key
+FROM $input
+WINDOW w1 as (PARTITION BY key_quad ORDER BY key)
+ORDER BY rank_key, dense_rank_key, key_quad;
diff --git a/yt/yql/tests/sql/suites/window/win_func_rank_with_order_by_aggr_key.cfg b/yt/yql/tests/sql/suites/window/win_func_rank_with_order_by_aggr_key.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_rank_with_order_by_aggr_key.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_rank_with_order_by_aggr_key.sql b/yt/yql/tests/sql/suites/window/win_func_rank_with_order_by_aggr_key.sql
new file mode 100644
index 0000000000..5153e2cca7
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_rank_with_order_by_aggr_key.sql
@@ -0,0 +1,9 @@
+use plato;
+
+select
+ key,
+ RANK() over w
+from Input
+group by key
+WINDOW w as (order by key)
+order by key;
diff --git a/yt/yql/tests/sql/suites/window/win_func_spec_with_part.cfg b/yt/yql/tests/sql/suites/window/win_func_spec_with_part.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_spec_with_part.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_spec_with_part.sql b/yt/yql/tests/sql/suites/window/win_func_spec_with_part.sql
new file mode 100644
index 0000000000..c4ccbc43be
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_spec_with_part.sql
@@ -0,0 +1,14 @@
+/* postgres can not */
+$input=(select cast(key as int32) / 100 as key_hundred, cast(key as int32) as key, cast(subkey as int32) as subkey, value from plato.Input);
+
+select
+ key_hundred,
+ key,
+ (key - lag(key, 1) over w) as key_diff,
+ (subkey - lag(subkey, 1) over w) as subkey_diff,
+ row_number() over w as row,
+ value
+from $input
+window w as (partition by key_hundred order by key, value)
+order by key_hundred, key, value
+;
diff --git a/yt/yql/tests/sql/suites/window/win_func_special.cfg b/yt/yql/tests/sql/suites/window/win_func_special.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_special.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yt/yql/tests/sql/suites/window/win_func_special.sql b/yt/yql/tests/sql/suites/window/win_func_special.sql
new file mode 100644
index 0000000000..1dd68979b3
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_special.sql
@@ -0,0 +1,11 @@
+/* postgres can not */
+$input=(select cast(key as int32) as key, cast(subkey as int32) as subkey, value from plato.Input);
+
+select
+ key,
+ (key - lag(key, 1) over w) as key_diff,
+ (subkey - lag(subkey, 1) over w) as subkey_diff,
+ row_number() over w as row,
+ value
+from $input
+window w as (order by key, subkey, value);
diff --git a/yt/yql/tests/sql/suites/window/win_func_with_struct_access.sql b/yt/yql/tests/sql/suites/window/win_func_with_struct_access.sql
new file mode 100644
index 0000000000..47c0a0001e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_with_struct_access.sql
@@ -0,0 +1,21 @@
+/* postgres can not */
+USE plato;
+
+$input=(SELECT
+ Cast(key as int32) / 100 as key_hundred,
+ AsStruct(
+ Cast(key as int32) as key,
+ Cast(subkey as int32) as subkey
+ ) as `struct`,
+ value
+FROM Input as inSrc);
+
+--INSERT INTO Output
+SELECT
+ key_hundred as a_part,
+ `struct`.key - lead(`struct`.key, 1) over w as keyDiff,
+ value
+FROM $input as outSrc
+WINDOW w as (partition by key_hundred ORDER BY `struct`.key, value)
+ORDER by a_part, value
+;
diff --git a/yt/yql/tests/sql/suites/window/win_func_with_struct_access_full_access.sql b/yt/yql/tests/sql/suites/window/win_func_with_struct_access_full_access.sql
new file mode 100644
index 0000000000..49642a734e
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_func_with_struct_access_full_access.sql
@@ -0,0 +1,21 @@
+/* postgres can not */
+USE plato;
+
+$input=(SELECT
+ Cast(key as int32) / 100 as key_hundred,
+ AsStruct(
+ Cast(key as int32) as key,
+ Cast(subkey as int32) as subkey
+ ) as `struct`,
+ value
+FROM Input as inSrc);
+
+--INSERT INTO Output
+SELECT
+ key_hundred as a_part,
+ `struct`.key - lead(outSrc.`struct`.key, 1) over w as keyDiff,
+ value
+FROM $input as outSrc
+WINDOW w as (partition by key_hundred ORDER BY `struct`.key, value)
+ORDER by a_part, value
+;
diff --git a/yt/yql/tests/sql/suites/window/win_fuse_window.sql b/yt/yql/tests/sql/suites/window/win_fuse_window.sql
new file mode 100644
index 0000000000..644031aeaf
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_fuse_window.sql
@@ -0,0 +1,25 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+$data = (select unwrap(cast(key as uint32)) as key, unwrap(cast(subkey as uint32)) as subkey, value, value || value as unused from Input4);
+
+insert into @data
+select * from $data;
+
+commit;
+
+select
+ key, subkey,
+ FIRST_VALUE(value) over w1 as w1_first_value,
+ SUM(subkey) over w2 as w2_sum_subkey,
+ LAST_VALUE(value) over w3 as w3_last_value,
+ SUM(key) over w4 as w4_sum_key,
+ LEAD(value) over w5 as w5_next_value,
+from @data
+window
+ w1 as (partition by subkey, key order by value),
+ w2 as (order by key,subkey rows unbounded preceding),
+ w3 as (partition by key, subkey order by value rows unbounded preceding), -- = w1
+ w4 as (order by key,subkey rows between unbounded preceding and current row), -- = w2
+ w5 as (partition by subkey, key order by value rows between unbounded preceding and current row) -- = w1
+order by key, subkey;
diff --git a/yt/yql/tests/sql/suites/window/win_inline_spec.sql b/yt/yql/tests/sql/suites/window/win_inline_spec.sql
new file mode 100644
index 0000000000..b881a07689
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_inline_spec.sql
@@ -0,0 +1,9 @@
+/* syntax version 1 */
+select
+ key,
+ max(key) over (order by key) as running_max,
+ lead(key) over (order by key rows unbounded preceding) as next_key,
+ aggregate_list(key) over w as keys,
+from plato.Input
+window w as (order by key rows between unbounded preceding and current row)
+order by key;
diff --git a/yt/yql/tests/sql/suites/window/win_lead_in_mem.sql b/yt/yql/tests/sql/suites/window/win_lead_in_mem.sql
new file mode 100644
index 0000000000..ae78304cbd
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_lead_in_mem.sql
@@ -0,0 +1,10 @@
+/* postgres can not */
+USE plato;
+
+$list = (select item FROM (select AsList('foo', 'bar', 'baz', 'quux', 'bat') as `list`) FLATTEN BY `list` as item);
+
+--INSERT INTO Output
+SELECT
+ item, YQL::Concat('+', Lead(item, 1) over w), YQL::Concat("++", Lead(item,2) over w)
+FROM $list
+WINDOW w as ();
diff --git a/yt/yql/tests/sql/suites/window/win_multiaggr.sql b/yt/yql/tests/sql/suites/window/win_multiaggr.sql
new file mode 100644
index 0000000000..4d641e8a53
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_multiaggr.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+use plato;
+
+select MULTI_AGGREGATE_BY(AsStruct(subkey as a,value as b), AGGREGATION_FACTORY("count")) over w,
+MULTI_AGGREGATE_BY(AsStruct(subkey as a,value as b), AGGREGATION_FACTORY("max")) over w
+from Input window w as (order by key);
diff --git a/yt/yql/tests/sql/suites/window/win_multiaggr_library.cfg b/yt/yql/tests/sql/suites/window/win_multiaggr_library.cfg
new file mode 100644
index 0000000000..f71ef4179c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_multiaggr_library.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+file agg_factory.sql agg_factory.sql.txt
+file multiaggr_subq.sql multiaggr_subq.sql.txt
diff --git a/yt/yql/tests/sql/suites/window/win_multiaggr_library.sql b/yt/yql/tests/sql/suites/window/win_multiaggr_library.sql
new file mode 100644
index 0000000000..a9f599906c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_multiaggr_library.sql
@@ -0,0 +1,7 @@
+/* postgres can not */
+pragma library('multiaggr_subq.sql');
+pragma library('agg_factory.sql');
+
+import multiaggr_subq symbols $multiaggr_win;
+
+select * from $multiaggr_win() order by rn;
diff --git a/yt/yql/tests/sql/suites/window/win_multiaggr_list.sql b/yt/yql/tests/sql/suites/window/win_multiaggr_list.sql
new file mode 100644
index 0000000000..5eeb21148c
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_multiaggr_list.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+use plato;
+
+select MULTI_AGGREGATE_BY(AsList(subkey,value), AGGREGATION_FACTORY("count")) over w,
+MULTI_AGGREGATE_BY(AsList(subkey,value), AGGREGATION_FACTORY("max")) over w
+from Input window w as (order by key);
diff --git a/yt/yql/tests/sql/suites/window/win_multiaggr_tuple.sql b/yt/yql/tests/sql/suites/window/win_multiaggr_tuple.sql
new file mode 100644
index 0000000000..2384757bfb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_multiaggr_tuple.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+use plato;
+
+select MULTI_AGGREGATE_BY(AsTuple(subkey,value), AGGREGATION_FACTORY("count")) over w,
+MULTI_AGGREGATE_BY(AsTuple(subkey,value), AGGREGATION_FACTORY("max")) over w
+from Input window w as (order by key);
diff --git a/yt/yql/tests/sql/suites/window/win_over_few_partitions.cfg b/yt/yql/tests/sql/suites/window/win_over_few_partitions.cfg
new file mode 100644
index 0000000000..582479bcde
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_over_few_partitions.cfg
@@ -0,0 +1 @@
+in Input input_tutorial_users.txt
diff --git a/yt/yql/tests/sql/suites/window/win_over_few_partitions.sql b/yt/yql/tests/sql/suites/window/win_over_few_partitions.sql
new file mode 100644
index 0000000000..20f59940d0
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_over_few_partitions.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+$data = (select
+ cast(key as uint32) as age,
+ cast(key as uint32)/10 as age_decade,
+ cast(subkey as uint32) as region,
+ value as name
+from plato.Input);
+
+select
+ region, age, name, sum(age) over w1 as sum1, sum(age) over w2 as sum2
+from $data
+window
+ w1 as (partition by region order by name),
+ w2 as (partition by age_decade order by name)
+order by region, age;
diff --git a/yt/yql/tests/sql/suites/window/win_over_few_partitions_other.cfg b/yt/yql/tests/sql/suites/window/win_over_few_partitions_other.cfg
new file mode 100644
index 0000000000..582479bcde
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_over_few_partitions_other.cfg
@@ -0,0 +1 @@
+in Input input_tutorial_users.txt
diff --git a/yt/yql/tests/sql/suites/window/win_over_few_partitions_other.sql b/yt/yql/tests/sql/suites/window/win_over_few_partitions_other.sql
new file mode 100644
index 0000000000..19bd3fe37b
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_over_few_partitions_other.sql
@@ -0,0 +1,15 @@
+/* postgres can not */
+$input = (select cast(key as uint32) as key, cast(subkey as uint32) as subkey, value from plato.Input);
+
+select
+ subkey,
+ sum(subkey) over w2 AS x,
+ 2 * sum(key) over w1 as dbl_sum,
+ count(key) over w1 as c,
+ min(key) over w1 as mink,
+ max(key) over w1 as maxk
+from $input
+window
+ w1 as (partition by subkey order by key % 3, key),
+ w2 as (partition by key order by subkey)
+order by subkey, x, dbl_sum;
diff --git a/yt/yql/tests/sql/suites/window/win_with_cur_row.cfg b/yt/yql/tests/sql/suites/window/win_with_cur_row.cfg
new file mode 100644
index 0000000000..582479bcde
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_with_cur_row.cfg
@@ -0,0 +1 @@
+in Input input_tutorial_users.txt
diff --git a/yt/yql/tests/sql/suites/window/win_with_cur_row.sql b/yt/yql/tests/sql/suites/window/win_with_cur_row.sql
new file mode 100644
index 0000000000..15c59c9159
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/win_with_cur_row.sql
@@ -0,0 +1,8 @@
+/* postgres can not */
+$data = (select cast(key as uint32) as age, cast(subkey as uint32) as region, value as name from plato.Input);
+
+select
+ region, name, sum(age) over w1 as sum1
+from $data
+window w1 as (partition by region order by name)
+order by region, name;
diff --git a/yt/yql/tests/sql/suites/window/yql-14479.sql b/yt/yql/tests/sql/suites/window/yql-14479.sql
new file mode 100644
index 0000000000..1a28ebbb4d
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/yql-14479.sql
@@ -0,0 +1,8 @@
+/* custom check: len(yt_res_yson[0][b'Write'][0][b'Data']) < 4 */
+/* ignore plan diff */
+USE plato;
+
+SELECT a.*, row_number() OVER (PARTITION BY key, subkey) as rn, TableName() as tn
+FROM Input as a
+TABLESAMPLE BERNOULLI(10.0) REPEATABLE(1)
+;
diff --git a/yt/yql/tests/sql/suites/window/yql-14738.sql b/yt/yql/tests/sql/suites/window/yql-14738.sql
new file mode 100644
index 0000000000..b295b092c2
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/yql-14738.sql
@@ -0,0 +1,12 @@
+/* postgres can not */
+/* syntax version 1 */
+USE plato;
+
+SELECT
+ t.*,
+ COUNT(*) OVER (PARTITION BY key || "1") as c1,
+ COUNT(*) OVER (PARTITION BY key || "2") as c2,
+ COUNT(*) OVER w as c3,
+FROM Input as t
+WINDOW w AS (PARTITION BY key || "3")
+ORDER BY subkey;
diff --git a/yt/yql/tests/sql/suites/window/yql-15636.sql b/yt/yql/tests/sql/suites/window/yql-15636.sql
new file mode 100644
index 0000000000..b9efdb2c56
--- /dev/null
+++ b/yt/yql/tests/sql/suites/window/yql-15636.sql
@@ -0,0 +1,37 @@
+/* syntax version 1 */
+/* postgres can not */
+use plato;
+
+insert into @tmp
+select
+ Just('foo') as driver_license_pd_id,
+ 'bar' as order_id,
+ '1' as user_phone_pd_id,
+ '2' as utc_order_dttm;
+commit;
+
+
+
+SELECT
+ driver_license_pd_id,
+ user_phone_pd_id,
+ utc_order_dttm,
+ order_id,
+
+ LEAD(
+ <|"order_id": order_id, "order_dttm": utc_order_dttm|>,
+ 1
+ ) OVER (
+ PARTITION BY user_phone_pd_id
+ ORDER BY utc_order_dttm
+ ) AS next_user_order,
+
+ LEAD(
+ <|"order_id": order_id|>,
+ 1
+ ) OVER (
+ PARTITION BY driver_license_pd_id
+ ORDER BY utc_order_dttm
+ ) AS next_driver_order,
+
+FROM @tmp;
diff --git a/yt/yql/tests/sql/suites/ypath/complex.sql b/yt/yql/tests/sql/suites/ypath/complex.sql
new file mode 100644
index 0000000000..8c8ec6cba9
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ypath/complex.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+SELECT * FROM plato.`Input[#0:#2,"075",#7:#9,("150","2"):("150","5")]`;
diff --git a/yt/yql/tests/sql/suites/ypath/default.cfg b/yt/yql/tests/sql/suites/ypath/default.cfg
new file mode 100644
index 0000000000..6f99339756
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ypath/default.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/ypath/direct_read_from_dynamic.cfg b/yt/yql/tests/sql/suites/ypath/direct_read_from_dynamic.cfg
new file mode 100644
index 0000000000..1908d503d1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ypath/direct_read_from_dynamic.cfg
@@ -0,0 +1,2 @@
+in Input dynamic.txt
+res result.txt
diff --git a/yt/yql/tests/sql/suites/ypath/direct_read_from_dynamic.sql b/yt/yql/tests/sql/suites/ypath/direct_read_from_dynamic.sql
new file mode 100644
index 0000000000..1f9f690313
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ypath/direct_read_from_dynamic.sql
@@ -0,0 +1,4 @@
+/* syntax version 1 */
+/* postgres can not */
+pragma direct_read;
+SELECT * FROM plato.`Input["150"]`;
diff --git a/yt/yql/tests/sql/suites/ypath/dynamic.txt.attr b/yt/yql/tests/sql/suites/ypath/dynamic.txt.attr
new file mode 100644
index 0000000000..9e3c33c4cb
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ypath/dynamic.txt.attr
@@ -0,0 +1,33 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key"; ["DataType"; "String"]];
+ ["subkey"; ["DataType"; "String"]];
+ ["value"; ["DataType"; "String"]];
+ ]];
+ "SortMembers"=["key"; "subkey"];
+ "SortedBy"=["key"; "subkey"];
+ "SortDirections"=[1; 1];
+ "SortedByTypes"=[["DataType";"String"]; ["DataType";"String"]]
+ };
+ "_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/ypath/empty_range-dynamic.cfg b/yt/yql/tests/sql/suites/ypath/empty_range-dynamic.cfg
new file mode 100644
index 0000000000..a35dbb3169
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ypath/empty_range-dynamic.cfg
@@ -0,0 +1,3 @@
+in Input dynamic.txt
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/ypath/empty_range.cfg b/yt/yql/tests/sql/suites/ypath/empty_range.cfg
new file mode 100644
index 0000000000..2c31ed76e1
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ypath/empty_range.cfg
@@ -0,0 +1,3 @@
+in Input input.txt
+res result.txt
+providers yt
diff --git a/yt/yql/tests/sql/suites/ypath/empty_range.sql b/yt/yql/tests/sql/suites/ypath/empty_range.sql
new file mode 100644
index 0000000000..397ed970db
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ypath/empty_range.sql
@@ -0,0 +1,2 @@
+/*ytfile can not*/
+SELECT * FROM plato.`<ranges=[]>//Input`;
diff --git a/yt/yql/tests/sql/suites/ypath/input.txt.attr b/yt/yql/tests/sql/suites/ypath/input.txt.attr
new file mode 100644
index 0000000000..7a11b85b77
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ypath/input.txt.attr
@@ -0,0 +1,13 @@
+{
+ "_yql_row_spec"={
+ "Type"=["StructType";[
+ ["key"; ["DataType"; "String"]];
+ ["subkey"; ["DataType"; "String"]];
+ ["value"; ["DataType"; "String"]];
+ ]];
+ "SortMembers"=["key"; "subkey"];
+ "SortedBy"=["key"; "subkey"];
+ "SortDirections"=[1; 1];
+ "SortedByTypes"=[["DataType";"String"]; ["DataType";"String"]]
+ };
+}
diff --git a/yt/yql/tests/sql/suites/ypath/limit_with_key.sql b/yt/yql/tests/sql/suites/ypath/limit_with_key.sql
new file mode 100644
index 0000000000..7d0b726842
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ypath/limit_with_key.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+SELECT * FROM plato.`Input["150"]` LIMIT 2;
diff --git a/yt/yql/tests/sql/suites/ypath/limit_with_range.sql b/yt/yql/tests/sql/suites/ypath/limit_with_range.sql
new file mode 100644
index 0000000000..7739be5c32
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ypath/limit_with_range.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+SELECT * FROM plato.`Input[#1:#4]` LIMIT 2;
diff --git a/yt/yql/tests/sql/suites/ypath/multi_key.sql b/yt/yql/tests/sql/suites/ypath/multi_key.sql
new file mode 100644
index 0000000000..ccc77294e8
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ypath/multi_key.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+SELECT * FROM plato.`Input[("150","2"):("150","5"),"075"]`;
diff --git a/yt/yql/tests/sql/suites/ypath/multi_range.sql b/yt/yql/tests/sql/suites/ypath/multi_range.sql
new file mode 100644
index 0000000000..ecdc211aea
--- /dev/null
+++ b/yt/yql/tests/sql/suites/ypath/multi_range.sql
@@ -0,0 +1,3 @@
+/* syntax version 1 */
+/* postgres can not */
+SELECT * FROM plato.`Input[#0:#2,#4:#7]`; \ No newline at end of file