aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorulya-sidorina <yulia@ydb.tech>2022-08-04 11:03:59 +0300
committerulya-sidorina <yulia@ydb.tech>2022-08-04 11:03:59 +0300
commit12845e3c5d1e4c5c6aeb6d0cafdd7fd161533f11 (patch)
treeb65d5fe54c5c54331ef31e188e8ac67251da60ed
parent6579c2d2aacacba6603a33ddb7731db63d27fdce (diff)
downloadydb-12845e3c5d1e4c5c6aeb6d0cafdd7fd161533f11.tar.gz
fix not null pk for old engine
-rw-r--r--ydb/core/client/minikql_compile/db_key_resolver.h1
-rw-r--r--ydb/core/client/minikql_compile/yql_expr_minikql.cpp13
-rw-r--r--ydb/core/client/minikql_compile/yql_expr_minikql_compile_ut.cpp8
-rw-r--r--ydb/core/client/scheme_cache_lib/yql_db_scheme_resolver.cpp5
-rw-r--r--ydb/core/client/server/msgbus_server_db.cpp16
-rw-r--r--ydb/core/engine/kikimr_program_builder.cpp10
-rw-r--r--ydb/core/engine/kikimr_program_builder.h5
-rw-r--r--ydb/core/engine/kikimr_program_builder_ut.cpp28
-rw-r--r--ydb/core/engine/minikql/flat_local_tx_minikql.h3
-rw-r--r--ydb/core/engine/mkql_engine_flat_ut.cpp218
-rw-r--r--ydb/core/engine/mkql_keys.cpp2
-rw-r--r--ydb/core/kqp/ut/kqp_not_null_columns_ut.cpp60
-rw-r--r--ydb/core/scheme/scheme_tabledefs.h5
-rw-r--r--ydb/core/tx/datashard/datashard_ut_common.cpp2
-rw-r--r--ydb/core/tx/schemeshard/ut_helpers/helpers.cpp3
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);
};