Skip to content

Commit 2d3a63b

Browse files
authored
stable-24-2: Enable COUNT in view queries (#6820) (#7501)
1 parent b5c55a4 commit 2d3a63b

19 files changed

+194
-6
lines changed

ydb/core/kqp/provider/rewrite_io_utils.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ NSQLTranslation::TTranslationSettings CreateViewTranslationSettings(const TStrin
2828
TExprNode::TPtr CompileViewQuery(
2929
const TString& query,
3030
TExprContext& ctx,
31-
const TString& cluster
31+
const TString& cluster,
32+
IModuleResolver::TPtr moduleResolver
3233
) {
3334
TAstParseResult queryAst;
3435
queryAst = NSQLTranslation::SqlToYql(query, CreateViewTranslationSettings(cluster));
@@ -39,7 +40,7 @@ TExprNode::TPtr CompileViewQuery(
3940
}
4041

4142
TExprNode::TPtr queryGraph;
42-
if (!CompileExpr(*queryAst.Root, queryGraph, ctx, nullptr, nullptr)) {
43+
if (!CompileExpr(*queryAst.Root, queryGraph, ctx, moduleResolver.get(), nullptr)) {
4344
return nullptr;
4445
}
4546

@@ -123,14 +124,15 @@ TExprNode::TPtr RewriteReadFromView(
123124
const TExprNode::TPtr& node,
124125
TExprContext& ctx,
125126
const TString& query,
126-
const TString& cluster
127+
const TString& cluster,
128+
IModuleResolver::TPtr moduleResolver
127129
) {
128130
const TCoRead readNode(node->ChildPtr(0));
129131
const auto worldBeforeThisRead = readNode.World().Ptr();
130132

131133
TExprNode::TPtr queryGraph = FindSavedQueryGraph(readNode.Ptr());
132134
if (!queryGraph) {
133-
queryGraph = CompileViewQuery(query, ctx, cluster);
135+
queryGraph = CompileViewQuery(query, ctx, cluster, moduleResolver);
134136
if (!queryGraph) {
135137
ctx.AddError(TIssue(ctx.GetPosition(readNode.Pos()),
136138
"The query stored in the view cannot be compiled."));

ydb/core/kqp/provider/rewrite_io_utils.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ TExprNode::TPtr RewriteReadFromView(
88
const TExprNode::TPtr& node,
99
TExprContext& ctx,
1010
const TString& query,
11-
const TString& cluster
11+
const TString& cluster,
12+
IModuleResolver::TPtr moduleResolver
1213
);
1314

1415
}

ydb/core/kqp/provider/yql_kikimr_datasource.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,7 @@ class TKikimrDataSource : public TDataProviderBase {
754754
}
755755

756756
ctx.Step
757+
.Repeat(TExprStep::ExpandApplyForLambdas)
757758
.Repeat(TExprStep::ExprEval)
758759
.Repeat(TExprStep::DiscoveryIO)
759760
.Repeat(TExprStep::Epochs)
@@ -762,7 +763,7 @@ class TKikimrDataSource : public TDataProviderBase {
762763
.Repeat(TExprStep::RewriteIO);
763764

764765
const auto& query = tableDesc.Metadata->ViewPersistedData.QueryText;
765-
return RewriteReadFromView(node, ctx, query, cluster);
766+
return RewriteReadFromView(node, ctx, query, cluster, Types.Modules);
766767
}
767768
}
768769

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
CREATE VIEW `/Root/aggregates_and_window` WITH (security_invoker = TRUE) AS
2+
SELECT
3+
series.title AS series,
4+
series_stats.seasons_with_episode_count_greater_than_average AS seasons_with_episode_count_greater_than_average
5+
FROM (
6+
SELECT
7+
series_id,
8+
SUM(
9+
CASE
10+
WHEN episode_count > average_episodes_in_season
11+
THEN 1
12+
ELSE 0
13+
END
14+
) AS seasons_with_episode_count_greater_than_average
15+
FROM (
16+
SELECT
17+
series_id,
18+
season_id,
19+
episode_count,
20+
AVG(episode_count) OVER average_episodes_in_season_window AS average_episodes_in_season
21+
FROM (
22+
SELECT
23+
series_id,
24+
season_id,
25+
COUNT(*) AS episode_count
26+
FROM `/Root/episodes`
27+
GROUP BY
28+
series_id,
29+
season_id
30+
)
31+
WINDOW
32+
average_episodes_in_season_window AS (
33+
PARTITION BY
34+
series_id
35+
)
36+
)
37+
GROUP BY
38+
series_id
39+
)
40+
AS series_stats
41+
JOIN `/Root/series`
42+
AS series
43+
USING (series_id);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DROP VIEW `/Root/aggregates_and_window`;
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
SELECT
2+
*
3+
FROM (
4+
SELECT
5+
series.title AS series,
6+
series_stats.seasons_with_episode_count_greater_than_average AS seasons_with_episode_count_greater_than_average
7+
FROM (
8+
SELECT
9+
series_id,
10+
SUM(
11+
CASE
12+
WHEN episode_count > average_episodes_in_season
13+
THEN 1
14+
ELSE 0
15+
END
16+
) AS seasons_with_episode_count_greater_than_average
17+
FROM (
18+
SELECT
19+
series_id,
20+
season_id,
21+
episode_count,
22+
AVG(episode_count) OVER average_episodes_in_season_window AS average_episodes_in_season
23+
FROM (
24+
SELECT
25+
series_id,
26+
season_id,
27+
COUNT(*) AS episode_count
28+
FROM `/Root/episodes`
29+
GROUP BY
30+
series_id,
31+
season_id
32+
)
33+
WINDOW
34+
average_episodes_in_season_window AS (
35+
PARTITION BY
36+
series_id
37+
)
38+
)
39+
GROUP BY
40+
series_id
41+
)
42+
AS series_stats
43+
JOIN `/Root/series`
44+
AS series
45+
USING (series_id)
46+
);
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
SELECT
2+
*
3+
FROM `/Root/aggregates_and_window`;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CREATE VIEW `/Root/count_episodes` WITH (security_invoker = TRUE) AS
2+
SELECT
3+
series_id,
4+
season_id,
5+
COUNT(*)
6+
FROM `/Root/episodes`
7+
GROUP BY
8+
series_id,
9+
season_id;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DROP VIEW `/Root/count_episodes`;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
SELECT
2+
*
3+
FROM (
4+
SELECT
5+
series_id,
6+
season_id,
7+
COUNT(*)
8+
FROM `/Root/episodes`
9+
GROUP BY
10+
series_id,
11+
season_id
12+
);
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
SELECT
2+
*
3+
FROM `/Root/count_episodes`;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
CREATE VIEW `/Root/count_episodes_with_titles` WITH (security_invoker = TRUE) AS
2+
SELECT
3+
series.title AS series,
4+
seasons.title AS season,
5+
episodes.episode_count AS episode_count
6+
FROM (
7+
SELECT
8+
series_id,
9+
season_id,
10+
COUNT(*) AS episode_count
11+
FROM `/Root/episodes`
12+
GROUP BY
13+
series_id,
14+
season_id
15+
)
16+
AS episodes
17+
JOIN `/Root/series`
18+
AS series
19+
ON episodes.series_id == series.series_id
20+
JOIN `/Root/seasons`
21+
AS seasons
22+
ON episodes.series_id == seasons.series_id AND episodes.season_id == seasons.season_id;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DROP VIEW `/Root/count_episodes_with_titles`;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
SELECT
2+
*
3+
FROM (
4+
SELECT
5+
series.title AS series,
6+
seasons.title AS season,
7+
episodes.episode_count AS episode_count
8+
FROM (
9+
SELECT
10+
series_id,
11+
season_id,
12+
COUNT(*) AS episode_count
13+
FROM `/Root/episodes`
14+
GROUP BY
15+
series_id,
16+
season_id
17+
)
18+
AS episodes
19+
JOIN `/Root/series`
20+
AS series
21+
ON episodes.series_id == series.series_id
22+
JOIN `/Root/seasons`
23+
AS seasons
24+
ON episodes.series_id == seasons.series_id AND episodes.season_id == seasons.season_id
25+
);
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
SELECT
2+
*
3+
FROM `/Root/count_episodes_with_titles`;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
CREATE VIEW `/Root/count_rows` WITH (security_invoker = TRUE) AS
2+
SELECT
3+
COUNT(*)
4+
FROM `/Root/episodes`;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DROP VIEW `/Root/count_rows`;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
SELECT
2+
*
3+
FROM (
4+
SELECT
5+
COUNT(*)
6+
FROM `/Root/episodes`
7+
);
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
SELECT
2+
*
3+
FROM `/Root/count_rows`;

0 commit comments

Comments
 (0)