diff options
author | Sema Checherinda <[email protected]> | 2022-05-23 23:23:45 +0300 |
---|---|---|
committer | Sema Checherinda <[email protected]> | 2022-05-23 23:23:45 +0300 |
commit | e8aa5160e09378c2bb8f8ed7c806a52336a34810 (patch) | |
tree | 022f0be57337ba8a36d2b341f45613c56b749755 | |
parent | 475a41e940b15e231717ffaebcb8e14a87910c90 (diff) |
KIKIMR-14282 YDBREQUESTS-1324 add index schema versions into program
ref:2ff67b6ceeef49cb31420be7d82ceddc93d39607
-rw-r--r-- | ydb/core/kqp/compile/kqp_compile.cpp | 7 | ||||
-rw-r--r-- | ydb/core/kqp/host/kqp_runner.cpp | 8 | ||||
-rw-r--r-- | ydb/core/kqp/kqp_compile_request.cpp | 5 | ||||
-rw-r--r-- | ydb/core/kqp/provider/yql_kikimr_exec.cpp | 6 | ||||
-rw-r--r-- | ydb/core/kqp/provider/yql_kikimr_opt_build.cpp | 6 | ||||
-rw-r--r-- | ydb/core/kqp/provider/yql_kikimr_provider.cpp | 48 | ||||
-rw-r--r-- | ydb/core/kqp/provider/yql_kikimr_provider_impl.h | 4 | ||||
-rw-r--r-- | ydb/core/kqp/ut/kqp_scheme_ut.cpp | 4 |
8 files changed, 71 insertions, 17 deletions
diff --git a/ydb/core/kqp/compile/kqp_compile.cpp b/ydb/core/kqp/compile/kqp_compile.cpp index bf95244d090..68d52ea665a 100644 --- a/ydb/core/kqp/compile/kqp_compile.cpp +++ b/ydb/core/kqp/compile/kqp_compile.cpp @@ -423,12 +423,13 @@ public: auto ops = TableOperationsToProto(tableOps, ctx); for (auto& op : ops) { - const auto& tableName = op.GetTable(); + const auto tableName = op.GetTable(); + auto operation = (TYdbOperation)op.GetOperation(); - queryProto.AddTableOps()->Swap(&op); + *queryProto.AddTableOps() = std::move(op); const auto& desc = TablesData->GetTable(Cluster, tableName); - TableDescriptionToTableInfo(desc, queryProto.AddTableInfos()); + TableDescriptionToTableInfo(desc, operation, *queryProto.MutableTableInfos()); } for (const auto& tx : query.Transactions()) { diff --git a/ydb/core/kqp/host/kqp_runner.cpp b/ydb/core/kqp/host/kqp_runner.cpp index 52fef46c598..293eea0bd2e 100644 --- a/ydb/core/kqp/host/kqp_runner.cpp +++ b/ydb/core/kqp/host/kqp_runner.cpp @@ -475,11 +475,13 @@ private: auto operations = TableOperationsToProto(dataQuery.Operations(), ctx); for (auto& op : operations) { - const auto& tableName = op.GetTable(); + const auto tableName = op.GetTable(); + auto operation = (TYdbOperation)op.GetOperation(); + + *kql->AddOperations() = std::move(op); - kql->AddOperations()->CopyFrom(op); const auto& desc = TransformCtx->Tables->GetTable(cluster, tableName); - TableDescriptionToTableInfo(desc, kql->AddTableInfo()); + TableDescriptionToTableInfo(desc, operation, *kql->MutableTableInfo()); } TransformCtx->PreparingKql = kql; diff --git a/ydb/core/kqp/kqp_compile_request.cpp b/ydb/core/kqp/kqp_compile_request.cpp index 2c18af159bc..76e85a27e0f 100644 --- a/ydb/core/kqp/kqp_compile_request.cpp +++ b/ydb/core/kqp/kqp_compile_request.cpp @@ -186,6 +186,11 @@ private: entry.SyncVersion = false; entry.ShowPrivatePath = true; + LOG_DEBUG_S(ctx, NKikimrServices::KQP_COMPILE_REQUEST, "Query has dependency on table, check the table schema version" + << ", self: " << ctx.SelfID + << ", pathId: " << entry.TableId.PathId + << ", version: " << entry.TableId.SchemaVersion); + navigate->ResultSet.emplace_back(entry); } diff --git a/ydb/core/kqp/provider/yql_kikimr_exec.cpp b/ydb/core/kqp/provider/yql_kikimr_exec.cpp index b9cb673b287..5eeaa7f465a 100644 --- a/ydb/core/kqp/provider/yql_kikimr_exec.cpp +++ b/ydb/core/kqp/provider/yql_kikimr_exec.cpp @@ -1165,10 +1165,12 @@ private: for (const auto& op : tableOps) { auto table = op.GetTable(); + auto operation = (TYdbOperation)op.GetOperation(); const auto& desc = SessionCtx->Tables().GetTable(cluster, table); YQL_ENSURE(desc.Metadata); - tableInfo.push_back(NKqpProto::TKqpTableInfo()); - TableDescriptionToTableInfo(desc, &tableInfo.back()); + size_t size = tableInfo.size(); + TableDescriptionToTableInfo(desc, operation, tableInfo); + Y_VERIFY(size + 1 == tableInfo.size()); } if (!SessionCtx->HasTx()) { diff --git a/ydb/core/kqp/provider/yql_kikimr_opt_build.cpp b/ydb/core/kqp/provider/yql_kikimr_opt_build.cpp index 0ba0b349524..2c5e4bd311b 100644 --- a/ydb/core/kqp/provider/yql_kikimr_opt_build.cpp +++ b/ydb/core/kqp/provider/yql_kikimr_opt_build.cpp @@ -1,4 +1,5 @@ #include "yql_kikimr_provider_impl.h" +#include "yql_kikimr_gateway.h" #include <ydb/library/yql/core/yql_opt_utils.h> #include <ydb/library/yql/utils/log/log.h> @@ -130,6 +131,11 @@ bool ExploreTx(TExprBase node, TExprContext& ctx, const TKiDataSink& dataSink, T auto table = key.GetTablePath(); txRes.Ops.insert(node.Raw()); auto result = ExploreTx(maybeRead.Cast().World(), ctx, dataSink, txRes); + + if (const auto& view = key.GetView()) { + auto indexTable = IKikimrGateway::CreateIndexTablePath(table, view.GetRef()); + txRes.TableOperations.push_back(BuildTableOpNode(cluster, indexTable, TYdbOperation::Select, read.Pos(), ctx)); + } txRes.TableOperations.push_back(BuildTableOpNode(cluster, table, TYdbOperation::Select, read.Pos(), ctx)); return result; } diff --git a/ydb/core/kqp/provider/yql_kikimr_provider.cpp b/ydb/core/kqp/provider/yql_kikimr_provider.cpp index 635d1648279..eb492ccef0c 100644 --- a/ydb/core/kqp/provider/yql_kikimr_provider.cpp +++ b/ydb/core/kqp/provider/yql_kikimr_provider.cpp @@ -522,15 +522,51 @@ TVector<NKqpProto::TKqpTableOp> TableOperationsToProto(const TKiOperationList& o return protoOps; } -void TableDescriptionToTableInfo(const TKikimrTableDescription& desc, NKqpProto::TKqpTableInfo* info) { +template<class OutputIterator> +void TableDescriptionToTableInfoImpl(const TKikimrTableDescription& desc, TYdbOperation op, OutputIterator back_inserter) +{ YQL_ENSURE(desc.Metadata); - info->SetTableName(desc.Metadata->Name); - info->MutableTableId()->SetOwnerId(desc.Metadata->PathId.OwnerId()); - info->MutableTableId()->SetTableId(desc.Metadata->PathId.TableId()); - info->SetSchemaVersion(desc.Metadata->SchemaVersion); + + auto info = NKqpProto::TKqpTableInfo(); + info.SetTableName(desc.Metadata->Name); + info.MutableTableId()->SetOwnerId(desc.Metadata->PathId.OwnerId()); + info.MutableTableId()->SetTableId(desc.Metadata->PathId.TableId()); + info.SetSchemaVersion(desc.Metadata->SchemaVersion); + if (desc.Metadata->Indexes) { - info->SetHasIndexTables(true); + info.SetHasIndexTables(true); } + + back_inserter = std::move(info); + ++back_inserter; + + if (KikimrModifyOps() & op) { + for (ui32 idxNo = 0; idxNo < desc.Metadata->Indexes.size(); ++idxNo) { + const auto& idxDesc = desc.Metadata->Indexes[idxNo]; + if (!idxDesc.ItUsedForWrite()) { + continue; + } + + const auto& idxTableDesc = desc.Metadata->SecondaryGlobalIndexMetadata[idxNo]; + + auto info = NKqpProto::TKqpTableInfo(); + info.SetTableName(idxTableDesc->Name); + info.MutableTableId()->SetOwnerId(idxTableDesc->PathId.OwnerId()); + info.MutableTableId()->SetTableId(idxTableDesc->PathId.TableId()); + info.SetSchemaVersion(idxTableDesc->SchemaVersion); + + back_inserter = std::move(info); + ++back_inserter; + } + } +} + +void TableDescriptionToTableInfo(const TKikimrTableDescription& desc, TYdbOperation op, NProtoBuf::RepeatedPtrField<NKqpProto::TKqpTableInfo>& infos) { + TableDescriptionToTableInfoImpl(desc, op, google::protobuf::internal::RepeatedPtrFieldBackInsertIterator<NKqpProto::TKqpTableInfo>(&infos)); +} + +void TableDescriptionToTableInfo(const TKikimrTableDescription& desc, TYdbOperation op, TVector<NKqpProto::TKqpTableInfo>& infos) { + TableDescriptionToTableInfoImpl(desc, op, std::back_inserter(infos)); } bool TKikimrTransactionContextBase::ApplyTableOperations(const TVector<NKqpProto::TKqpTableOp>& operations, diff --git a/ydb/core/kqp/provider/yql_kikimr_provider_impl.h b/ydb/core/kqp/provider/yql_kikimr_provider_impl.h index e1aa3cda2b4..2149d95309f 100644 --- a/ydb/core/kqp/provider/yql_kikimr_provider_impl.h +++ b/ydb/core/kqp/provider/yql_kikimr_provider_impl.h @@ -235,7 +235,9 @@ TMaybe<TString> GetIsolationLevel(const NKikimrKqp::EIsolationLevel& isolationLe TYdbOperation GetTableOp(const NNodes::TKiWriteTable& write); TVector<NKqpProto::TKqpTableOp> TableOperationsToProto(const NNodes::TCoNameValueTupleList& operations, TExprContext& ctx); TVector<NKqpProto::TKqpTableOp> TableOperationsToProto(const NNodes::TKiOperationList& operations, TExprContext& ctx); -void TableDescriptionToTableInfo(const TKikimrTableDescription& desc, NKqpProto::TKqpTableInfo* info); + +void TableDescriptionToTableInfo(const TKikimrTableDescription& desc, TYdbOperation op, NProtoBuf::RepeatedPtrField<NKqpProto::TKqpTableInfo>& infos); +void TableDescriptionToTableInfo(const TKikimrTableDescription& desc, TYdbOperation op, TVector<NKqpProto::TKqpTableInfo>& infos); NNodes::TExprBase DeduplicateByMembers(const NNodes::TExprBase& expr, const TSet<TString>& members, TExprContext& ctx, TPositionHandle pos); diff --git a/ydb/core/kqp/ut/kqp_scheme_ut.cpp b/ydb/core/kqp/ut/kqp_scheme_ut.cpp index 5ae1124c3fb..13c3ad4ccde 100644 --- a/ydb/core/kqp/ut/kqp_scheme_ut.cpp +++ b/ydb/core/kqp/ut/kqp_scheme_ut.cpp @@ -379,11 +379,11 @@ Y_UNIT_TEST_SUITE(KqpScheme) { { auto result = session.ExecuteDataQuery(query, TTxControl::BeginTx(), execSettings).ExtractValueSync(); - UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), write ? EStatus::SUCCESS : EStatus::ABORTED, result.GetIssues().ToString()); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), write ? EStatus::SUCCESS : EStatus::SUCCESS, result.GetIssues().ToString()); if (write) { auto commit = result.GetTransaction()->Commit().GetValueSync(); - UNIT_ASSERT_VALUES_EQUAL_C(commit.GetStatus(), UseNewEngine ? EStatus::SUCCESS : EStatus::ABORTED, commit.GetIssues().ToString()); + UNIT_ASSERT_VALUES_EQUAL_C(commit.GetStatus(), UseNewEngine ? EStatus::SUCCESS : EStatus::SUCCESS, commit.GetIssues().ToString()); } } |