@@ -850,6 +850,118 @@ Y_UNIT_TEST_SUITE(KqpConstraints) {
850
850
851
851
}
852
852
853
+ Y_UNIT_TEST (IndexAutoChooseAndNonReadyIndex) {
854
+ NKikimrConfig::TAppConfig appConfig;
855
+ appConfig.MutableTableServiceConfig ()->SetIndexAutoChooseMode (NKikimrConfig::TTableServiceConfig_EIndexAutoChooseMode_MAX_USED_PREFIX);
856
+ TKikimrRunner kikimr (TKikimrSettings ().SetUseRealThreads (false ).SetPQConfig (DefaultPQConfig ()).SetAppConfig (appConfig));
857
+ auto db = kikimr.RunCall ([&] { return kikimr.GetTableClient (); } );
858
+ auto session = kikimr.RunCall ([&] { return db.CreateSession ().GetValueSync ().GetSession (); } );
859
+ auto querySession = kikimr.RunCall ([&] { return db.CreateSession ().GetValueSync ().GetSession (); } );
860
+
861
+ auto & runtime = *kikimr.GetTestServer ().GetRuntime ();
862
+
863
+ {
864
+ auto query = R"(
865
+ --!syntax_v1
866
+ CREATE TABLE `/Root/IndexChooseAndNonReadyIndex` (
867
+ Key Uint32 NOT NULL,
868
+ Value String NOT NULL,
869
+ PRIMARY KEY (Key)
870
+ );
871
+ )" ;
872
+
873
+ auto result = kikimr.RunCall ([&]{ return session.ExecuteSchemeQuery (query).GetValueSync (); });
874
+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SUCCESS,
875
+ result.GetIssues ().ToString ());
876
+ }
877
+
878
+ auto fQuery = [&](TString query) -> TString {
879
+ NYdb::NTable::TExecDataQuerySettings execSettings;
880
+ execSettings.KeepInQueryCache (true );
881
+ execSettings.CollectQueryStats (ECollectQueryStatsMode::Basic);
882
+
883
+ auto result = kikimr.RunCall ([&] {
884
+ return querySession
885
+ .ExecuteDataQuery (query, TTxControl::BeginTx ().CommitTx (),
886
+ execSettings)
887
+ .ExtractValueSync (); } );
888
+
889
+ if (result.GetStatus () == EStatus::SUCCESS) {
890
+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SUCCESS,
891
+ result.GetIssues ().ToString ());
892
+ if (result.GetResultSets ().size () > 0 )
893
+ return NYdb::FormatResultSetYson (result.GetResultSet (0 ));
894
+ return " " ;
895
+ } else {
896
+ return TStringBuilder () << result.GetStatus () << " : " << result.GetIssues ().ToString ();
897
+ }
898
+ };
899
+
900
+ fQuery (R"(
901
+ UPSERT INTO `/Root/IndexChooseAndNonReadyIndex` (Key, Value) VALUES (1, "Old");
902
+ )" );
903
+
904
+ auto fCompareTable = [&](TString expected) {
905
+ TString query = R"(
906
+ SELECT * FROM `/Root/IndexChooseAndNonReadyIndex` WHERE Value = "Old";
907
+ )" ;
908
+ CompareYson (expected, fQuery (query));
909
+ };
910
+
911
+ fCompareTable (R"(
912
+ [
913
+ [1u;"Old"]
914
+ ]
915
+ )" );
916
+
917
+ auto alterQuery = R"(
918
+ --!syntax_v1
919
+ ALTER TABLE `/Root/IndexChooseAndNonReadyIndex` ADD INDEX Index GLOBAL ON (Value);
920
+ )" ;
921
+
922
+ bool enabledCapture = true ;
923
+ TVector<TAutoPtr<IEventHandle>> delayedUpsertRows;
924
+ auto grab = [&delayedUpsertRows, &enabledCapture](TAutoPtr<IEventHandle>& ev) -> auto {
925
+ if (enabledCapture && ev->GetTypeRewrite () == NKikimr::TEvDataShard::TEvUploadRowsRequest::EventType) {
926
+ delayedUpsertRows.emplace_back (ev.Release ());
927
+ return TTestActorRuntime::EEventAction::DROP;
928
+ }
929
+
930
+ return TTestActorRuntime::EEventAction::PROCESS;
931
+ };
932
+
933
+ TDispatchOptions opts;
934
+ opts.FinalEvents .emplace_back ([&delayedUpsertRows](IEventHandle&) {
935
+ return delayedUpsertRows.size () > 0 ;
936
+ });
937
+
938
+ runtime.SetObserverFunc (grab);
939
+
940
+ auto alterFuture = kikimr.RunInThreadPool ([&] { return session.ExecuteSchemeQuery (alterQuery).GetValueSync (); });
941
+
942
+ runtime.DispatchEvents (opts);
943
+ Y_VERIFY_S (delayedUpsertRows.size () > 0 , " no upload rows requests" );
944
+
945
+ fCompareTable (R"(
946
+ [
947
+ [1u;"Old"]
948
+ ]
949
+ )" );
950
+
951
+ enabledCapture = false ;
952
+ for (const auto & ev: delayedUpsertRows) {
953
+ runtime.Send (ev);
954
+ }
955
+
956
+ auto result = runtime.WaitFuture (alterFuture);
957
+ fCompareTable (R"(
958
+ [
959
+ [1u;"Old"]
960
+ ]
961
+ )" );
962
+
963
+ }
964
+
853
965
Y_UNIT_TEST (AddNonColumnDoesnotReturnInternalError) {
854
966
855
967
NKikimrConfig::TAppConfig appConfig;
0 commit comments