summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Romanov <[email protected]>2025-08-22 17:14:11 +0300
committerrobot-piglet <[email protected]>2025-08-22 17:36:11 +0300
commita2caee2426b884f5f71512d59f69a284759397cd (patch)
treef55ef0d14e7fe485542b21f862d20e0e71e33e1c
parent5c41dc204afed4149a10517c7f1ac7a234ceed8c (diff)
Add external_data_channels_count create table feature (SQL part)
Can I use your `soroka` for push YQL part of a new feature for YDB, please? [There](https://github.com/ydb-platform/ydb/pull/21672) is the original PR approved by Fomichev an Puchin which can't be committed directly to YDB github. Type: feature Component: yql --- Co-authored-by: Tony-Romanov [[email protected]] Pull Request resolved: https://github.com/ytsaurus/ytsaurus/pull/1414 commit_hash:c98a7b656a050b09976f22f1470ba0ab5bbb52c2
-rw-r--r--yql/essentials/sql/v1/node.h3
-rw-r--r--yql/essentials/sql/v1/query.cpp3
-rw-r--r--yql/essentials/sql/v1/sql_translation.cpp9
-rw-r--r--yql/essentials/sql/v1/sql_ut_common.h21
4 files changed, 35 insertions, 1 deletions
diff --git a/yql/essentials/sql/v1/node.h b/yql/essentials/sql/v1/node.h
index 4399847da89..10c2afcabe5 100644
--- a/yql/essentials/sql/v1/node.h
+++ b/yql/essentials/sql/v1/node.h
@@ -1161,6 +1161,7 @@ namespace NSQLTranslationV1 {
TMaybe<TIdentifier> StoreType;
TNodePtr PartitionByHashFunction;
TMaybe<TIdentifier> StoreExternalBlobs;
+ TNodePtr ExternalDataChannelsCount;
TNodePtr DataSourcePath;
NYql::TResetableSetting<TNodePtr, void> Location;
@@ -1170,7 +1171,7 @@ namespace NSQLTranslationV1 {
return CompactionPolicy || AutoPartitioningBySize || PartitionSizeMb || AutoPartitioningByLoad
|| MinPartitions || MaxPartitions || UniformPartitions || PartitionAtKeys || KeyBloomFilter
|| ReadReplicasSettings || TtlSettings || Tiering || StoreType || PartitionByHashFunction
- || StoreExternalBlobs || DataSourcePath || Location || ExternalSourceParameters;
+ || StoreExternalBlobs || DataSourcePath || Location || ExternalSourceParameters || ExternalDataChannelsCount;
}
};
diff --git a/yql/essentials/sql/v1/query.cpp b/yql/essentials/sql/v1/query.cpp
index af78efc0ab8..5937ab680e0 100644
--- a/yql/essentials/sql/v1/query.cpp
+++ b/yql/essentials/sql/v1/query.cpp
@@ -281,6 +281,9 @@ static INode::TPtr CreateTableSettings(const TTableSettings& tableSettings, ETab
if (tableSettings.PartitionByHashFunction && parsingMode == ETableSettingsParsingMode::Create) {
settings = L(settings, Q(Y(Q("partitionByHashFunction"), tableSettings.PartitionByHashFunction)));
}
+ if (tableSettings.ExternalDataChannelsCount) {
+ settings = L(settings, Q(Y(Q("externalDataChannelsCount"), tableSettings.ExternalDataChannelsCount)));
+ }
return settings;
}
diff --git a/yql/essentials/sql/v1/sql_translation.cpp b/yql/essentials/sql/v1/sql_translation.cpp
index 4814f336eff..d6a420949c3 100644
--- a/yql/essentials/sql/v1/sql_translation.cpp
+++ b/yql/essentials/sql/v1/sql_translation.cpp
@@ -2394,6 +2394,15 @@ bool TSqlTranslation::StoreTableSettingsEntry(const TIdentifier& id, const TRule
Ctx_.Error() << to_upper(id.Name) << " value should be an identifier";
return false;
}
+ } else if (to_lower(id.Name) == "external_data_channels_count") {
+ if (reset) {
+ Ctx_.Error() << to_upper(id.Name) << " reset is not supported";
+ return false;
+ }
+ if (!StoreInt(*value, settings.ExternalDataChannelsCount, Ctx_)) {
+ Ctx_.Error() << to_upper(id.Name) << " value should be an integer";
+ return false;
+ }
} else {
Ctx_.Error() << "Unknown table setting: " << id.Name;
return false;
diff --git a/yql/essentials/sql/v1/sql_ut_common.h b/yql/essentials/sql/v1/sql_ut_common.h
index 8877f64735a..518331289f5 100644
--- a/yql/essentials/sql/v1/sql_ut_common.h
+++ b/yql/essentials/sql/v1/sql_ut_common.h
@@ -2812,6 +2812,27 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
UNIT_ASSERT_VALUES_EQUAL(1, elementStat["Write"]);
}
+ Y_UNIT_TEST(ExternalDataChannelsCountParseCorrect) {
+ NYql::TAstParseResult res = SqlToYql(
+ R"( USE plato;
+ CREATE TABLE tableName (Key Uint32, Value String, PRIMARY KEY (Key))
+ WITH ( EXTERNAL_DATA_CHANNELS_COUNT = 7 );)"
+ );
+ UNIT_ASSERT(res.Root);
+
+ TVerifyLineFunc verifyLine = [](const TString& word, const TString& line) {
+ if (word == "Write") {
+ UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("externalDataChannelsCount"));
+ UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("7"));
+ }
+ };
+
+ TWordCountHive elementStat = { {TString("Write"), 0} };
+ VerifyProgram(res, elementStat, verifyLine);
+
+ UNIT_ASSERT_VALUES_EQUAL(1, elementStat["Write"]);
+ }
+
Y_UNIT_TEST(DefaultValueColumn2) {
auto res = SqlToYql(R"( use plato;
$lambda = () -> {