Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

stable-24-2: Enable COUNT in view queries (#6820) #7501

Merged
merged 1 commit into from
Aug 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions ydb/core/kqp/provider/rewrite_io_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ NSQLTranslation::TTranslationSettings CreateViewTranslationSettings(const TStrin
TExprNode::TPtr CompileViewQuery(
const TString& query,
TExprContext& ctx,
const TString& cluster
const TString& cluster,
IModuleResolver::TPtr moduleResolver
) {
TAstParseResult queryAst;
queryAst = NSQLTranslation::SqlToYql(query, CreateViewTranslationSettings(cluster));
Expand All @@ -39,7 +40,7 @@ TExprNode::TPtr CompileViewQuery(
}

TExprNode::TPtr queryGraph;
if (!CompileExpr(*queryAst.Root, queryGraph, ctx, nullptr, nullptr)) {
if (!CompileExpr(*queryAst.Root, queryGraph, ctx, moduleResolver.get(), nullptr)) {
return nullptr;
}

Expand Down Expand Up @@ -123,14 +124,15 @@ TExprNode::TPtr RewriteReadFromView(
const TExprNode::TPtr& node,
TExprContext& ctx,
const TString& query,
const TString& cluster
const TString& cluster,
IModuleResolver::TPtr moduleResolver
) {
const TCoRead readNode(node->ChildPtr(0));
const auto worldBeforeThisRead = readNode.World().Ptr();

TExprNode::TPtr queryGraph = FindSavedQueryGraph(readNode.Ptr());
if (!queryGraph) {
queryGraph = CompileViewQuery(query, ctx, cluster);
queryGraph = CompileViewQuery(query, ctx, cluster, moduleResolver);
if (!queryGraph) {
ctx.AddError(TIssue(ctx.GetPosition(readNode.Pos()),
"The query stored in the view cannot be compiled."));
Expand Down
3 changes: 2 additions & 1 deletion ydb/core/kqp/provider/rewrite_io_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ TExprNode::TPtr RewriteReadFromView(
const TExprNode::TPtr& node,
TExprContext& ctx,
const TString& query,
const TString& cluster
const TString& cluster,
IModuleResolver::TPtr moduleResolver
);

}
3 changes: 2 additions & 1 deletion ydb/core/kqp/provider/yql_kikimr_datasource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -754,6 +754,7 @@ class TKikimrDataSource : public TDataProviderBase {
}

ctx.Step
.Repeat(TExprStep::ExpandApplyForLambdas)
.Repeat(TExprStep::ExprEval)
.Repeat(TExprStep::DiscoveryIO)
.Repeat(TExprStep::Epochs)
Expand All @@ -762,7 +763,7 @@ class TKikimrDataSource : public TDataProviderBase {
.Repeat(TExprStep::RewriteIO);

const auto& query = tableDesc.Metadata->ViewPersistedData.QueryText;
return RewriteReadFromView(node, ctx, query, cluster);
return RewriteReadFromView(node, ctx, query, cluster, Types.Modules);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
CREATE VIEW `/Root/aggregates_and_window` WITH (security_invoker = TRUE) AS
SELECT
series.title AS series,
series_stats.seasons_with_episode_count_greater_than_average AS seasons_with_episode_count_greater_than_average
FROM (
SELECT
series_id,
SUM(
CASE
WHEN episode_count > average_episodes_in_season
THEN 1
ELSE 0
END
) AS seasons_with_episode_count_greater_than_average
FROM (
SELECT
series_id,
season_id,
episode_count,
AVG(episode_count) OVER average_episodes_in_season_window AS average_episodes_in_season
FROM (
SELECT
series_id,
season_id,
COUNT(*) AS episode_count
FROM `/Root/episodes`
GROUP BY
series_id,
season_id
)
WINDOW
average_episodes_in_season_window AS (
PARTITION BY
series_id
)
)
GROUP BY
series_id
)
AS series_stats
JOIN `/Root/series`
AS series
USING (series_id);
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DROP VIEW `/Root/aggregates_and_window`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
SELECT
*
FROM (
SELECT
series.title AS series,
series_stats.seasons_with_episode_count_greater_than_average AS seasons_with_episode_count_greater_than_average
FROM (
SELECT
series_id,
SUM(
CASE
WHEN episode_count > average_episodes_in_season
THEN 1
ELSE 0
END
) AS seasons_with_episode_count_greater_than_average
FROM (
SELECT
series_id,
season_id,
episode_count,
AVG(episode_count) OVER average_episodes_in_season_window AS average_episodes_in_season
FROM (
SELECT
series_id,
season_id,
COUNT(*) AS episode_count
FROM `/Root/episodes`
GROUP BY
series_id,
season_id
)
WINDOW
average_episodes_in_season_window AS (
PARTITION BY
series_id
)
)
GROUP BY
series_id
)
AS series_stats
JOIN `/Root/series`
AS series
USING (series_id)
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SELECT
*
FROM `/Root/aggregates_and_window`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
CREATE VIEW `/Root/count_episodes` WITH (security_invoker = TRUE) AS
SELECT
series_id,
season_id,
COUNT(*)
FROM `/Root/episodes`
GROUP BY
series_id,
season_id;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DROP VIEW `/Root/count_episodes`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
SELECT
*
FROM (
SELECT
series_id,
season_id,
COUNT(*)
FROM `/Root/episodes`
GROUP BY
series_id,
season_id
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SELECT
*
FROM `/Root/count_episodes`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
CREATE VIEW `/Root/count_episodes_with_titles` WITH (security_invoker = TRUE) AS
SELECT
series.title AS series,
seasons.title AS season,
episodes.episode_count AS episode_count
FROM (
SELECT
series_id,
season_id,
COUNT(*) AS episode_count
FROM `/Root/episodes`
GROUP BY
series_id,
season_id
)
AS episodes
JOIN `/Root/series`
AS series
ON episodes.series_id == series.series_id
JOIN `/Root/seasons`
AS seasons
ON episodes.series_id == seasons.series_id AND episodes.season_id == seasons.season_id;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DROP VIEW `/Root/count_episodes_with_titles`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
SELECT
*
FROM (
SELECT
series.title AS series,
seasons.title AS season,
episodes.episode_count AS episode_count
FROM (
SELECT
series_id,
season_id,
COUNT(*) AS episode_count
FROM `/Root/episodes`
GROUP BY
series_id,
season_id
)
AS episodes
JOIN `/Root/series`
AS series
ON episodes.series_id == series.series_id
JOIN `/Root/seasons`
AS seasons
ON episodes.series_id == seasons.series_id AND episodes.season_id == seasons.season_id
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SELECT
*
FROM `/Root/count_episodes_with_titles`;
4 changes: 4 additions & 0 deletions ydb/core/kqp/ut/view/input/cases/count_rows/create_view.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
CREATE VIEW `/Root/count_rows` WITH (security_invoker = TRUE) AS
SELECT
COUNT(*)
FROM `/Root/episodes`;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DROP VIEW `/Root/count_rows`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
SELECT
*
FROM (
SELECT
COUNT(*)
FROM `/Root/episodes`
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SELECT
*
FROM `/Root/count_rows`;
Loading