aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials/tests/sql/suites/flatten_by
diff options
context:
space:
mode:
authorudovichenko-r <udovichenko-r@yandex-team.com>2024-11-19 14:58:38 +0300
committerudovichenko-r <udovichenko-r@yandex-team.com>2024-11-19 15:16:27 +0300
commit24521403b1c44303e043ba540c09b1fe991c7474 (patch)
tree341d1e7206bc7c143d04d2d96f05b6dc0655606d /yql/essentials/tests/sql/suites/flatten_by
parent72b3cd51dc3fb9d16975d353ea82fd85701393cc (diff)
downloadydb-24521403b1c44303e043ba540c09b1fe991c7474.tar.gz
YQL-19206 Move contrib/ydb/library/yql/tests/sql/suites -> yql/essentials/tests/sql/suites
commit_hash:d0ef1f92b09c94db7c2408f946d2a4c62b603f00
Diffstat (limited to 'yql/essentials/tests/sql/suites/flatten_by')
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/default.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_and_where.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_and_where.sql5
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_by_aster_opt.sql3
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_by_group_by_alias_collision.sql11
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_by_opt_dict.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_by_opt_dict.sql5
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_by_typed_table.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_by_typed_table.sql3
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_columns.sql10
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_columns_by_aggregate.sql16
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_columns_non_struct.sql6
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_columns_with_opt_struct.sql6
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_corr_name_column.sql15
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_dict.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_dict.sql13
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_dict_by_opt.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_dict_by_opt.sql5
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_expr.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_expr.sql7
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_expr_groupby.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_expr_groupby.sql7
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_expr_join.cfg4
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_expr_join.sql8
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_expr_struct.sql12
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_expr_where.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_expr_where.sql7
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_few_fields.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_few_fields.sql8
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_list.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_list.sql5
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.sql22
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.txt9
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.txt.attr55
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_member_is_struct.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_member_is_struct.sql12
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_mode.sql40
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_one_field.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_one_field.sql5
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_one_field_another.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_one_field_another.sql5
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_two_fields.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_two_fields.sql5
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_with_group_by.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_with_group_by.sql5
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_with_group_by_expr.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_with_group_by_expr.sql5
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_with_join.cfg1
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_with_join.sql9
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_with_resource.cfg2
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_with_resource.sql19
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/flatten_with_subquery.sql9
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/input.txt4
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/input_intersect.txt14
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/input_intersect_sorted.txt14
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/input_opt_struct_field.txt12
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/input_opt_struct_field.txt.attr11
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/struct_with_wrong_correlation.sqlx10
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/struct_without_correlation.sql14
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/table_funcs_spec_flatten_by.sqlx10
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/typed_table.txt4
-rw-r--r--yql/essentials/tests/sql/suites/flatten_by/typed_table.txt.attr31
63 files changed, 501 insertions, 0 deletions
diff --git a/yql/essentials/tests/sql/suites/flatten_by/default.cfg b/yql/essentials/tests/sql/suites/flatten_by/default.cfg
new file mode 100644
index 0000000000..58878f8945
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/default.cfg
@@ -0,0 +1 @@
+in Input input.txt
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_and_where.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_and_where.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_and_where.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_and_where.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_and_where.sql
new file mode 100644
index 0000000000..df60a53b83
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_by_aster_opt.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_by_aster_opt.sql
new file mode 100644
index 0000000000..7294949685
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_by_group_by_alias_collision.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_by_group_by_alias_collision.sql
new file mode 100644
index 0000000000..abf34243eb
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_by_group_by_alias_collision.sql
@@ -0,0 +1,11 @@
+/* syntax version 1 */
+
+$data = [<|key:1, subkeys:[1,2,2,3,4,5]|>, <|key:2, subkeys:[1,2,3,5,6,8]|>];
+
+SELECT
+ subkey,
+ COUNT(key) as cnt
+FROM AS_TABLE($data)
+FLATTEN LIST BY subkeys as subkey
+GROUP BY CAST(subkey as String) as subkey
+ORDER BY subkey;
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_by_opt_dict.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_by_opt_dict.cfg
new file mode 100644
index 0000000000..bf1b560b58
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_by_opt_dict.cfg
@@ -0,0 +1 @@
+in Input input_intersect_sorted.txt
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_by_opt_dict.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_by_opt_dict.sql
new file mode 100644
index 0000000000..1182060308
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_by_typed_table.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_by_typed_table.cfg
new file mode 100644
index 0000000000..eaccb9ef55
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_by_typed_table.cfg
@@ -0,0 +1 @@
+in Input typed_table.txt
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_by_typed_table.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_by_typed_table.sql
new file mode 100644
index 0000000000..10cf6ca887
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_columns.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_columns.sql
new file mode 100644
index 0000000000..12fe13e98d
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_columns_by_aggregate.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_columns_by_aggregate.sql
new file mode 100644
index 0000000000..3ab01cc18d
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_columns_non_struct.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_columns_non_struct.sql
new file mode 100644
index 0000000000..c8fe587c6e
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_columns_non_struct.sql
@@ -0,0 +1,6 @@
+/* postgres can not */
+select * from (
+select 1,AsStruct(2 as foo),Just(AsStruct(3 as bar)),
+Just(AsStruct(Just(4) as qwe))
+)
+flatten columns;
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_columns_with_opt_struct.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_columns_with_opt_struct.sql
new file mode 100644
index 0000000000..80ad6d7a82
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_columns_with_opt_struct.sql
@@ -0,0 +1,6 @@
+SELECT
+ *
+FROM (
+ SELECT JUST(<|col1: 1, col2: NULL, col3: Just(3), col4: 4p|>)
+)
+FLATTEN COLUMNS;
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_corr_name_column.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_corr_name_column.sql
new file mode 100644
index 0000000000..666a9f5706
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_dict.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_dict.cfg
new file mode 100644
index 0000000000..bf1b560b58
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_dict.cfg
@@ -0,0 +1 @@
+in Input input_intersect_sorted.txt
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_dict.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_dict.sql
new file mode 100644
index 0000000000..a9618c7aac
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_dict_by_opt.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_dict_by_opt.cfg
new file mode 100644
index 0000000000..bf1b560b58
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_dict_by_opt.cfg
@@ -0,0 +1 @@
+in Input input_intersect_sorted.txt
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_dict_by_opt.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_dict_by_opt.sql
new file mode 100644
index 0000000000..79acee152b
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_expr.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_expr.cfg
new file mode 100644
index 0000000000..5c248bff3d
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_expr.cfg
@@ -0,0 +1 @@
+udf string_udf
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_expr.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_expr.sql
new file mode 100644
index 0000000000..e2b17cb4cc
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_expr.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* postgres can not */
+
+$data = SELECT "a,b,c,d" AS a, "e,f,g,h" AS b, "x" AS c;
+
+SELECT a,bb,c FROM $data FLATTEN BY (String::SplitToList(a, ",") as a, String::SplitToList(b, ",") as bb) ORDER BY a,bb;
+
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_groupby.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_groupby.cfg
new file mode 100644
index 0000000000..5c248bff3d
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_groupby.cfg
@@ -0,0 +1 @@
+udf string_udf
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_groupby.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_groupby.sql
new file mode 100644
index 0000000000..235e70d859
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_groupby.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* postgres can not */
+
+$data = SELECT "a,b,c,d" AS a, "e,f,g,h" AS b, "x" AS c;
+
+SELECT bb,count(*) as count FROM $data FLATTEN BY (String::SplitToList(a, ",") as a, String::SplitToList(b, ",") as bb) GROUP BY bb ORDER BY bb,count;
+
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_join.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_join.cfg
new file mode 100644
index 0000000000..c1a1de6dd0
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_join.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_join.sql
new file mode 100644
index 0000000000..810c8b615d
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_struct.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_struct.sql
new file mode 100644
index 0000000000..35ca94eeb8
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_where.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_where.cfg
new file mode 100644
index 0000000000..5c248bff3d
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_where.cfg
@@ -0,0 +1 @@
+udf string_udf
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_where.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_where.sql
new file mode 100644
index 0000000000..f2ba420046
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_expr_where.sql
@@ -0,0 +1,7 @@
+/* syntax version 1 */
+/* postgres can not */
+
+$data = SELECT "a,b,c,d" AS a, "e,f,g,h" AS b, "x" AS c;
+
+SELECT a,bb,c FROM $data FLATTEN BY (String::SplitToList(a, ",") as a, String::SplitToList(b, ",") as bb) WHERE bb != "h" ORDER BY a,bb;
+
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_few_fields.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_few_fields.cfg
new file mode 100644
index 0000000000..bf1b560b58
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_few_fields.cfg
@@ -0,0 +1 @@
+in Input input_intersect_sorted.txt
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_few_fields.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_few_fields.sql
new file mode 100644
index 0000000000..2f7ccd4bbb
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_list.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_list.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_list.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_list.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_list.sql
new file mode 100644
index 0000000000..4a7c16bac7
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.cfg
new file mode 100644
index 0000000000..2513e0a9c7
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.sql
new file mode 100644
index 0000000000..dfb14aea15
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.txt b/yql/essentials/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.txt
new file mode 100644
index 0000000000..933b47e67d
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.txt
@@ -0,0 +1,9 @@
+{"bc_type_tuple"=["not_discovery";"1org";];"parsed_answers_and_clicks"=[[[1022482316;];1;["bizfinder";];];];};
+{"bc_type_tuple"=["not_discovery";"1org";];"parsed_answers_and_clicks"=[[[63320754500;];1;["bizfinder";];];];};
+{"bc_type_tuple"=["unknown";"other";];"parsed_answers_and_clicks"=[[[56725259;];1;["geocoder";];];];};
+{"bc_type_tuple"=["not_discovery";"1org";];"parsed_answers_and_clicks"=[[[1393063799;];1;["yabs";];];];};
+{"bc_type_tuple"=["not_discovery";"1org";];"parsed_answers_and_clicks"=[[[1102340823;];1;["bizfinder";];];];};
+{"bc_type_tuple"=["not_discovery";"1org";];"parsed_answers_and_clicks"=[[[1030456454;];1;["yabs";];];[[1023091930;];0;["yabs";];];[[91758116818;];0;["bizfinder";];];[[1089475933;];0;["yabs";];];[[1001186033;];0;["bizfinder";];];[[1746904934;];0;["bizfinder";];];[[16660487830;];0;["bizfinder";];];[[1927062611;];0;["bizfinder";];];[[211087055144;];0;["bizfinder";];];[[240631521347;];0;["bizfinder";];];];};
+{"bc_type_tuple"=["not_discovery";"1org";];"parsed_answers_and_clicks"=[[[1128735493;];1;["bizfinder";];];[[1093055816;];0;["bizfinder";];];[[1101660521;];0;["bizfinder";];];];};
+{"bc_type_tuple"=["not_discovery";"1org";];"parsed_answers_and_clicks"=[[[1159830271;];1;["bizfinder";];];[[1030802514;];0;["bizfinder";];];];};
+
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.txt.attr b/yql/essentials/tests/sql/suites/flatten_by/flatten_list_on_flatten_by.txt.attr
new file mode 100644
index 0000000000..1f5a7568d4
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_member_is_struct.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_member_is_struct.cfg
new file mode 100644
index 0000000000..ff4186ea03
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_member_is_struct.cfg
@@ -0,0 +1 @@
+in Input input_opt_struct_field.txt
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_member_is_struct.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_member_is_struct.sql
new file mode 100644
index 0000000000..20bcbb42be
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_mode.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_mode.sql
new file mode 100644
index 0000000000..655c4940e1
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_one_field.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_one_field.cfg
new file mode 100644
index 0000000000..bf1b560b58
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_one_field.cfg
@@ -0,0 +1 @@
+in Input input_intersect_sorted.txt
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_one_field.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_one_field.sql
new file mode 100644
index 0000000000..c96cad25fb
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_one_field_another.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_one_field_another.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_one_field_another.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_one_field_another.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_one_field_another.sql
new file mode 100644
index 0000000000..6145dcecbd
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_two_fields.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_two_fields.cfg
new file mode 100644
index 0000000000..bf1b560b58
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_two_fields.cfg
@@ -0,0 +1 @@
+in Input input_intersect_sorted.txt
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_two_fields.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_two_fields.sql
new file mode 100644
index 0000000000..85633c4ae5
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_with_group_by.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_with_group_by.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_with_group_by.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_with_group_by.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_with_group_by.sql
new file mode 100644
index 0000000000..9d68c54e9f
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_with_group_by_expr.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_with_group_by_expr.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_with_group_by_expr.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_with_group_by_expr.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_with_group_by_expr.sql
new file mode 100644
index 0000000000..cb6da4021f
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_with_join.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_with_join.cfg
new file mode 100644
index 0000000000..3df7813790
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_with_join.cfg
@@ -0,0 +1 @@
+in Input input_intersect.txt
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_with_join.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_with_join.sql
new file mode 100644
index 0000000000..b7139810ec
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_with_resource.cfg b/yql/essentials/tests/sql/suites/flatten_by/flatten_with_resource.cfg
new file mode 100644
index 0000000000..289c4251bb
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/flatten_with_resource.cfg
@@ -0,0 +1,2 @@
+in Input input.txt
+udf python3_udf
diff --git a/yql/essentials/tests/sql/suites/flatten_by/flatten_with_resource.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_with_resource.sql
new file mode 100644
index 0000000000..8dda0726f4
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/flatten_with_subquery.sql b/yql/essentials/tests/sql/suites/flatten_by/flatten_with_subquery.sql
new file mode 100644
index 0000000000..ac7cab2094
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/input.txt b/yql/essentials/tests/sql/suites/flatten_by/input.txt
new file mode 100644
index 0000000000..65949ea745
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/input.txt
@@ -0,0 +1,4 @@
+{"key"="075";"subkey"="1";"value"="abc"};
+{"key"="800";"subkey"="2";"value"="ddd"};
+{"key"="020";"subkey"="3";"value"="q"};
+{"key"="150";"subkey"="4";"value"="qzz"};
diff --git a/yql/essentials/tests/sql/suites/flatten_by/input_intersect.txt b/yql/essentials/tests/sql/suites/flatten_by/input_intersect.txt
new file mode 100644
index 0000000000..42bcf2179e
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/input_intersect.txt
@@ -0,0 +1,14 @@
+{"key"="075";"subkey"="911";"value"="abc"};
+{"key"="911";"subkey"="1";"value"="kkk"};
+{"key"="023";"subkey"="527";"value"="aaa"};
+{"key"="527";"subkey"="023";"value"="bbb"};
+{"key"="037";"subkey"="075";"value"="ddd"};
+{"key"="761";"subkey"="911";"value"="ccc"};
+{"key"="200";"subkey"="075";"value"="qqq"};
+{"key"="150";"subkey"="075";"value"="zzz"};
+{"key"="023";"subkey"="911";"value"="vca"};
+{"key"="527";"subkey"="150";"value"="oef"};
+{"key"="037";"subkey"="761";"value"="vdf"};
+{"key"="761";"subkey"="037";"value"="aet"};
+{"key"="200";"subkey"="150";"value"="fdb"};
+{"key"="150";"subkey"="037";"value"="bfs"};
diff --git a/yql/essentials/tests/sql/suites/flatten_by/input_intersect_sorted.txt b/yql/essentials/tests/sql/suites/flatten_by/input_intersect_sorted.txt
new file mode 100644
index 0000000000..617e73e92f
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/input_intersect_sorted.txt
@@ -0,0 +1,14 @@
+{"key"="023";"subkey"="527";"value"="aaa"};
+{"key"="023";"subkey"="911";"value"="vca"};
+{"key"="037";"subkey"="075";"value"="ddd"};
+{"key"="037";"subkey"="761";"value"="vdf"};
+{"key"="075";"subkey"="911";"value"="abc"};
+{"key"="150";"subkey"="037";"value"="bfs"};
+{"key"="150";"subkey"="075";"value"="zzz"};
+{"key"="200";"subkey"="075";"value"="qqq"};
+{"key"="200";"subkey"="150";"value"="fdb"};
+{"key"="527";"subkey"="023";"value"="bbb"};
+{"key"="527";"subkey"="150";"value"="oef"};
+{"key"="761";"subkey"="037";"value"="aet"};
+{"key"="761";"subkey"="911";"value"="ccc"};
+{"key"="911";"subkey"="1";"value"="kkk"};
diff --git a/yql/essentials/tests/sql/suites/flatten_by/input_opt_struct_field.txt b/yql/essentials/tests/sql/suites/flatten_by/input_opt_struct_field.txt
new file mode 100644
index 0000000000..72dd9c3bfb
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/input_opt_struct_field.txt
@@ -0,0 +1,12 @@
+{"key"=[[]];"subkey"="3";"value"="zer"};
+{"key"=[[]];"subkey"="9";"value"="ger"};
+{"key"=[[ 23u]];"subkey"="3";"value"="aaa"};
+{"key"=[[ 37u]];"subkey"="5";"value"="ddd"};
+{"key"=[[ 75u]];"subkey"="1";"value"="abc"};
+{"key"=[[150u]];"subkey"="1";"value"="aaa"};
+{"key"=[[150u]];"subkey"="3";"value"="iii"};
+{"key"=[[150u]];"subkey"="8";"value"="zzz"};
+{"key"=[[200u]];"subkey"="7";"value"="qqq"};
+{"key"=[[527u]];"subkey"="4";"value"="bbb"};
+{"key"=[[761u]];"subkey"="6";"value"="ccc"};
+{"key"=[[911u]];"subkey"="2";"value"="kkk"};
diff --git a/yql/essentials/tests/sql/suites/flatten_by/input_opt_struct_field.txt.attr b/yql/essentials/tests/sql/suites/flatten_by/input_opt_struct_field.txt.attr
new file mode 100644
index 0000000000..b5a76775f2
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/struct_with_wrong_correlation.sqlx b/yql/essentials/tests/sql/suites/flatten_by/struct_with_wrong_correlation.sqlx
new file mode 100644
index 0000000000..78e5c04267
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/struct_with_wrong_correlation.sqlx
@@ -0,0 +1,10 @@
+/* postgres can not */
+pragma sampleselect;
+use plato;
+
+$data_dict = (select mod, some(AsStruct(key as s, subkey as subkey)) as list_struct from Input group by cast(key as uint32) % 10 as mod order by mod);
+
+select
+ zz.s -- try with invalid correlation (show as wrong column)
+from $data_dict as dd
+flatten by list_struct as s
diff --git a/yql/essentials/tests/sql/suites/flatten_by/struct_without_correlation.sql b/yql/essentials/tests/sql/suites/flatten_by/struct_without_correlation.sql
new file mode 100644
index 0000000000..b280873d88
--- /dev/null
+++ b/yql/essentials/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/yql/essentials/tests/sql/suites/flatten_by/table_funcs_spec_flatten_by.sqlx b/yql/essentials/tests/sql/suites/flatten_by/table_funcs_spec_flatten_by.sqlx
new file mode 100644
index 0000000000..a4815a1bc5
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/table_funcs_spec_flatten_by.sqlx
@@ -0,0 +1,10 @@
+/* postgres can not */
+use plato;
+
+insert into Output
+select
+ key,
+ value,
+ TablePath()
+from Input flatten by (key)
+;
diff --git a/yql/essentials/tests/sql/suites/flatten_by/typed_table.txt b/yql/essentials/tests/sql/suites/flatten_by/typed_table.txt
new file mode 100644
index 0000000000..cc1df00106
--- /dev/null
+++ b/yql/essentials/tests/sql/suites/flatten_by/typed_table.txt
@@ -0,0 +1,4 @@
+{"key"="075";"subkey"="";"value"="a7c"};
+{"key"="800";"subkey"="2";"value"="ddd"};
+{"key"="020";"subkey"="";"value"="q"};
+{"key"="150";"subkey"="4";"value"="q8z"};
diff --git a/yql/essentials/tests/sql/suites/flatten_by/typed_table.txt.attr b/yql/essentials/tests/sql/suites/flatten_by/typed_table.txt.attr
new file mode 100644
index 0000000000..67a1eb4bde
--- /dev/null
+++ b/yql/essentials/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"
+ ]
+ ]
+ ]
+ ]
+ }
+}