diff options
author | sn0wyq <sn0wyq@yandex-team.com> | 2023-11-03 19:31:26 +0300 |
---|---|---|
committer | sn0wyq <sn0wyq@yandex-team.com> | 2023-11-03 19:47:59 +0300 |
commit | eb1c2092ab9fcbd6176948b033dd2169f7f7eef0 (patch) | |
tree | 663d34778be117752b18667500f54f31a55bcb54 | |
parent | 0b4d17fbe9cbbf725384822e981e2de570a6a280 (diff) | |
download | ydb-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.cpp | 16 | ||||
-rw-r--r-- | ydb/core/kqp/provider/yql_kikimr_gateway.cpp | 3 | ||||
-rw-r--r-- | ydb/core/kqp/provider/yql_kikimr_gateway.h | 1 | ||||
-rw-r--r-- | ydb/core/kqp/provider/yql_kikimr_type_ann.cpp | 2 | ||||
-rw-r--r-- | ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp | 24 | ||||
-rw-r--r-- | ydb/core/ydb_convert/table_settings.cpp | 8 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/node.h | 3 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/query.cpp | 8 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/sql_translation.cpp | 9 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/sql_ut.cpp | 21 |
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 = () -> { |