diff --git a/ydb/core/kqp/provider/yql_kikimr_type_ann.cpp b/ydb/core/kqp/provider/yql_kikimr_type_ann.cpp index c972df8b247a..dd54022b2322 100644 --- a/ydb/core/kqp/provider/yql_kikimr_type_ann.cpp +++ b/ydb/core/kqp/provider/yql_kikimr_type_ann.cpp @@ -298,7 +298,7 @@ namespace { return true; } - bool ParseConstraintNode(TExprContext& ctx, TKikimrColumnMetadata& columnMeta, const TExprList& columnTuple, TCoNameValueTuple constraint, TKikimrConfiguration& config, bool isAlter = false) { + bool ParseConstraintNode(TExprContext& ctx, TKikimrColumnMetadata& columnMeta, const TExprList& columnTuple, TCoNameValueTuple constraint, TKikimrConfiguration& config, bool& needEval, bool isAlter = false) { auto nameNode = columnTuple.Item(0).Cast(); auto typeNode = columnTuple.Item(1); @@ -345,9 +345,23 @@ namespace { } if (!skipAnnotationValidation && !IsSameAnnotation(*defaultType, *actualType)) { - ctx.AddError(TIssue(ctx.GetPosition(constraint.Pos()), TStringBuilder() << "Default expr " << columnName - << " type mismatch, expected: " << (*actualType) << ", actual: " << *(defaultType))); + auto constrPtr = constraint.Value().Cast().Ptr(); + auto status = TryConvertTo(constrPtr, *type, ctx); + if (status == IGraphTransformer::TStatus::Error) { + ctx.AddError(TIssue(ctx.GetPosition(constraint.Pos()), TStringBuilder() << "Default expr " << columnName + << " type mismatch, expected: " << (*actualType) << ", actual: " << *(defaultType))); return false; + } else if (status == IGraphTransformer::TStatus::Repeat) { + auto evaluatedExpr = ctx.Builder(constrPtr->Pos()) + .Callable("EvaluateExpr") + .Add(0, constrPtr) + .Seal() + .Build(); + + constraint.Ptr()->ChildRef(TCoNameValueTuple::idx_Value) = evaluatedExpr; + needEval = true; + return true; + } } if (columnMeta.IsDefaultKindDefined()) { @@ -867,9 +881,15 @@ virtual TStatus HandleCreateTable(TKiCreateTable create, TExprContext& ctx) over if (columnTuple.Size() > 2) { const auto& columnConstraints = columnTuple.Item(2).Cast(); for(const auto& constraint: columnConstraints.Value().Cast()) { - if (!ParseConstraintNode(ctx, columnMeta, columnTuple, constraint, SessionCtx->Config())) { + bool needEval = false; + if (!ParseConstraintNode(ctx, columnMeta, columnTuple, constraint, SessionCtx->Config(), needEval)) { return TStatus::Error; } + + if (needEval) { + ctx.Step.Repeat(TExprStep::ExprEval); + return TStatus(TStatus::Repeat, true); + } } } @@ -1282,7 +1302,8 @@ virtual TStatus HandleCreateTable(TKiCreateTable create, TExprContext& ctx) over if (columnTuple.Size() > 2) { const auto& columnConstraints = columnTuple.Item(2).Cast(); for(const auto& constraint: columnConstraints.Value().Cast()) { - if (!ParseConstraintNode(ctx, columnMeta, columnTuple, constraint, SessionCtx->Config(), true)) { + bool needEval = false; + if (!ParseConstraintNode(ctx, columnMeta, columnTuple, constraint, SessionCtx->Config(), needEval, true)) { return TStatus::Error; } } diff --git a/ydb/core/kqp/ut/pg/kqp_pg_ut.cpp b/ydb/core/kqp/ut/pg/kqp_pg_ut.cpp index f3c2c3678cfb..e8089e6d5fcd 100644 --- a/ydb/core/kqp/ut/pg/kqp_pg_ut.cpp +++ b/ydb/core/kqp/ut/pg/kqp_pg_ut.cpp @@ -3743,6 +3743,7 @@ Y_UNIT_TEST_SUITE(KqpPg) { d varchar(20) DEFAULT 'foo'::varchar(2), e int DEFAULT NULL, f bit varying(5) DEFAULT '1001', + g bigint DEFAULT 0 NOT NULL, PRIMARY KEY(a) ); )", NYdb::NQuery::TTxControl::NoTx(), settings).ExtractValueSync(); @@ -3762,7 +3763,7 @@ Y_UNIT_TEST_SUITE(KqpPg) { UNIT_ASSERT_C(!result.GetResultSets().empty(), "results are empty"); CompareYson(R"( - [["1";"5";"7";"fo";#;"1001"]] + [["1";"5";"7";"fo";#;"1001";0]] )", FormatResultSetYson(result.GetResultSet(0))); } }