@@ -557,20 +557,33 @@ Y_UNIT_TEST_SUITE(DataShardWrite) {
557
557
Y_UNIT_TEST (WriteImmediateBadRequest) {
558
558
auto [runtime, server, sender] = TestCreateServer ();
559
559
560
- auto opts = TShardedTableOptions ().Columns ({{" key" , " Utf8" , true , false }});
560
+ auto opts = TShardedTableOptions ().Columns ({
561
+ {" key" , " Utf8" , true , true },
562
+ {" value1" , " Uint32" , false , false },
563
+ {" value2" , " Uint32" , false , true },
564
+ });
561
565
auto [shards, tableId] = CreateShardedTable (server, sender, " /Root" , " table-1" , opts);
562
566
const ui64 shard = shards[0 ];
563
567
568
+ auto prepareEvWrite = [&](
569
+ NKikimrDataEvents::TEvWrite::TOperation::EOperationType opType,
570
+ TSerializedCellMatrix matrix,
571
+ const std::vector<ui32>& columnIds) {
572
+ auto evWrite = std::make_unique<NKikimr::NEvents::TDataEvents::TEvWrite>(100 , NKikimrDataEvents::TEvWrite::MODE_IMMEDIATE);
573
+ ui64 payloadIndex = NKikimr::NEvWrite::TPayloadWriter<NKikimr::NEvents::TDataEvents::TEvWrite>(*evWrite).AddDataToPayload (matrix.ReleaseBuffer ());
574
+ evWrite->AddOperation (opType, tableId, columnIds, payloadIndex, NKikimrDataEvents::FORMAT_CELLVEC);
575
+ return evWrite;
576
+ };
577
+
564
578
Cout << " ========= Send immediate write with huge key=========\n " ;
565
579
{
566
580
TString hugeStringValue (NLimits::MaxWriteKeySize + 1 , ' X' );
567
- TSerializedCellMatrix matrix ({TCell (hugeStringValue.c_str (), hugeStringValue.size ())}, 1 , 1 );
581
+ TSerializedCellMatrix matrix ({TCell (hugeStringValue.c_str (), hugeStringValue.size ()), TCell::Make ( ui32 ( 123 )) }, 1 , 2 );
568
582
569
- auto evWrite = std::make_unique<NKikimr::NEvents::TDataEvents::TEvWrite>(100 , NKikimrDataEvents::TEvWrite::MODE_IMMEDIATE);
570
- ui64 payloadIndex = NKikimr::NEvWrite::TPayloadWriter<NKikimr::NEvents::TDataEvents::TEvWrite>(*evWrite).AddDataToPayload (matrix.ReleaseBuffer ());
571
- evWrite->AddOperation (NKikimrDataEvents::TEvWrite::TOperation::OPERATION_UPSERT, tableId, {1 }, payloadIndex, NKikimrDataEvents::FORMAT_CELLVEC);
572
-
573
- const auto writeResult = Write (runtime, sender, shard, std::move (evWrite), NKikimrDataEvents::TEvWriteResult::STATUS_BAD_REQUEST);
583
+ const auto writeResult = Write (
584
+ runtime, sender, shard,
585
+ prepareEvWrite (NKikimrDataEvents::TEvWrite::TOperation::OPERATION_UPSERT, std::move (matrix), {1 , 3 }),
586
+ NKikimrDataEvents::TEvWriteResult::STATUS_BAD_REQUEST);
574
587
UNIT_ASSERT_VALUES_EQUAL (writeResult.GetIssues ().size (), 1 );
575
588
UNIT_ASSERT (writeResult.GetIssues (0 ).message ().Contains (" Row key size of 1049601 bytes is larger than the allowed threshold 1049600" ));
576
589
}
@@ -595,6 +608,43 @@ Y_UNIT_TEST_SUITE(DataShardWrite) {
595
608
UNIT_ASSERT_VALUES_EQUAL (writeResult.GetIssues ().size (), 1 );
596
609
UNIT_ASSERT (writeResult.GetIssues (0 ).message ().Contains (" OPERATION_UNSPECIFIED operation is not supported now" ));
597
610
}
611
+
612
+ Cout << " ========= Send immediate write with NULL value for NOT NULL column=========\n " ;
613
+ {
614
+ TString stringValue (" KEY" );
615
+ TSerializedCellMatrix matrix (
616
+ {TCell (stringValue.data (), stringValue.size ()), TCell ()},
617
+ 1 , 2 );
618
+
619
+ const auto writeResult = Write (
620
+ runtime, sender, shard,
621
+ prepareEvWrite (NKikimrDataEvents::TEvWrite::TOperation::OPERATION_UPSERT, matrix, {1 , 3 }),
622
+ NKikimrDataEvents::TEvWriteResult::STATUS_BAD_REQUEST);
623
+ UNIT_ASSERT_VALUES_EQUAL (writeResult.GetIssues ().size (), 1 );
624
+ UNIT_ASSERT (writeResult.GetIssues (0 ).message ().Contains (" NULL value for NON NULL column" ));
625
+ }
626
+
627
+ Cout << " ========= Send immediate write without data for NOT NULL column=========\n " ;
628
+ {
629
+ TString stringValue (" KEY" );
630
+ TSerializedCellMatrix matrix (
631
+ {TCell (stringValue.data (), stringValue.size ()), TCell::Make (ui32 (123 ))},
632
+ 1 , 2 );
633
+
634
+ // Insert should fail.
635
+ const auto insertResult = Write (
636
+ runtime, sender, shard,
637
+ prepareEvWrite (NKikimrDataEvents::TEvWrite::TOperation::OPERATION_INSERT, matrix, {1 , 2 }),
638
+ NKikimrDataEvents::TEvWriteResult::STATUS_BAD_REQUEST);
639
+ UNIT_ASSERT_VALUES_EQUAL (insertResult.GetIssues ().size (), 1 );
640
+ UNIT_ASSERT (insertResult.GetIssues (0 ).message ().Contains (" Missing inserted values for NON NULL column" ));
641
+
642
+ // Update should complete successfully.
643
+ const auto updateResult = Write (
644
+ runtime, sender, shard,
645
+ prepareEvWrite (NKikimrDataEvents::TEvWrite::TOperation::OPERATION_UPDATE, matrix, {1 , 2 }),
646
+ NKikimrDataEvents::TEvWriteResult::STATUS_COMPLETED);
647
+ }
598
648
}
599
649
600
650
Y_UNIT_TEST (WriteImmediateSeveralOperations) {
0 commit comments