aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsn0wyq <sn0wyq@yandex-team.com>2023-11-03 19:31:26 +0300
committersn0wyq <sn0wyq@yandex-team.com>2023-11-03 19:47:59 +0300
commiteb1c2092ab9fcbd6176948b033dd2169f7f7eef0 (patch)
tree663d34778be117752b18667500f54f31a55bcb54
parent0b4d17fbe9cbbf725384822e981e2de570a6a280 (diff)
downloadydb-eb1c2092ab9fcbd6176948b033dd2169f7f7eef0.tar.gz
Allowed CREATE TABLE with STORE_EXTERNAL_BLOBS
allowed CREATE TABLE with STORE_EXTERNAL_BLOBS
-rw-r--r--ydb/core/kqp/host/kqp_gateway_proxy.cpp16
-rw-r--r--ydb/core/kqp/provider/yql_kikimr_gateway.cpp3
-rw-r--r--ydb/core/kqp/provider/yql_kikimr_gateway.h1
-rw-r--r--ydb/core/kqp/provider/yql_kikimr_type_ann.cpp2
-rw-r--r--ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp24
-rw-r--r--ydb/core/ydb_convert/table_settings.cpp8
-rw-r--r--ydb/library/yql/sql/v1/node.h3
-rw-r--r--ydb/library/yql/sql/v1/query.cpp8
-rw-r--r--ydb/library/yql/sql/v1/sql_translation.cpp9
-rw-r--r--ydb/library/yql/sql/v1/sql_ut.cpp21
10 files changed, 93 insertions, 2 deletions
diff --git a/ydb/core/kqp/host/kqp_gateway_proxy.cpp b/ydb/core/kqp/host/kqp_gateway_proxy.cpp
index d4bc8f24b44..f6d943c158d 100644
--- a/ydb/core/kqp/host/kqp_gateway_proxy.cpp
+++ b/ydb/core/kqp/host/kqp_gateway_proxy.cpp
@@ -257,6 +257,22 @@ bool ConvertCreateTableSettingsToProto(NYql::TKikimrTableMetadataPtr metadata, Y
}
}
+ if (metadata->TableSettings.StoreExternalBlobs) {
+ auto& storageSettings = *proto.mutable_storage_settings();
+ TString value = to_lower(metadata->TableSettings.StoreExternalBlobs.GetRef());
+ if (value == "enabled") {
+ storageSettings.set_store_external_blobs(Ydb::FeatureFlag::ENABLED);
+ } else if (value == "disabled") {
+ storageSettings.set_store_external_blobs(Ydb::FeatureFlag::DISABLED);
+ } else {
+ code = Ydb::StatusIds::BAD_REQUEST;
+ error = TStringBuilder() << "Unknown feature flag '"
+ << metadata->TableSettings.StoreExternalBlobs.GetRef()
+ << "' for store external blobs";
+ return false;
+ }
+ }
+
proto.set_temporary(metadata->Temporary);
return true;
diff --git a/ydb/core/kqp/provider/yql_kikimr_gateway.cpp b/ydb/core/kqp/provider/yql_kikimr_gateway.cpp
index 537cd2cf244..c21fba083dd 100644
--- a/ydb/core/kqp/provider/yql_kikimr_gateway.cpp
+++ b/ydb/core/kqp/provider/yql_kikimr_gateway.cpp
@@ -188,7 +188,8 @@ bool TTtlSettings::TryParse(const NNodes::TCoNameValueTupleList& node, TTtlSetti
bool TTableSettings::IsSet() const {
return CompactionPolicy || PartitionBy || AutoPartitioningBySize || UniformPartitions || PartitionAtKeys
|| PartitionSizeMb || AutoPartitioningByLoad || MinPartitions || MaxPartitions || KeyBloomFilter
- || ReadReplicasSettings || TtlSettings || DataSourcePath || Location || ExternalSourceParameters;
+ || ReadReplicasSettings || TtlSettings || DataSourcePath || Location || ExternalSourceParameters
+ || StoreExternalBlobs;
}
EYqlIssueCode YqlStatusFromYdbStatus(ui32 ydbStatus) {
diff --git a/ydb/core/kqp/provider/yql_kikimr_gateway.h b/ydb/core/kqp/provider/yql_kikimr_gateway.h
index 42965f05900..f9fadd38154 100644
--- a/ydb/core/kqp/provider/yql_kikimr_gateway.h
+++ b/ydb/core/kqp/provider/yql_kikimr_gateway.h
@@ -193,6 +193,7 @@ struct TTableSettings {
TResetableSetting<TTtlSettings, void> TtlSettings;
TResetableSetting<TString, void> Tiering;
TMaybe<TString> PartitionByHashFunction;
+ TMaybe<TString> StoreExternalBlobs;
// These parameters are only used for external sources
TMaybe<TString> DataSourcePath;
diff --git a/ydb/core/kqp/provider/yql_kikimr_type_ann.cpp b/ydb/core/kqp/provider/yql_kikimr_type_ann.cpp
index d87557a0b01..6ebb2f9b2b3 100644
--- a/ydb/core/kqp/provider/yql_kikimr_type_ann.cpp
+++ b/ydb/core/kqp/provider/yql_kikimr_type_ann.cpp
@@ -1117,6 +1117,8 @@ virtual TStatus HandleCreateTable(TKiCreateTable create, TExprContext& ctx) over
meta->TableSettings.PartitionByHashFunction = TString(
setting.Value().Cast<TCoDataCtor>().Literal().Cast<TCoAtom>().Value()
);
+ } else if (name == "storeExternalBlobs") {
+ meta->TableSettings.StoreExternalBlobs = TString(setting.Value().Cast<TCoAtom>().Value());
} else {
ctx.AddError(TIssue(ctx.GetPosition(setting.Name().Pos()),
TStringBuilder() << "Unknown table profile setting: " << name));
diff --git a/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp b/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp
index f88d569ece8..d796483a6f3 100644
--- a/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp
+++ b/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp
@@ -1973,6 +1973,30 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
}
}
+ Y_UNIT_TEST(CreateTableWithStoreExternalBlobs) {
+ TKikimrRunner kikimr;
+ kikimr.GetTestServer().GetRuntime()->GetAppData(0).FeatureFlags.SetEnablePublicApiExternalBlobs(true);
+ auto db = kikimr.GetTableClient();
+ auto session = db.CreateSession().GetValueSync().GetSession();
+ TString tableName = "/Root/TableWithStoreExternalBlobs";
+ auto query = TStringBuilder() << R"(
+ --!syntax_v1
+ CREATE TABLE `)" << tableName << R"(` (
+ Key Uint64,
+ Value String,
+ PRIMARY KEY (Key)
+ )
+ WITH (
+ STORE_EXTERNAL_BLOBS = ENABLED
+ );)";
+ auto result = session.ExecuteSchemeQuery(query).GetValueSync();
+ UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString());
+
+ auto describeResult = session.DescribeTable(tableName).GetValueSync();
+ UNIT_ASSERT_C(describeResult.IsSuccess(), result.GetIssues().ToString());
+ UNIT_ASSERT(describeResult.GetTableDescription().GetStorageSettings().GetStoreExternalBlobs().GetOrElse(false));
+ }
+
Y_UNIT_TEST(CreateAndAlterTableComplex) {
TKikimrRunner kikimr;
auto db = kikimr.GetTableClient();
diff --git a/ydb/core/ydb_convert/table_settings.cpp b/ydb/core/ydb_convert/table_settings.cpp
index d95f5a1ea82..b209e834e8e 100644
--- a/ydb/core/ydb_convert/table_settings.cpp
+++ b/ydb/core/ydb_convert/table_settings.cpp
@@ -1,5 +1,6 @@
#include "table_description.h"
#include "table_settings.h"
+#include "column_families.h"
#include <util/generic/list.h>
#include <util/string/builder.h>
@@ -200,6 +201,13 @@ bool FillCreateTableSettingsDesc(NKikimrSchemeOp::TTableDescription& tableDesc,
tableDesc.MutableTTLSettings()->SetUseTiering(proto.tiering());
}
+ if (proto.has_storage_settings()) {
+ TColumnFamilyManager families(tableDesc.MutablePartitionConfig());
+ if (!families.ApplyStorageSettings(proto.storage_settings(), &code, &error)) {
+ return false;
+ }
+ }
+
tableDesc.SetTemporary(proto.Gettemporary());
return true;
diff --git a/ydb/library/yql/sql/v1/node.h b/ydb/library/yql/sql/v1/node.h
index b9a93aaed1a..1b92496274e 100644
--- a/ydb/library/yql/sql/v1/node.h
+++ b/ydb/library/yql/sql/v1/node.h
@@ -967,6 +967,7 @@ namespace NSQLTranslationV1 {
NYql::TResetableSetting<TNodePtr, void> Tiering;
TMaybe<TIdentifier> StoreType;
TNodePtr PartitionByHashFunction;
+ TMaybe<TIdentifier> StoreExternalBlobs;
TNodePtr DataSourcePath;
TNodePtr Location;
@@ -976,7 +977,7 @@ namespace NSQLTranslationV1 {
return CompactionPolicy || AutoPartitioningBySize || PartitionSizeMb || AutoPartitioningByLoad
|| MinPartitions || MaxPartitions || UniformPartitions || PartitionAtKeys || KeyBloomFilter
|| ReadReplicasSettings || TtlSettings || Tiering || StoreType || PartitionByHashFunction
- || DataSourcePath || Location || ExternalSourceParameters;
+ || StoreExternalBlobs || DataSourcePath || Location || ExternalSourceParameters;
}
};
diff --git a/ydb/library/yql/sql/v1/query.cpp b/ydb/library/yql/sql/v1/query.cpp
index 25cfc19be8f..82312886973 100644
--- a/ydb/library/yql/sql/v1/query.cpp
+++ b/ydb/library/yql/sql/v1/query.cpp
@@ -1003,6 +1003,10 @@ public:
YQL_ENSURE(false, "Can't reset TIERING");
}
}
+ if (Params.TableSettings.StoreExternalBlobs) {
+ const auto& ref = Params.TableSettings.StoreExternalBlobs.GetRef();
+ settings = L(settings, Q(Y(Q("storeExternalBlobs"), BuildQuotedAtom(ref.Pos, ref.Name))));
+ }
if (Params.TableSettings.StoreType) {
const auto& ref = Params.TableSettings.StoreType.GetRef();
settings = L(settings, Q(Y(Q("storeType"), BuildQuotedAtom(ref.Pos, ref.Name))));
@@ -1197,6 +1201,10 @@ public:
settings = L(settings, Q(Y(Q("resetTiering"), Q(Y()))));
}
}
+ if (Params.TableSettings.StoreExternalBlobs) {
+ const auto& ref = Params.TableSettings.StoreExternalBlobs.GetRef();
+ settings = L(settings, Q(Y(Q("storeExternalBlobs"), BuildQuotedAtom(ref.Pos, ref.Name))));
+ }
actions = L(actions, Q(Y(Q("setTableSettings"), Q(settings))));
}
diff --git a/ydb/library/yql/sql/v1/sql_translation.cpp b/ydb/library/yql/sql/v1/sql_translation.cpp
index 33f2de132f2..75e19570846 100644
--- a/ydb/library/yql/sql/v1/sql_translation.cpp
+++ b/ydb/library/yql/sql/v1/sql_translation.cpp
@@ -1873,6 +1873,15 @@ bool TSqlTranslation::StoreTableSettingsEntry(const TIdentifier& id, const TRule
Ctx.Error() << to_upper(id.Name) << " value should be a string literal";
return false;
}
+ } else if (to_lower(id.Name) == "store_external_blobs") {
+ if (reset) {
+ Ctx.Error() << to_upper(id.Name) << " reset is not supported";
+ return false;
+ }
+ if (!StoreId(*value, settings.StoreExternalBlobs, *this)) {
+ Ctx.Error() << to_upper(id.Name) << " value should be an identifier";
+ return false;
+ }
} else {
Ctx.Error() << "Unknown table setting: " << id.Name;
return false;
diff --git a/ydb/library/yql/sql/v1/sql_ut.cpp b/ydb/library/yql/sql/v1/sql_ut.cpp
index 1b807cd41e2..a898fee6e0b 100644
--- a/ydb/library/yql/sql/v1/sql_ut.cpp
+++ b/ydb/library/yql/sql/v1/sql_ut.cpp
@@ -1870,6 +1870,27 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
UNIT_ASSERT_VALUES_EQUAL(1, elementStat["Write"]);
}
+ Y_UNIT_TEST(StoreExternalBlobsParseCorrect) {
+ NYql::TAstParseResult res = SqlToYql(
+ R"( USE plato;
+ CREATE TABLE tableName (Key Uint32, Value String, PRIMARY KEY (Key))
+ WITH ( STORE_EXTERNAL_BLOBS = ENABLED );)"
+ );
+ UNIT_ASSERT(res.Root);
+
+ TVerifyLineFunc verifyLine = [](const TString& word, const TString& line) {
+ if (word == "Write") {
+ UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("storeExternalBlobs"));
+ UNIT_ASSERT_VALUES_UNEQUAL(TString::npos, line.find("ENABLED"));
+ }
+ };
+
+ 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 = () -> {