@@ -2382,6 +2382,113 @@ Y_UNIT_TEST_SUITE(KqpScheme) {
23822382 AlterTableAddIndex (EIndexTypeSql::GlobalAsync);
23832383 }
23842384
2385+ Y_UNIT_TEST (AlterTableAlterIndex) {
2386+ TKikimrRunner kikimr;
2387+ auto db = kikimr.GetTableClient ();
2388+ auto session = db.CreateSession ().GetValueSync ().GetSession ();
2389+ CreateSampleTablesWithIndex (session);
2390+
2391+ constexpr int minPartitionsCount = 10 ;
2392+ {
2393+ auto result = session.ExecuteSchemeQuery (Sprintf (R"(
2394+ ALTER TABLE `/Root/SecondaryKeys` ALTER INDEX Index SET AUTO_PARTITIONING_MIN_PARTITIONS_COUNT %d;
2395+ )" , minPartitionsCount
2396+ )
2397+ ).ExtractValueSync ();
2398+ UNIT_ASSERT_C (result.IsSuccess (), result.GetIssues ().ToString ());
2399+ }
2400+ {
2401+ auto describe = session.DescribeTable (" /Root/SecondaryKeys/Index/indexImplTable" ).GetValueSync ();
2402+ UNIT_ASSERT_C (describe.IsSuccess (), describe.GetIssues ().ToString ());
2403+ auto indexDesc = describe.GetTableDescription ();
2404+ UNIT_ASSERT_VALUES_EQUAL (indexDesc.GetPartitioningSettings ().GetMinPartitionsCount (), minPartitionsCount);
2405+ }
2406+ }
2407+
2408+ Y_UNIT_TEST (AlterIndexImplTable) {
2409+ TKikimrRunner kikimr;
2410+ auto db = kikimr.GetTableClient ();
2411+ auto session = db.CreateSession ().GetValueSync ().GetSession ();
2412+ CreateSampleTablesWithIndex (session);
2413+
2414+ constexpr int minPartitionsCount = 10 ;
2415+ {
2416+ auto result = session.ExecuteSchemeQuery (Sprintf (R"(
2417+ ALTER TABLE `/Root/SecondaryKeys/Index/indexImplTable` SET AUTO_PARTITIONING_MIN_PARTITIONS_COUNT %d;
2418+ )" , minPartitionsCount
2419+ )
2420+ ).ExtractValueSync ();
2421+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SCHEME_ERROR, result.GetIssues ().ToString ());
2422+ UNIT_ASSERT_STRING_CONTAINS (result.GetIssues ().ToString (),
2423+ " Error: Cannot find table 'db.[/Root/SecondaryKeys/Index/indexImplTable]' because it does not exist or you do not have access permissions."
2424+ );
2425+ }
2426+ }
2427+
2428+ Y_UNIT_TEST (AlterIndexImplTableUsingPublicAPI) {
2429+ TKikimrRunner kikimr;
2430+ auto adminSession = kikimr.GetTableClient ().CreateSession ().GetValueSync ().GetSession ();
2431+ CreateSampleTablesWithIndex (adminSession);
2432+
2433+ auto grantPermissions = [&adminSession](const char * permissions, const char * path, const char * user) {
2434+ auto grantQuery = Sprintf (R"(
2435+ GRANT %s ON `%s` TO `%s`;
2436+ )" ,
2437+ permissions, path, user
2438+ );
2439+ auto result = adminSession.ExecuteSchemeQuery (grantQuery).ExtractValueSync ();
2440+ UNIT_ASSERT_C (result.IsSuccess (), result.GetIssues ().ToString ());
2441+ };
2442+
2443+ // a user which does not have any implicit permissions
2444+ auto userClient = NYdb::NTable::TTableClient (kikimr.GetDriver (), NYdb::NTable::TClientSettings ()
2445+ .AuthToken (" user@builtin" )
2446+ );
2447+ auto userSession = userClient.CreateSession ().GetValueSync ().GetSession ();
2448+
2449+ constexpr int minPartitionsCount = 10 ;
2450+ auto tableSettings = NYdb::NTable::TAlterTableSettings ()
2451+ .BeginAlterPartitioningSettings ()
2452+ .SetMinPartitionsCount (minPartitionsCount)
2453+ .EndAlterPartitioningSettings ();
2454+
2455+ // try altering indexImplTable without ALTER SCHEMA permission
2456+ {
2457+ auto result = userSession.AlterTable (" /Root/SecondaryKeys/Index/indexImplTable" , tableSettings).ExtractValueSync ();
2458+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::UNAUTHORIZED, result.GetIssues ().ToString ());
2459+ UNIT_ASSERT_STRING_CONTAINS (result.GetIssues ().ToString (),
2460+ " Error: Access denied for user@builtin to path Root/SecondaryKeys/Index/indexImplTable"
2461+ );
2462+ }
2463+ // grant necessary permission
2464+ {
2465+ grantPermissions (" ALTER SCHEMA" , " /Root/SecondaryKeys" , " user@builtin" );
2466+ auto result = userSession.AlterTable (" /Root/SecondaryKeys/Index/indexImplTable" , tableSettings).ExtractValueSync ();
2467+ UNIT_ASSERT_C (result.IsSuccess (), result.GetIssues ().ToString ());
2468+ }
2469+ // check result
2470+ {
2471+ grantPermissions (" DESCRIBE SCHEMA" , " /Root/SecondaryKeys" , " user@builtin" );
2472+ auto describe = userSession.DescribeTable (" /Root/SecondaryKeys/Index/indexImplTable" ).ExtractValueSync ();
2473+ UNIT_ASSERT_C (describe.IsSuccess (), describe.GetIssues ().ToString ());
2474+ auto indexDesc = describe.GetTableDescription ();
2475+ UNIT_ASSERT_VALUES_EQUAL (indexDesc.GetPartitioningSettings ().GetMinPartitionsCount (), minPartitionsCount);
2476+ }
2477+
2478+ // try altering non-partitioning setting of indexImplTable as non-superuser
2479+ auto forbiddenSettings = NYdb::NTable::TAlterTableSettings ().SetCompactionPolicy (" default" );
2480+ {
2481+ auto result = userSession.AlterTable (" /Root/SecondaryKeys/Index/indexImplTable" , forbiddenSettings).ExtractValueSync ();
2482+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SCHEME_ERROR, result.GetIssues ().ToString ());
2483+ }
2484+ // become superuser
2485+ {
2486+ kikimr.GetTestServer ().GetRuntime ()->GetAppData ().AdministrationAllowedSIDs .emplace_back (" user@builtin" );
2487+ auto result = userSession.AlterTable (" /Root/SecondaryKeys/Index/indexImplTable" , forbiddenSettings).ExtractValueSync ();
2488+ UNIT_ASSERT_C (result.IsSuccess (), result.GetIssues ().ToString ());
2489+ }
2490+ }
2491+
23852492 Y_UNIT_TEST (AlterTableRenameIndex) {
23862493 TKikimrRunner kikimr;
23872494 auto db = kikimr.GetTableClient ();
0 commit comments