@@ -407,6 +407,7 @@ class TUploadRowsBase : public TActorBootstrapped<TUploadRowsBase<DerivedActivit
407407 THashMap<TString, ui32> columnByName;
408408 THashSet<TString> keyColumnsLeft;
409409 THashSet<TString> notNullColumnsLeft = entry.NotNullColumns ;
410+ THashSet<TString> defaultColumnsLeft;
410411 SrcColumns.reserve (entry.Columns .size ());
411412 THashSet<TString> HasInternalConversion;
412413
@@ -426,6 +427,10 @@ class TUploadRowsBase : public TActorBootstrapped<TUploadRowsBase<DerivedActivit
426427 keyColumnIds[keyOrder] = id;
427428 keyColumnsLeft.insert (name);
428429 }
430+
431+ if (colInfo.IsDefaultFromLiteral ()) {
432+ defaultColumnsLeft.insert (name);
433+ }
429434 }
430435
431436 if (entry.ColumnTableInfo ) {
@@ -524,6 +529,10 @@ class TUploadRowsBase : public TActorBootstrapped<TUploadRowsBase<DerivedActivit
524529 NotNullColumns.emplace (ci.Name );
525530 }
526531
532+ if (defaultColumnsLeft.contains (ci.Name )) {
533+ defaultColumnsLeft.erase (ci.Name );
534+ }
535+
527536 if (ci.KeyOrder != -1 ) {
528537 KeyColumnPositions[ci.KeyOrder ] = TFieldDescription{ci.Id , ci.Name , (ui32)pos, ci.PType , pgTypeMod, notNull};
529538 keyColumnsLeft.erase (ci.Name );
@@ -608,6 +617,21 @@ class TUploadRowsBase : public TActorBootstrapped<TUploadRowsBase<DerivedActivit
608617 return TConclusionStatus::Fail (Sprintf (" Missing not null columns: %s" , JoinSeq (" , " , notNullColumnsLeft).c_str ()));
609618 }
610619
620+ if (!defaultColumnsLeft.empty () && UpsertIfExists) {
621+ // some default columns are not specified in the request, but upsert will only update existing rows
622+ // and only the columns specified in the request will be updated; unspecified default columns will not be changed.
623+ defaultColumnsLeft.clear ();
624+ }
625+
626+ if (!defaultColumnsLeft.empty ()) {
627+ if (AppData (ctx)->FeatureFlags .GetDisableMissingDefaultColumnsInBulkUpsert ()) {
628+ return TConclusionStatus::Fail (Sprintf (" Missing default columns: %s" , JoinSeq (" , " , defaultColumnsLeft).c_str ()));
629+ }
630+
631+ UploadCounters.OnMissingDefaultColumns ();
632+ LOG_WARN_S (ctx, NKikimrServices::RPC_REQUEST, " Missing default columns: " << JoinSeq (" , " , defaultColumnsLeft).c_str ());
633+ }
634+
611635 TConclusionStatus res = TConclusionStatus::Success ();
612636 if (isColumnTable && HasAppData () && AppDataVerified ().ColumnShardConfig .GetBulkUpsertRequireAllColumns ()) {
613637 res = CheckRequiredColumns (entry, *reqColumns);
0 commit comments