Skip to content

Commit b28ba5e

Browse files
authored
Merge 4b302ef into a26ebd7
2 parents a26ebd7 + 4b302ef commit b28ba5e

29 files changed

+308
-39
lines changed

ydb/core/kqp/common/kqp_resolve.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ struct TTableConstInfo : public TAtomicRefCount<TTableConstInfo> {
3333
ETableKind TableKind = ETableKind::Unknown;
3434
THashMap<TString, TString> Sequences;
3535
THashMap<TString, Ydb::TypedValue> DefaultFromLiteral;
36+
bool IsBuildInProgress = false;
3637

3738
TTableConstInfo() {}
3839
TTableConstInfo(const TString& path) : Path(path) {}
@@ -52,6 +53,7 @@ struct TTableConstInfo : public TAtomicRefCount<TTableConstInfo> {
5253
NPg::TypeDescFromPgTypeName(phyColumn.GetPgTypeName()));
5354
}
5455
column.NotNull = phyColumn.GetNotNull();
56+
column.IsBuildInProgress = phyColumn.GetIsBuildInProgress();
5557

5658
Columns.emplace(phyColumn.GetId().GetName(), std::move(column));
5759
if (!phyColumn.GetDefaultFromSequence().empty()) {
@@ -144,19 +146,19 @@ class TKqpTableKeys {
144146
const TMap<TString, NSharding::TShardingBase::TColumn>& GetColumns() const {
145147
return TableConstInfo->Columns;
146148
}
147-
149+
148150
const TVector<TString>& GetKeyColumns() const {
149151
return TableConstInfo->KeyColumns;
150152
}
151-
153+
152154
const TVector<NScheme::TTypeInfo>& GetKeyColumnTypes() const {
153155
return TableConstInfo->KeyColumnTypes;
154156
}
155-
157+
156158
const ETableKind& GetTableKind() const {
157159
return TableConstInfo->TableKind;
158160
}
159-
161+
160162
const THashMap<TString, TString>& GetSequences() const {
161163
return TableConstInfo->Sequences;
162164
}

ydb/core/kqp/gateway/kqp_metadata_loader.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,8 @@ TTableMetadataResult GetTableMetadataResult(const NSchemeCache::TSchemeCacheNavi
192192
columnDesc.Name, columnDesc.Id, typeName, notNull, columnDesc.PType, columnDesc.PTypeMod,
193193
columnDesc.DefaultFromSequence,
194194
defaultKind,
195-
columnDesc.DefaultFromLiteral
195+
columnDesc.DefaultFromLiteral,
196+
columnDesc.IsBuildInProgress
196197
)
197198
);
198199
if (columnDesc.KeyOrder >= 0) {

ydb/core/kqp/opt/kqp_opt_kql.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ TExprBase BuildRowsToDelete(const TKikimrTableDescription& tableData, bool withS
447447
const TPositionHandle pos, TExprContext& ctx, const TIntrusivePtr<TKqpOptimizeContext>& kqpCtx)
448448
{
449449
const auto tableMeta = BuildTableMeta(tableData, pos, ctx);
450-
const auto tableColumns = BuildColumnsList(tableData, pos, ctx, withSystemColumns);
450+
const auto tableColumns = BuildColumnsList(tableData, pos, ctx, withSystemColumns, true /*ignoreWriteOnlyColumns*/);
451451

452452
const auto allRows = BuildReadTable(tableColumns, pos, tableData, false, ctx, kqpCtx);
453453

@@ -522,7 +522,7 @@ TExprBase BuildDeleteTableWithIndex(const TKiDeleteTable& del, const TKikimrTabl
522522
TExprBase BuildRowsToUpdate(const TKikimrTableDescription& tableData, bool withSystemColumns, const TCoLambda& filter,
523523
const TPositionHandle pos, TExprContext& ctx, const TIntrusivePtr<TKqpOptimizeContext>& kqpCtx)
524524
{
525-
auto kqlReadTable = BuildReadTable(BuildColumnsList(tableData, pos, ctx, withSystemColumns), pos, tableData, false, ctx, kqpCtx);
525+
auto kqlReadTable = BuildReadTable(BuildColumnsList(tableData, pos, ctx, withSystemColumns, true /*ignoreWriteOnlyColumns*/), pos, tableData, false, ctx, kqpCtx);
526526

527527
return Build<TCoFilter>(ctx, pos)
528528
.Input(kqlReadTable)

ydb/core/kqp/provider/yql_kikimr_datasink.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -671,7 +671,7 @@ class TKikimrDataSink : public TDataProviderBase
671671
TString(dataSink.Cluster()),
672672
key.GetTablePath(), node->Pos(), ctx);
673673

674-
returningColumns = BuildColumnsList(*table, node->Pos(), ctx, sysColumnsEnabled);
674+
returningColumns = BuildColumnsList(*table, node->Pos(), ctx, sysColumnsEnabled, true /*ignoreWriteOnlyColumns*/);
675675

676676
break;
677677
} else {

ydb/core/kqp/provider/yql_kikimr_expr_nodes.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ TCoAtomList TKiReadTable::GetSelectColumns(TExprContext& ctx, const TKikimrTable
1717
bool withSystemColumns) const
1818
{
1919
if (Select().Maybe<TCoVoid>()) {
20-
return BuildColumnsList(tableData, Pos(), ctx, withSystemColumns);
20+
return BuildColumnsList(tableData, Pos(), ctx, withSystemColumns, true /*ignoreWriteOnlyColumns*/);
2121
}
2222

2323
return Select().Cast<TCoAtomList>();

ydb/core/kqp/provider/yql_kikimr_gateway.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,13 +215,14 @@ struct TKikimrColumnMetadata {
215215
NKikimrKqp::TKqpColumnMetadataProto::EDefaultKind DefaultKind = NKikimrKqp::TKqpColumnMetadataProto::DEFAULT_KIND_UNSPECIFIED;
216216
TString DefaultFromSequence;
217217
Ydb::TypedValue DefaultFromLiteral;
218+
bool IsBuildInProgress = false;
218219

219220
TKikimrColumnMetadata() = default;
220221

221222
TKikimrColumnMetadata(const TString& name, ui32 id, const TString& type, bool notNull,
222223
NKikimr::NScheme::TTypeInfo typeInfo = {}, const TString& typeMod = {}, const TString& defaultFromSequence = {},
223224
NKikimrKqp::TKqpColumnMetadataProto::EDefaultKind defaultKind = NKikimrKqp::TKqpColumnMetadataProto::DEFAULT_KIND_UNSPECIFIED,
224-
const Ydb::TypedValue& defaultFromLiteral = {})
225+
const Ydb::TypedValue& defaultFromLiteral = {}, bool isBuildInProgress = false)
225226
: Name(name)
226227
, Id(id)
227228
, Type(type)
@@ -231,6 +232,7 @@ struct TKikimrColumnMetadata {
231232
, DefaultKind(defaultKind)
232233
, DefaultFromSequence(defaultFromSequence)
233234
, DefaultFromLiteral(defaultFromLiteral)
235+
, IsBuildInProgress(isBuildInProgress)
234236
{}
235237

236238
explicit TKikimrColumnMetadata(const NKikimrKqp::TKqpColumnMetadataProto* message)
@@ -242,6 +244,7 @@ struct TKikimrColumnMetadata {
242244
, DefaultKind(message->GetDefaultKind())
243245
, DefaultFromSequence(message->GetDefaultFromSequence())
244246
, DefaultFromLiteral(message->GetDefaultFromLiteral())
247+
, IsBuildInProgress(message->GetIsBuildInProgress())
245248
{
246249
auto typeInfoMod = NKikimr::NScheme::TypeInfoModFromProtoColumnType(message->GetTypeId(),
247250
message->HasTypeInfo() ? &message->GetTypeInfo() : nullptr);
@@ -279,6 +282,7 @@ struct TKikimrColumnMetadata {
279282
message->SetDefaultFromSequence(DefaultFromSequence);
280283
message->SetDefaultKind(DefaultKind);
281284
message->MutableDefaultFromLiteral()->CopyFrom(DefaultFromLiteral);
285+
message->SetIsBuildInProgress(IsBuildInProgress);
282286
if (columnType.TypeInfo) {
283287
*message->MutableTypeInfo() = *columnType.TypeInfo;
284288
}

ydb/core/kqp/provider/yql_kikimr_provider.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,10 +463,14 @@ bool TKikimrKey::Extract(const TExprNode& key) {
463463
}
464464

465465
TCoAtomList BuildColumnsList(const TKikimrTableDescription& table, TPositionHandle pos,
466-
TExprContext& ctx, bool withSystemColumns)
466+
TExprContext& ctx, bool withSystemColumns, bool ignoreWriteOnlyColumns)
467467
{
468468
TVector<TExprBase> columnsToSelect;
469469
for (const auto& pair : table.Metadata->Columns) {
470+
if (pair.second.IsBuildInProgress && ignoreWriteOnlyColumns) {
471+
continue;
472+
}
473+
470474
auto atom = Build<TCoAtom>(ctx, pos)
471475
.Value(pair.second.Name)
472476
.Done();

ydb/core/kqp/provider/yql_kikimr_provider_impl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ TAutoPtr<IGraphTransformer> CreateKiSinkCallableExecutionTransformer(
209209
TAutoPtr<IGraphTransformer> CreateKiSinkPlanInfoTransformer(TIntrusivePtr<IKikimrQueryExecutor> queryExecutor);
210210

211211
NNodes::TCoAtomList BuildColumnsList(const TKikimrTableDescription& table, TPositionHandle pos,
212-
TExprContext& ctx, bool withSystemColumns);
212+
TExprContext& ctx, bool withSystemColumns, bool ignoreWriteOnlyColumns);
213213

214214
const TTypeAnnotationNode* GetReadTableRowType(TExprContext& ctx, const TKikimrTablesData& tablesData,
215215
const TString& cluster, const TString& table, NNodes::TCoAtomList select, bool withSystemColumns = false);

ydb/core/kqp/provider/yql_kikimr_type_ann.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,13 @@ class TKiSinkTypeAnnotationTransformer : public TKiSinkVisitorTransformer
418418
THashSet<TString> generateColumnsIfInsertColumnsSet;
419419

420420
for(const auto& [name, info] : table->Metadata->Columns) {
421+
if (info.IsBuildInProgress && rowType->FindItem(name)) {
422+
ctx.AddError(YqlIssue(pos, TIssuesIds::KIKIMR_BAD_REQUEST, TStringBuilder()
423+
<< "Column is under build operation, write operation is not allowed to column: " << name
424+
<< " for table: " << table->Metadata->Name));
425+
return TStatus::Error;
426+
}
427+
421428
if (rowType->FindItem(name)) {
422429
continue;
423430
}
@@ -431,7 +438,7 @@ class TKiSinkTypeAnnotationTransformer : public TKiSinkVisitorTransformer
431438
}
432439

433440
if (info.IsDefaultKindDefined()) {
434-
if (op == TYdbOperation::Upsert) {
441+
if (op == TYdbOperation::Upsert && !info.IsBuildInProgress) {
435442
generateColumnsIfInsertColumnsSet.emplace(name);
436443
}
437444

@@ -625,6 +632,13 @@ class TKiSinkTypeAnnotationTransformer : public TKiSinkVisitorTransformer
625632
<< "Column '" << item->GetName() << "' does not exist in table '" << node.Table().Value() << "'."));
626633
return TStatus::Error;
627634
}
635+
636+
if (column->IsBuildInProgress) {
637+
ctx.AddError(YqlIssue(ctx.GetPosition(node.Pos()), TIssuesIds::KIKIMR_BAD_REQUEST, TStringBuilder()
638+
<< "Column '" << item->GetName() << "' is under the build operation '" << node.Table().Value() << "'."));
639+
return TStatus::Error;
640+
}
641+
628642
if (column->NotNull && item->HasOptionalOrNull()) {
629643
if (item->GetItemType()->GetKind() == ETypeAnnotationKind::Pg) {
630644
//no type-level notnull check for pg types.
@@ -636,6 +650,8 @@ class TKiSinkTypeAnnotationTransformer : public TKiSinkVisitorTransformer
636650
}
637651
}
638652

653+
654+
639655
if (!node.ReturningColumns().Empty()) {
640656
ctx.AddError(TIssue(ctx.GetPosition(node.Pos()), TStringBuilder()
641657
<< "It is not allowed to use returning"));

ydb/core/kqp/query_compiler/kqp_query_compiler.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ void FillTable(const TKikimrTableMetadata& tableMeta, THashSet<TStringBuf>&& col
174174
phyColumn.MutableId()->SetId(column->Id);
175175
phyColumn.MutableId()->SetName(column->Name);
176176
phyColumn.SetTypeId(column->TypeInfo.GetTypeId());
177+
phyColumn.SetIsBuildInProgress(column->IsBuildInProgress);
177178
if (column->IsDefaultFromSequence()) {
178179
phyColumn.SetDefaultFromSequence(column->DefaultFromSequence);
179180
} else if (column->IsDefaultFromLiteral()) {

0 commit comments

Comments
 (0)