@@ -850,6 +850,118 @@ Y_UNIT_TEST_SUITE(KqpConstraints) {
850850
851851 }
852852
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+
853965 Y_UNIT_TEST (AddNonColumnDoesnotReturnInternalError) {
854966
855967 NKikimrConfig::TAppConfig appConfig;
0 commit comments