diff options
author | ulya-sidorina <yulia@ydb.tech> | 2022-08-04 11:03:59 +0300 |
---|---|---|
committer | ulya-sidorina <yulia@ydb.tech> | 2022-08-04 11:03:59 +0300 |
commit | 12845e3c5d1e4c5c6aeb6d0cafdd7fd161533f11 (patch) | |
tree | b65d5fe54c5c54331ef31e188e8ac67251da60ed | |
parent | 6579c2d2aacacba6603a33ddb7731db63d27fdce (diff) | |
download | ydb-12845e3c5d1e4c5c6aeb6d0cafdd7fd161533f11.tar.gz |
fix not null pk for old engine
-rw-r--r-- | ydb/core/client/minikql_compile/db_key_resolver.h | 1 | ||||
-rw-r--r-- | ydb/core/client/minikql_compile/yql_expr_minikql.cpp | 13 | ||||
-rw-r--r-- | ydb/core/client/minikql_compile/yql_expr_minikql_compile_ut.cpp | 8 | ||||
-rw-r--r-- | ydb/core/client/scheme_cache_lib/yql_db_scheme_resolver.cpp | 5 | ||||
-rw-r--r-- | ydb/core/client/server/msgbus_server_db.cpp | 16 | ||||
-rw-r--r-- | ydb/core/engine/kikimr_program_builder.cpp | 10 | ||||
-rw-r--r-- | ydb/core/engine/kikimr_program_builder.h | 5 | ||||
-rw-r--r-- | ydb/core/engine/kikimr_program_builder_ut.cpp | 28 | ||||
-rw-r--r-- | ydb/core/engine/minikql/flat_local_tx_minikql.h | 3 | ||||
-rw-r--r-- | ydb/core/engine/mkql_engine_flat_ut.cpp | 218 | ||||
-rw-r--r-- | ydb/core/engine/mkql_keys.cpp | 2 | ||||
-rw-r--r-- | ydb/core/kqp/ut/kqp_not_null_columns_ut.cpp | 60 | ||||
-rw-r--r-- | ydb/core/scheme/scheme_tabledefs.h | 5 | ||||
-rw-r--r-- | ydb/core/tx/datashard/datashard_ut_common.cpp | 2 | ||||
-rw-r--r-- | ydb/core/tx/schemeshard/ut_helpers/helpers.cpp | 3 |
15 files changed, 266 insertions, 113 deletions
diff --git a/ydb/core/client/minikql_compile/db_key_resolver.h b/ydb/core/client/minikql_compile/db_key_resolver.h index e748525fa81..4d93c1a4c25 100644 --- a/ydb/core/client/minikql_compile/db_key_resolver.h +++ b/ydb/core/client/minikql_compile/db_key_resolver.h @@ -44,6 +44,7 @@ public: i32 KeyPosition; ui32 Type; ui32 AllowInplaceMode; + NKikimr::EColumnTypeConstraint TypeConstraint; }; EStatus Status; diff --git a/ydb/core/client/minikql_compile/yql_expr_minikql.cpp b/ydb/core/client/minikql_compile/yql_expr_minikql.cpp index 76f38bf35cb..28a7a4dbff9 100644 --- a/ydb/core/client/minikql_compile/yql_expr_minikql.cpp +++ b/ydb/core/client/minikql_compile/yql_expr_minikql.cpp @@ -382,6 +382,7 @@ private: for (auto& tupleItem : selectTuple.Children()) { auto columnName = tupleItem->Content(); const TTypeAnnotationNode *columnDataType; + auto typeConstraint = EColumnTypeConstraint::Nullable; auto systemColumnType = KikimrSystemColumns().find(columnName); if (systemColumnType != KikimrSystemColumns().end()) { @@ -389,6 +390,7 @@ private: } else { auto column = lookup->Columns.FindPtr(columnName); YQL_ENSURE(column); + typeConstraint = column->TypeConstraint; // Decimal type is transformed into parametrized Decimal(22, 9). if (column->Type == NYql::NProto::TypeIds::Decimal) { @@ -402,9 +404,12 @@ private: ctx); } } - auto columnOptType = ctx.MakeType<TOptionalExprType>(columnDataType); - resultItems.push_back(ctx.MakeType<TItemExprType>(columnName, columnOptType)); + if (typeConstraint == EColumnTypeConstraint::Nullable) { + columnDataType = ctx.MakeType<TOptionalExprType>(columnDataType); + } + + resultItems.push_back(ctx.MakeType<TItemExprType>(columnName, columnDataType)); } auto selectType = ctx.MakeType<TStructExprType>(resultItems); @@ -834,11 +839,11 @@ void FillColumnsToRead(IDbSchemeResolver::TTableResult* lookup, TExprNode* selec auto columnName = selectTuple->Child(i)->Content(); const auto& systemColumn = GetSystemColumns().find(columnName); if (systemColumn != GetSystemColumns().end()) { - columnsToRead.emplace_back(columnName, systemColumn->second.ColumnId, systemColumn->second.TypeId); + columnsToRead.emplace_back(columnName, systemColumn->second.ColumnId, systemColumn->second.TypeId, EColumnTypeConstraint::Nullable); } else { auto column = lookup->Columns.FindPtr(columnName); YQL_ENSURE(column); - columnsToRead.emplace_back(columnName, column->Column, column->Type); + columnsToRead.emplace_back(columnName, column->Column, column->Type, column->TypeConstraint); } } } diff --git a/ydb/core/client/minikql_compile/yql_expr_minikql_compile_ut.cpp b/ydb/core/client/minikql_compile/yql_expr_minikql_compile_ut.cpp index 4fcdf735ba2..1a99dce069c 100644 --- a/ydb/core/client/minikql_compile/yql_expr_minikql_compile_ut.cpp +++ b/ydb/core/client/minikql_compile/yql_expr_minikql_compile_ut.cpp @@ -72,8 +72,8 @@ namespace { table.Table.ColumnNames = { "key", "value" }; table.TableId.Reset(new TTableId(1, 2)); table.KeyColumnCount = 1; - table.Columns.insert(std::make_pair("key", TColumn{ 34, 0, NUdf::TDataType<ui32>::Id, 0 })); - table.Columns.insert(std::make_pair("value", TColumn{ 56, -1, NUdf::TDataType<char*>::Id, (ui32)EInplaceUpdateMode::Min })); + table.Columns.insert(std::make_pair("key", TColumn{ 34, 0, NUdf::TDataType<ui32>::Id, 0, EColumnTypeConstraint::Nullable })); + table.Columns.insert(std::make_pair("value", TColumn{ 56, -1, NUdf::TDataType<char*>::Id, (ui32)EInplaceUpdateMode::Min, EColumnTypeConstraint::Nullable })); services.DbSchemeResolver.AddTable(table); IDbSchemeResolver::TTableResult table2(IDbSchemeResolver::TTableResult::Ok); @@ -81,8 +81,8 @@ namespace { table2.Table.ColumnNames = { "key", "value" }; table2.TableId.Reset(new TTableId(10, 20)); table2.KeyColumnCount = 1; - table2.Columns.insert(std::make_pair("key", TColumn{ 340, 0, NUdf::TDataType<ui32>::Id, 0 })); - table2.Columns.insert(std::make_pair("value", TColumn{ 560, -1, NUdf::TDataType<char*>::Id, (ui32)EInplaceUpdateMode::Min })); + table2.Columns.insert(std::make_pair("key", TColumn{ 340, 0, NUdf::TDataType<ui32>::Id, 0, EColumnTypeConstraint::Nullable })); + table2.Columns.insert(std::make_pair("value", TColumn{ 560, -1, NUdf::TDataType<char*>::Id, (ui32)EInplaceUpdateMode::Min, EColumnTypeConstraint::Nullable })); services.DbSchemeResolver.AddTable(table2); } } diff --git a/ydb/core/client/scheme_cache_lib/yql_db_scheme_resolver.cpp b/ydb/core/client/scheme_cache_lib/yql_db_scheme_resolver.cpp index eb74fa36e94..d019533c69e 100644 --- a/ydb/core/client/scheme_cache_lib/yql_db_scheme_resolver.cpp +++ b/ydb/core/client/scheme_cache_lib/yql_db_scheme_resolver.cpp @@ -67,7 +67,7 @@ class TTableProxyActor : public TActorBootstrapped<TTableProxyActor> { if (systemColumn != GetSystemColumns().end()) { reply.Columns.insert({ column, - {systemColumn->second.ColumnId, -1, systemColumn->second.TypeId, 0} + {systemColumn->second.ColumnId, -1, systemColumn->second.TypeId, 0, EColumnTypeConstraint::Nullable} }); continue; } @@ -77,8 +77,9 @@ class TTableProxyActor : public TActorBootstrapped<TTableProxyActor> { reply.Reason = "column '" + column + "' not exist"; } else { const auto &col = (*x)->second; + auto nullConstraint = res.NotNullColumns.contains(col.Name) ? EColumnTypeConstraint::NotNull : EColumnTypeConstraint::Nullable; reply.Columns.insert(std::make_pair(column, - IDbSchemeResolver::TTableResult::TColumn{col.Id, col.KeyOrder, col.PType, 0})); + IDbSchemeResolver::TTableResult::TColumn{col.Id, col.KeyOrder, col.PType, 0, nullConstraint})); } } } diff --git a/ydb/core/client/server/msgbus_server_db.cpp b/ydb/core/client/server/msgbus_server_db.cpp index b5a41e390b7..ff851a58975 100644 --- a/ydb/core/client/server/msgbus_server_db.cpp +++ b/ydb/core/client/server/msgbus_server_db.cpp @@ -381,7 +381,8 @@ public: } void BuildProgram(const NJson::TJsonValue& json, NMiniKQL::TRuntimeNode& pgmReturn, NMiniKQL::TKikimrProgramBuilder& pgmBuilder, const NSchemeCache::TSchemeCacheNavigate::TEntry& tableInfo, - const TVector<const NTxProxy::TTableColumnInfo*>& keys, const THashMap<TString, const NTxProxy::TTableColumnInfo*>& columnByName, TVector<NMiniKQL::TRuntimeNode>& result) { + const TVector<const NTxProxy::TTableColumnInfo*>& keys, const THashMap<TString, const NTxProxy::TTableColumnInfo*>& columnByName, THashSet<TString> notNullColumns, + TVector<NMiniKQL::TRuntimeNode>& result) { TVector<NMiniKQL::TRuntimeNode> keyColumns; TVector<ui32> keyTypes; keyTypes.reserve(keys.size()); @@ -427,10 +428,12 @@ public: const TString& column = value.GetString(); auto itCol = columnByName.find(column); if (itCol != columnByName.end()) { - columnsToRead.emplace_back(itCol->second->Name, itCol->second->Id, itCol->second->PType); + auto nullConstraint = notNullColumns.contains(column) ? EColumnTypeConstraint::NotNull : EColumnTypeConstraint::Nullable; + columnsToRead.emplace_back(itCol->second->Name, itCol->second->Id, itCol->second->PType, nullConstraint); } else if (column == "*") { for (const auto& pr : columnByName) { - columnsToRead.emplace_back(pr.second->Name, pr.second->Id, pr.second->PType); + auto nullConstraint = notNullColumns.contains(pr.first) ? EColumnTypeConstraint::NotNull : EColumnTypeConstraint::Nullable; + columnsToRead.emplace_back(pr.second->Name, pr.second->Id, pr.second->PType, nullConstraint); } } else { throw yexception() << "Column \"" << value.GetString() << "\" not found"; @@ -438,7 +441,8 @@ public: } } else if (jsonSelect.IsString() && jsonSelect.GetString() == "*") { for (const auto& pr : columnByName) { - columnsToRead.emplace_back(pr.second->Name, pr.second->Id, pr.second->PType); + auto nullConstraint = notNullColumns.contains(pr.first) ? EColumnTypeConstraint::NotNull : EColumnTypeConstraint::Nullable; + columnsToRead.emplace_back(pr.second->Name, pr.second->Id, pr.second->PType, nullConstraint); } } if (keyColumns.size() == keyTypes.size()) { @@ -482,7 +486,7 @@ public: if (json.GetValue("Batch", &jsonBatch)) { const NJson::TJsonValue::TArray& array = jsonBatch.GetArray(); for (const NJson::TJsonValue& value : array) { - BuildProgram(value, pgmReturn, pgmBuilder, tableInfo, keys, columnByName, result); + BuildProgram(value, pgmReturn, pgmBuilder, tableInfo, keys, columnByName, notNullColumns, result); } OperationHistogram = DbOperationsCounters->RequestBatchTimeHistogram; } @@ -511,7 +515,7 @@ public: columnByName[itCol->second.Name] = &itCol->second; } - BuildProgram(JSON, pgmReturn, pgmBuilder, tableInfo, keys, columnByName, result); + BuildProgram(JSON, pgmReturn, pgmBuilder, tableInfo, keys, columnByName, tableInfo.NotNullColumns, result); if (JSON.Has("Batch")) { pgmReturn = pgmBuilder.Append(pgmReturn, pgmBuilder.SetResult("Result", pgmBuilder.NewTuple(result))); } else { diff --git a/ydb/core/engine/kikimr_program_builder.cpp b/ydb/core/engine/kikimr_program_builder.cpp index fd32a772ee9..e4077e2e102 100644 --- a/ydb/core/engine/kikimr_program_builder.cpp +++ b/ydb/core/engine/kikimr_program_builder.cpp @@ -24,7 +24,7 @@ TType* ValidateColumns( tagsBuilder.Reserve(columns.size()); for (auto& col : columns) { MKQL_ENSURE(col.SchemeType != 0, "Null type is not allowed"); - TDataType *dataType; + TType* dataType; if (col.SchemeType == NYql::NProto::TypeIds::Decimal) dataType = TDataDecimalType::Create( NScheme::DECIMAL_PRECISION, @@ -32,8 +32,12 @@ TType* ValidateColumns( builder->GetTypeEnvironment()); else dataType = TDataType::Create(col.SchemeType, builder->GetTypeEnvironment()); - auto optType = TOptionalType::Create(dataType, builder->GetTypeEnvironment()); - rowTypeBuilder.Add(col.Label, optType); + + if (col.TypeConstraint == EColumnTypeConstraint::Nullable) { + dataType = TOptionalType::Create(dataType, builder->GetTypeEnvironment()); + } + + rowTypeBuilder.Add(col.Label, dataType); tagsBuilder.Add(col.Label, builder->NewDataLiteral<ui32>(col.ColumnId)); } diff --git a/ydb/core/engine/kikimr_program_builder.h b/ydb/core/engine/kikimr_program_builder.h index 717132c0b96..446d976dd3e 100644 --- a/ydb/core/engine/kikimr_program_builder.h +++ b/ydb/core/engine/kikimr_program_builder.h @@ -14,14 +14,15 @@ struct TSelectColumn { TStringBuf Label; ui32 ColumnId = 0; NUdf::TDataTypeId SchemeType = 0; - + EColumnTypeConstraint TypeConstraint = EColumnTypeConstraint::Nullable; TSelectColumn() {} - TSelectColumn(TStringBuf label, ui32 columnId, NUdf::TDataTypeId schemeType) + TSelectColumn(TStringBuf label, ui32 columnId, NUdf::TDataTypeId schemeType, EColumnTypeConstraint typeConstraint) : Label(label) , ColumnId(columnId) , SchemeType(schemeType) + , TypeConstraint(typeConstraint) {} }; diff --git a/ydb/core/engine/kikimr_program_builder_ut.cpp b/ydb/core/engine/kikimr_program_builder_ut.cpp index efa073ae2f8..168e58422d6 100644 --- a/ydb/core/engine/kikimr_program_builder_ut.cpp +++ b/ydb/core/engine/kikimr_program_builder_ut.cpp @@ -216,8 +216,8 @@ Y_UNIT_TEST_SUITE(TMiniKQLProgramBuilderTest) { keyColumns.push_back(pgmBuilder.NewOptional( pgmBuilder.NewDataLiteral<NUdf::EDataSlot::String>("qwe"))); TVector<TSelectColumn> columnsToRead; - columnsToRead.emplace_back("column1", 34, (ui32)NUdf::TDataType<ui32>::Id); - columnsToRead.emplace_back("column2", 56, (ui32)NUdf::TDataType<ui64>::Id); + columnsToRead.emplace_back("column1", 34, (ui32)NUdf::TDataType<ui32>::Id, EColumnTypeConstraint::Nullable); + columnsToRead.emplace_back("column2", 56, (ui32)NUdf::TDataType<ui64>::Id, EColumnTypeConstraint::Nullable); TVector<ui32> keyTypes({ NUdf::TDataType<ui32>::Id, NUdf::TDataType<ui64>::Id, NUdf::TDataType<char*>::Id }); pgmReturn = pgmBuilder.Append(pgmReturn, pgmBuilder.SetResult("myRes", pgmBuilder.SelectRow(TTableId(1, 2), @@ -386,8 +386,8 @@ Y_UNIT_TEST_SUITE(TMiniKQLProgramBuilderTest) { options.FromColumns = from; TVector<TSelectColumn> columnsToRead; - columnsToRead.emplace_back("column1", 34, (ui32)NUdf::TDataType<ui32>::Id); - columnsToRead.emplace_back("column2", 56, (ui32)NUdf::TDataType<ui64>::Id); + columnsToRead.emplace_back("column1", 34, (ui32)NUdf::TDataType<ui32>::Id, EColumnTypeConstraint::Nullable); + columnsToRead.emplace_back("column2", 56, (ui32)NUdf::TDataType<ui64>::Id, EColumnTypeConstraint::Nullable); TVector<ui32> keyTypes({ NUdf::TDataType<ui32>::Id, NUdf::TDataType<ui64>::Id }); pgmReturn = pgmBuilder.Append(pgmReturn, pgmBuilder.SetResult("myRes", pgmBuilder.SelectRange(TTableId(1, 2), @@ -436,8 +436,8 @@ Y_UNIT_TEST_SUITE(TMiniKQLProgramBuilderTest) { options.Flags = pgmBuilder.TProgramBuilder::NewDataLiteral<ui32>(TReadRangeOptions::TFlags::ExcludeInitValue); TVector<TSelectColumn> columnsToRead; - columnsToRead.emplace_back("column1", 34, (ui32)NUdf::TDataType<ui32>::Id); - columnsToRead.emplace_back("column2", 56, (ui32)NUdf::TDataType<ui64>::Id); + columnsToRead.emplace_back("column1", 34, (ui32)NUdf::TDataType<ui32>::Id, EColumnTypeConstraint::Nullable); + columnsToRead.emplace_back("column2", 56, (ui32)NUdf::TDataType<ui64>::Id, EColumnTypeConstraint::Nullable); TVector<ui32> keyTypes({ NUdf::TDataType<ui32>::Id, NUdf::TDataType<ui64>::Id }); pgmReturn = pgmBuilder.Append(pgmReturn, pgmBuilder.SetResult("myRes", pgmBuilder.SelectRange(TTableId(1, 2), @@ -488,8 +488,8 @@ Y_UNIT_TEST_SUITE(TMiniKQLProgramBuilderTest) { options.ToColumns = to; TVector<TSelectColumn> columnsToRead; - columnsToRead.emplace_back("column1", 34, (ui32)NUdf::TDataType<ui32>::Id); - columnsToRead.emplace_back("column2", 56, (ui32)NUdf::TDataType<ui64>::Id); + columnsToRead.emplace_back("column1", 34, (ui32)NUdf::TDataType<ui32>::Id, EColumnTypeConstraint::Nullable); + columnsToRead.emplace_back("column2", 56, (ui32)NUdf::TDataType<ui64>::Id, EColumnTypeConstraint::Nullable); TVector<ui32> keyTypes({ NUdf::TDataType<ui32>::Id, NUdf::TDataType<ui64>::Id }); pgmReturn = pgmBuilder.Append(pgmReturn, pgmBuilder.SetResult("myRes", pgmBuilder.SelectRange(TTableId(1, 2), @@ -543,8 +543,8 @@ Y_UNIT_TEST_SUITE(TMiniKQLProgramBuilderTest) { options.Flags = pgmBuilder.TProgramBuilder::NewDataLiteral<ui32>(TReadRangeOptions::TFlags::ExcludeTermValue); TVector<TSelectColumn> columnsToRead; - columnsToRead.emplace_back("column1", 34, (ui32)NUdf::TDataType<ui32>::Id); - columnsToRead.emplace_back("column2", 56, (ui32)NUdf::TDataType<ui64>::Id); + columnsToRead.emplace_back("column1", 34, (ui32)NUdf::TDataType<ui32>::Id, EColumnTypeConstraint::Nullable); + columnsToRead.emplace_back("column2", 56, (ui32)NUdf::TDataType<ui64>::Id, EColumnTypeConstraint::Nullable); TVector<ui32> keyTypes({ NUdf::TDataType<ui32>::Id, NUdf::TDataType<ui64>::Id }); pgmReturn = pgmBuilder.Append(pgmReturn, pgmBuilder.SetResult("myRes", pgmBuilder.SelectRange(TTableId(1, 2), @@ -596,8 +596,8 @@ Y_UNIT_TEST_SUITE(TMiniKQLProgramBuilderTest) { options.ToColumns = to; TVector<TSelectColumn> columnsToRead; - columnsToRead.emplace_back("column1", 34, (ui32)NUdf::TDataType<ui32>::Id); - columnsToRead.emplace_back("column2", 56, (ui32)NUdf::TDataType<ui64>::Id); + columnsToRead.emplace_back("column1", 34, (ui32)NUdf::TDataType<ui32>::Id, EColumnTypeConstraint::Nullable); + columnsToRead.emplace_back("column2", 56, (ui32)NUdf::TDataType<ui64>::Id, EColumnTypeConstraint::Nullable); TVector<ui32> keyTypes({ NUdf::TDataType<char*>::Id }); pgmReturn = pgmBuilder.Append(pgmReturn, pgmBuilder.SetResult("myRes", pgmBuilder.SelectRange(TTableId(1, 2), @@ -648,8 +648,8 @@ Y_UNIT_TEST_SUITE(TMiniKQLProgramBuilderTest) { TReadRangeOptions::TFlags::ExcludeInitValue | TReadRangeOptions::TFlags::ExcludeTermValue); TVector<TSelectColumn> columnsToRead; - columnsToRead.emplace_back("column1", 34, (ui32)NUdf::TDataType<ui32>::Id); - columnsToRead.emplace_back("column2", 56, (ui32)NUdf::TDataType<ui64>::Id); + columnsToRead.emplace_back("column1", 34, (ui32)NUdf::TDataType<ui32>::Id, EColumnTypeConstraint::Nullable); + columnsToRead.emplace_back("column2", 56, (ui32)NUdf::TDataType<ui64>::Id, EColumnTypeConstraint::Nullable); TVector<ui32> keyTypes({ NUdf::TDataType<char*>::Id }); pgmReturn = pgmBuilder.Append(pgmReturn, pgmBuilder.SetResult("myRes", pgmBuilder.SelectRange(TTableId(1, 2), diff --git a/ydb/core/engine/minikql/flat_local_tx_minikql.h b/ydb/core/engine/minikql/flat_local_tx_minikql.h index d7387ed8f41..70805832d07 100644 --- a/ydb/core/engine/minikql/flat_local_tx_minikql.h +++ b/ydb/core/engine/minikql/flat_local_tx_minikql.h @@ -48,8 +48,9 @@ public: const auto *columnInfo = tableInfo->Columns.FindPtr(*columnId); Y_VERIFY(columnInfo); + auto nullConstraint = columnInfo->NotNull ? EColumnTypeConstraint::NotNull : EColumnTypeConstraint::Nullable; auto insertResult = result.Columns.insert(std::make_pair(column, IDbSchemeResolver::TTableResult::TColumn - {*columnId, (i32)columnInfo->KeyOrder, columnInfo->PType, 0})); + {*columnId, (i32)columnInfo->KeyOrder, columnInfo->PType, 0, nullConstraint})); Y_VERIFY(insertResult.second); } } diff --git a/ydb/core/engine/mkql_engine_flat_ut.cpp b/ydb/core/engine/mkql_engine_flat_ut.cpp index 7c547889c13..e355bf3d8b8 100644 --- a/ydb/core/engine/mkql_engine_flat_ut.cpp +++ b/ydb/core/engine/mkql_engine_flat_ut.cpp @@ -336,7 +336,8 @@ Y_UNIT_TEST_SUITE(TMiniKQLEngineFlatTest) { row[0] = pgmBuilder.NewNull(); TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto value = pgmBuilder.SelectRow(TTableId(OwnerId, Table1Id), keyTypes, columns, row); auto pgm = pgmBuilder.Build(pgmBuilder.AsList(pgmBuilder.SetResult("myRes", value))); @@ -540,7 +541,8 @@ Value { TRuntimeNode::TList row(1); row[0] = pgmBuilder.TProgramBuilder::NewDataLiteral<ui32>(42); TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto value = pgmBuilder.SelectRow(TTableId(OwnerId, Table1Id), keyTypes, columns, row); auto pgm = pgmBuilder.Build(pgmBuilder.AsList(pgmBuilder.SetResult("myRes", value))); @@ -1208,7 +1210,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -1326,7 +1329,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); keyTypes[0] = (ui32)NUdf::TDataType<ui32>::Id; @@ -1436,7 +1440,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); keyTypes[0] = (ui32)NUdf::TDataType<ui32>::Id; @@ -1549,7 +1554,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -1670,7 +1676,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); TVector<ui32> keyTypes(1); keyTypes[0] = (ui32)NUdf::TDataType<ui32>::Id; @@ -1791,7 +1798,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); TVector<ui32> keyTypes(1); keyTypes[0] = (ui32)NUdf::TDataType<ui32>::Id; @@ -1907,7 +1915,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); TVector<ui32> keyTypes(1); keyTypes[0] = (ui32)NUdf::TDataType<ui32>::Id; @@ -2031,7 +2040,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); TVector<ui32> keyTypes(1); keyTypes[0] = (ui32)NUdf::TDataType<ui32>::Id; @@ -2141,7 +2151,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); TVector<ui32> keyTypes(1); keyTypes[0] = (ui32)NUdf::TDataType<ui32>::Id; @@ -2261,7 +2272,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); TVector<ui32> keyTypes(1); keyTypes[0] = (ui32)NUdf::TDataType<ui32>::Id; @@ -2390,7 +2402,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); TVector<ui32> keyTypes(1); keyTypes[0] = (ui32)NUdf::TDataType<ui32>::Id; @@ -2512,7 +2525,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); TVector<ui32> keyTypes(1); keyTypes[0] = (ui32)NUdf::TDataType<ui32>::Id; @@ -2634,7 +2648,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); TVector<ui32> keyTypes(1); keyTypes[0] = (ui32)NUdf::TDataType<ui32>::Id; @@ -2755,7 +2770,8 @@ Value { keyTypes1[0] = (ui32)NUdf::TDataType<ui32>::Id; TRuntimeNode::TList row1(1); TVector<TSelectColumn> columns1; - columns1.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns1.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); row1[0] = pgmBuilder.TProgramBuilder::NewDataLiteral<ui32>(42); auto value1 = pgmBuilder.SelectRow(TTableId(OwnerId, Table1Id), keyTypes1, columns1, row1); @@ -2765,7 +2781,8 @@ Value { TRuntimeNode::TList row2(1); row2[0] = pgmBuilder.TProgramBuilder::NewDataLiteral<ui64>(11); TVector<TSelectColumn> columns2; - columns2.emplace_back("4", (ui32)Schema2::Table2::Value::ColumnId, (ui32)Schema2::Table2::Value::ColumnType); + columns2.emplace_back("4", (ui32)Schema2::Table2::Value::ColumnId, (ui32)Schema2::Table2::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto value2 = pgmBuilder.SelectRow(TTableId(OwnerId, Table2Id), keyTypes2, columns2, row2); TRuntimeNode::TList resList; @@ -3059,7 +3076,8 @@ Value { pgmBuilder.TProgramBuilder::NewDataLiteral<NUdf::EDataSlot::Utf8>("asd")); TVector<TSelectColumn> columns1; - columns1.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns1.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto oldRow1 = pgmBuilder.SelectRow(TTableId(OwnerId, Table1Id), keyTypes1, columns1, row1); auto value1 = pgmBuilder.UpdateRow(TTableId(OwnerId, Table1Id), keyTypes1, row1, update1); @@ -3076,7 +3094,8 @@ Value { pgmBuilder.TProgramBuilder::NewDataLiteral<ui32>(32)); TVector<TSelectColumn> columns2; - columns2.emplace_back("4", (ui32)Schema2::Table2::Value::ColumnId, (ui32)Schema2::Table2::Value::ColumnType); + columns2.emplace_back("4", (ui32)Schema2::Table2::Value::ColumnId, (ui32)Schema2::Table2::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto oldRow2 = pgmBuilder.SelectRow(TTableId(OwnerId, Table2Id), keyTypes2, columns2, row2); auto value2 = pgmBuilder.UpdateRow(TTableId(OwnerId, Table2Id), keyTypes2, row2, update2); @@ -3175,7 +3194,8 @@ Value { TRuntimeNode::TList row(1); row[0] = pgmBuilder.TProgramBuilder::NewDataLiteral<ui32>(42); TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto value = pgmBuilder.SelectRow(TTableId(OwnerId, Table1Id), keyTypes, columns, row); auto pgm = pgmBuilder.Build(pgmBuilder.AsList(pgmBuilder.SetResult("myRes", value))); @@ -3248,7 +3268,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -3445,7 +3466,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -3570,7 +3592,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -3699,7 +3722,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -3832,7 +3856,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -3978,7 +4003,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -4104,7 +4130,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -4237,7 +4264,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("2", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -4739,8 +4767,10 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); - columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -4815,8 +4845,10 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); - columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -4883,8 +4915,10 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); - columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -4945,8 +4979,10 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); - columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -5031,8 +5067,10 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); - columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -5074,8 +5112,10 @@ Value { { TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema2::Table2::ID::ColumnId, (ui32)Schema2::Table2::ID::ColumnType); - columns.emplace_back("Value", (ui32)Schema2::Table2::Value::ColumnId, (ui32)Schema2::Table2::Value::ColumnType); + columns.emplace_back("ID", (ui32)Schema2::Table2::ID::ColumnId, (ui32)Schema2::Table2::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns.emplace_back("Value", (ui32)Schema2::Table2::Value::ColumnId, (ui32)Schema2::Table2::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -5136,8 +5176,10 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns1; - columns1.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); - columns1.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns1.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns1.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options1 = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes1(1); keyTypes1[0] = (ui32)NUdf::TDataType<ui32>::Id; @@ -5149,8 +5191,10 @@ Value { auto list1 = pgmBuilder.Member(range1, "List"); TVector<TSelectColumn> columns2; - columns2.emplace_back("ID", (ui32)Schema2::Table2::ID::ColumnId, (ui32)Schema2::Table2::ID::ColumnType); - columns2.emplace_back("Value", (ui32)Schema2::Table2::Value::ColumnId, (ui32)Schema2::Table2::Value::ColumnType); + columns2.emplace_back("ID", (ui32)Schema2::Table2::ID::ColumnId, (ui32)Schema2::Table2::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns2.emplace_back("Value", (ui32)Schema2::Table2::Value::ColumnId, (ui32)Schema2::Table2::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options2 = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes2(1); keyTypes2[0] = (ui32)NUdf::TDataType<ui64>::Id; @@ -5226,8 +5270,10 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns1; - columns1.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); - columns1.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns1.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns1.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options1 = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes1(1); keyTypes1[0] = (ui32)NUdf::TDataType<ui32>::Id; @@ -5239,8 +5285,10 @@ Value { auto list1 = pgmBuilder.Member(range1, "List"); TVector<TSelectColumn> columns2; - columns2.emplace_back("ID", (ui32)Schema2::Table2::ID::ColumnId, (ui32)Schema2::Table2::ID::ColumnType); - columns2.emplace_back("Value", (ui32)Schema2::Table2::Value::ColumnId, (ui32)Schema2::Table2::Value::ColumnType); + columns2.emplace_back("ID", (ui32)Schema2::Table2::ID::ColumnId, (ui32)Schema2::Table2::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns2.emplace_back("Value", (ui32)Schema2::Table2::Value::ColumnId, (ui32)Schema2::Table2::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options2 = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes2(1); keyTypes2[0] = (ui32)NUdf::TDataType<ui64>::Id; @@ -5329,8 +5377,10 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); - columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -5443,8 +5493,10 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); - columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -5552,8 +5604,10 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); - columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -5634,8 +5688,10 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); - columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -5710,8 +5766,10 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); - columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -5789,8 +5847,10 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); - columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -5876,8 +5936,10 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); - columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -5961,8 +6023,10 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); - columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -6050,8 +6114,10 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); - columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -6143,8 +6209,10 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); - columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType); + columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); + columns.emplace_back("Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, + EColumnTypeConstraint::Nullable); auto options = pgmBuilder.GetDefaultTableRangeOptions(); TVector<ui32> keyTypes(1); @@ -6292,8 +6360,8 @@ Value { auto& pgmBuilder = driver.PgmBuilder; TVector<TSelectColumn> columns1 { - {"ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType}, - {"Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType} + {"ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, EColumnTypeConstraint::Nullable}, + {"Value", (ui32)Schema1::Table1::Value::ColumnId, (ui32)Schema1::Table1::Value::ColumnType, EColumnTypeConstraint::Nullable} }; TRuntimeNode::TList fromColumns1{pgmBuilder.NewEmptyOptionalDataLiteral(NUdf::TDataType<ui32>::Id)}; @@ -6315,8 +6383,8 @@ Value { auto take1 = pgmBuilder.Take(filtered1, pgmBuilder.TProgramBuilder::NewDataLiteral<ui64>(2)); TVector<TSelectColumn> columns2 { - {"ID", (ui32)Schema2::Table2::ID::ColumnId, (ui32)Schema2::Table2::ID::ColumnType}, - {"Value", (ui32)Schema2::Table2::Value::ColumnId, (ui32)Schema2::Table2::Value::ColumnType} + {"ID", (ui32)Schema2::Table2::ID::ColumnId, (ui32)Schema2::Table2::ID::ColumnType, EColumnTypeConstraint::Nullable}, + {"Value", (ui32)Schema2::Table2::Value::ColumnId, (ui32)Schema2::Table2::Value::ColumnType, EColumnTypeConstraint::Nullable} }; TRuntimeNode::TList fromColumns2{pgmBuilder.NewEmptyOptionalDataLiteral(NUdf::TDataType<ui64>::Id)}; @@ -6370,7 +6438,8 @@ Value { TVector<ui32> keyTypes(1); keyTypes[0] = (ui32)NUdf::TDataType<ui32>::Id; TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); + columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); TRuntimeNode::TList row1(1); row1[0] = pgmBuilder.TProgramBuilder::NewDataLiteral<ui32>(1); @@ -6418,7 +6487,8 @@ Value { TVector<ui32> keyTypes(1); keyTypes[0] = (ui32)NUdf::TDataType<ui32>::Id; TVector<TSelectColumn> columns; - columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType); + columns.emplace_back("ID", (ui32)Schema1::Table1::ID::ColumnId, (ui32)Schema1::Table1::ID::ColumnType, + EColumnTypeConstraint::Nullable); TVector<ui32> key2Types(1); key2Types[0] = (ui32)NUdf::TDataType<ui64>::Id; diff --git a/ydb/core/engine/mkql_keys.cpp b/ydb/core/engine/mkql_keys.cpp index 17bc05a3b86..91d5f35a9a0 100644 --- a/ydb/core/engine/mkql_keys.cpp +++ b/ydb/core/engine/mkql_keys.cpp @@ -93,7 +93,7 @@ void ExtractReadColumns(TStructType* columnsType, TStructLiteral* tags, TVector< op.Column = columnId; op.Operation = TKeyDesc::EColumnOperation::Read; bool isOptional; - op.ExpectedType = UnpackOptionalData(AS_TYPE(TOptionalType, columnsType->GetMemberType(i)), isOptional)->GetSchemeType(); + op.ExpectedType = UnpackOptionalData(columnsType->GetMemberType(i), isOptional)->GetSchemeType(); MKQL_ENSURE(op.ExpectedType != 0, "Null type is not allowed"); } } diff --git a/ydb/core/kqp/ut/kqp_not_null_columns_ut.cpp b/ydb/core/kqp/ut/kqp_not_null_columns_ut.cpp index 104c3143cf6..3ee6b55ad35 100644 --- a/ydb/core/kqp/ut/kqp_not_null_columns_ut.cpp +++ b/ydb/core/kqp/ut/kqp_not_null_columns_ut.cpp @@ -150,6 +150,12 @@ Y_UNIT_TEST_SUITE(KqpNotNullColumns) { UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); } + { /* update data column */ + const auto query = Q_("UPDATE `/Root/TestUpdateNotNullPk` SET Value = 'NewValue'"); + auto result = session.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + } + { /* update not null pk column */ const auto query = Q_("UPDATE `/Root/TestUpdateNotNullPk` SET Key = 10 WHERE Key = 1"); auto result = session.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync(); @@ -163,6 +169,54 @@ Y_UNIT_TEST_SUITE(KqpNotNullColumns) { } } + Y_UNIT_TEST_NEW_ENGINE(SelectNotNullColumns) { + TKikimrRunner kikimr; + auto client = kikimr.GetTableClient(); + auto session = client.CreateSession().GetValueSync().GetSession(); + + { + const auto query = Q_(R"( + CREATE TABLE `/Root/TestSelectNotNullPk` ( + Key Uint64 NOT NULL, + Value String NOT NULL, + PRIMARY KEY (Key)) + )"); + + auto result = session.ExecuteSchemeQuery(query).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + } + + { /* init table */ + const auto query = Q_(R"( + REPLACE INTO `/Root/TestSelectNotNullPk` (Key, Value) VALUES + (1, 'Value1'), + (2, 'Value2'), + (3, 'Value3'); + )"); + + auto result = session.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + } + + { + const auto query = Q_("SELECT * FROM `/Root/TestSelectNotNullPk`"); + auto result = session.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + } + + { + const auto query = Q_("SELECT * FROM `/Root/TestSelectNotNullPk` WHERE Key = 1"); + auto result = session.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + } + + { + const auto query = Q_("SELECT * FROM `/Root/TestSelectNotNullPk` WHERE Value = 'Value1'"); + auto result = session.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + } + } + Y_UNIT_TEST_NEW_ENGINE(InsertNotNull) { TKikimrRunner kikimr; auto client = kikimr.GetTableClient(); @@ -307,6 +361,12 @@ Y_UNIT_TEST_SUITE(KqpNotNullColumns) { } { /* update not null column */ + const auto query = Q_("UPDATE `/Root/TestUpdateNotNull` SET Value = 'NewValue1'"); + auto result = session.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + } + + { /* update not null column */ const auto query = Q_("UPDATE `/Root/TestUpdateNotNull` SET Value = 'NewValue1' WHERE Key = 1"); auto result = session.ExecuteDataQuery(query, TTxControl::BeginTx().CommitTx()).ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); diff --git a/ydb/core/scheme/scheme_tabledefs.h b/ydb/core/scheme/scheme_tabledefs.h index 1e09a1e7230..ccf0b73f29e 100644 --- a/ydb/core/scheme/scheme_tabledefs.h +++ b/ydb/core/scheme/scheme_tabledefs.h @@ -17,6 +17,11 @@ namespace NKikimr { using TSchemaVersion = ui64; +enum class EColumnTypeConstraint { + Nullable, + NotNull, +}; + // ident for table, must be unique in selected scope // for global transactions ownerid is tabletid of owning schemeshard and tableid is counter designated by schemeshard // SysViewInfo is not empty for system views attached to corresponding table diff --git a/ydb/core/tx/datashard/datashard_ut_common.cpp b/ydb/core/tx/datashard/datashard_ut_common.cpp index 4c84f213ed6..8954f967bc7 100644 --- a/ydb/core/tx/datashard/datashard_ut_common.cpp +++ b/ydb/core/tx/datashard/datashard_ut_common.cpp @@ -198,7 +198,7 @@ void TTester::RegisterTableInResolver(const TString& schemeText) keyIdx = ki; } } - table.Columns.insert(std::make_pair(c.GetName(), TColumn{c.GetId(), keyIdx, c.GetTypeId(), 0})); + table.Columns.insert(std::make_pair(c.GetName(), TColumn{c.GetId(), keyIdx, c.GetTypeId(), 0, EColumnTypeConstraint::Nullable})); } DbSchemeResolver.AddTable(table); } diff --git a/ydb/core/tx/schemeshard/ut_helpers/helpers.cpp b/ydb/core/tx/schemeshard/ut_helpers/helpers.cpp index 0eca056a6f4..66d2b93f437 100644 --- a/ydb/core/tx/schemeshard/ut_helpers/helpers.cpp +++ b/ydb/core/tx/schemeshard/ut_helpers/helpers.cpp @@ -2019,7 +2019,8 @@ namespace NSchemeShardUT_Private { keyIdx = ki; } } - table.Columns.insert(std::make_pair(c.GetName(), TColumn{c.GetId(), keyIdx, c.GetTypeId(), 0})); + table.Columns.insert(std::make_pair(c.GetName(), TColumn{c.GetId(), keyIdx, c.GetTypeId(), 0, + EColumnTypeConstraint::Nullable})); } dbSchemeResolver.AddTable(table); }; |