From ec91c2ec652cc36e8f387a235dd7d2f9f7e2b095 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 12 Feb 2025 15:47:03 +0000 Subject: [PATCH] [FTS] limit the number of primary key columns, whew alter table add primary key. --- src/rootserver/ob_ddl_service.cpp | 5 ++ .../r/mysql/alter_primary_key.result | 74 ++++++++++++++++ .../t/alter_primary_key.test | 86 ++++++++++++++++++- 3 files changed, 164 insertions(+), 1 deletion(-) diff --git a/src/rootserver/ob_ddl_service.cpp b/src/rootserver/ob_ddl_service.cpp index 0abf24feb3..42574ceb57 100755 --- a/src/rootserver/ob_ddl_service.cpp +++ b/src/rootserver/ob_ddl_service.cpp @@ -3591,6 +3591,11 @@ int ObDDLService::add_primary_key(const ObIArray &pk_column_names, ObT ObTableSchema::const_column_iterator tmp_begin = new_table_schema.column_begin(); ObTableSchema::const_column_iterator tmp_end = new_table_schema.column_end(); ObColumnSchemaV2 *del_hidden_pk_column = nullptr; + if (pk_column_names.count() > common::OB_USER_MAX_ROWKEY_COLUMN_NUMBER) { + ret = OB_ERR_TOO_MANY_ROWKEY_COLUMNS; + LOG_USER_ERROR(OB_ERR_TOO_MANY_ROWKEY_COLUMNS, OB_USER_MAX_ROWKEY_COLUMN_NUMBER); + LOG_WARN("too many rowkey columns", K(ret), K(pk_column_names.count())); + } for (; OB_SUCC(ret) && tmp_begin != tmp_end; tmp_begin++) { ObColumnSchemaV2 *col = (*tmp_begin); if (OB_ISNULL(col)) { diff --git a/tools/deploy/mysql_test/test_suite/table_redefinition/r/mysql/alter_primary_key.result b/tools/deploy/mysql_test/test_suite/table_redefinition/r/mysql/alter_primary_key.result index bddc217a8d..50329e1e53 100644 --- a/tools/deploy/mysql_test/test_suite/table_redefinition/r/mysql/alter_primary_key.result +++ b/tools/deploy/mysql_test/test_suite/table_redefinition/r/mysql/alter_primary_key.result @@ -57,3 +57,77 @@ ALTER TABLE Z0CASE DROP PRIMARY KEY, ADD PRIMARY KEY(C2, C3); ERROR HY000: 'Defining a generated column as primary key' is not supported for generated columns. ALTER TABLE Z0CASE DROP PRIMARY KEY, ADD PRIMARY KEY(C2, C1); DROP TABLE Z0CASE; +drop table if exists t_add_pk; +create table t_add_pk (col1 int, col2 int, col3 int, +col4 int, col5 int, col6 int, col7 int, col8 int, +col9 int, col10 int, col11 int, col12 int, col13 int, +col14 int, col15 int, col16 int, col17 int, col18 int, +col19 int, col20 int, col21 int, col22 int, col23 int, +col24 int, col25 int, col26 int, col27 int, col28 int, +col29 int, col30 int, col31 int, col32 int, col33 int, +col34 int, col35 int, col36 int, col37 int, col38 int, +col39 int, col40 int, col41 int, col42 int, col43 int, +col44 int, col45 int, col46 int, col47 int, col48 int, +col49 int, col50 int, col51 int, col52 int, col53 int, +col54 int, col55 int, col56 int, col57 int, col58 int, +col59 int, col60 int, col61 int, col62 int, col63 int, +col64 int, col65 int, +col varchar(20), +primary key ( +col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, +col11, col12, col13, col14, col15, col16, col17, col18, col19, col20, +col21, col22, col23, col24, col25, col26, col27, col28, col29, col30, +col31, col32, col33, col34, col35, col36, col37, col38, col39, col40, +col41, col42, col43, col44, col45, col46, col47, col48, col49, col50, +col51, col52, col53, col54, col55, col56, col57, col58, col59, col60, +col61, col62, col63, col64 +) +); +alter table t_add_pk drop primary key, add primary key ( +col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, +col11, col12, col13, col14, col15, col16, col17, col18, col19, col20, +col21, col22, col23, col24, col25, col26, col27, col28, col29, col30, +col31, col32, col33, col34, col35, col36, col37, col38, col39, col40, +col41, col42, col43, col44, col45, col46, col47, col48, col49, col50, +col51, col52, col53, col54, col55, col56, col57, col58, col59, col60, +col61, col62, col63, col64, col65 +); +ERROR 42000: Too many key parts specified; max 64 parts allowed +alter table t_add_pk drop primary key; +alter table t_add_pk add primary key ( +col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, +col11, col12, col13, col14, col15, col16, col17, col18, col19, col20, +col21, col22, col23, col24, col25, col26, col27, col28, col29, col30, +col31, col32, col33, col34, col35, col36, col37, col38, col39, col40, +col41, col42, col43, col44, col45, col46, col47, col48, col49, col50, +col51, col52, col53, col54, col55, col56, col57, col58, col59, col60, +col61, col62, col63, col64, col65 +); +ERROR 42000: Too many key parts specified; max 64 parts allowed +drop table if exists t_with_pk; +create table t_with_pk (col1 int, col2 int, col3 int, +col4 int, col5 int, col6 int, col7 int, col8 int, +col9 int, col10 int, col11 int, col12 int, col13 int, +col14 int, col15 int, col16 int, col17 int, col18 int, +col19 int, col20 int, col21 int, col22 int, col23 int, +col24 int, col25 int, col26 int, col27 int, col28 int, +col29 int, col30 int, col31 int, col32 int, col33 int, +col34 int, col35 int, col36 int, col37 int, col38 int, +col39 int, col40 int, col41 int, col42 int, col43 int, +col44 int, col45 int, col46 int, col47 int, col48 int, +col49 int, col50 int, col51 int, col52 int, col53 int, +col54 int, col55 int, col56 int, col57 int, col58 int, +col59 int, col60 int, col61 int, col62 int, col63 int, +col64 int, col65 int, +col varchar(20), +primary key ( +col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, +col11, col12, col13, col14, col15, col16, col17, col18, col19, col20, +col21, col22, col23, col24, col25, col26, col27, col28, col29, col30, +col31, col32, col33, col34, col35, col36, col37, col38, col39, col40, +col41, col42, col43, col44, col45, col46, col47, col48, col49, col50, +col51, col52, col53, col54, col55, col56, col57, col58, col59, col60, +col61, col62, col63, col64, col65 +) +); +ERROR 42000: Too many key parts specified; max 64 parts allowed diff --git a/tools/deploy/mysql_test/test_suite/table_redefinition/t/alter_primary_key.test b/tools/deploy/mysql_test/test_suite/table_redefinition/t/alter_primary_key.test index f5d18d1a89..658bd472a2 100644 --- a/tools/deploy/mysql_test/test_suite/table_redefinition/t/alter_primary_key.test +++ b/tools/deploy/mysql_test/test_suite/table_redefinition/t/alter_primary_key.test @@ -77,4 +77,88 @@ CREATE TABLE Z0CASE(C1 CHAR(10), C2 INT, C3 INT GENERATED ALWAYS AS (C2+1) STORE --error 3106 ALTER TABLE Z0CASE DROP PRIMARY KEY, ADD PRIMARY KEY(C2, C3); ALTER TABLE Z0CASE DROP PRIMARY KEY, ADD PRIMARY KEY(C2, C1); -DROP TABLE Z0CASE; \ No newline at end of file +DROP TABLE Z0CASE; + +# test add pk, and the column numbers of the pk overtake OB_USER_MAX_ROWKEY_COLUMN_NUMBER +--disable_warnings +drop table if exists t_add_pk; +--enable_warnings +create table t_add_pk (col1 int, col2 int, col3 int, +col4 int, col5 int, col6 int, col7 int, col8 int, +col9 int, col10 int, col11 int, col12 int, col13 int, +col14 int, col15 int, col16 int, col17 int, col18 int, +col19 int, col20 int, col21 int, col22 int, col23 int, +col24 int, col25 int, col26 int, col27 int, col28 int, +col29 int, col30 int, col31 int, col32 int, col33 int, +col34 int, col35 int, col36 int, col37 int, col38 int, +col39 int, col40 int, col41 int, col42 int, col43 int, +col44 int, col45 int, col46 int, col47 int, col48 int, +col49 int, col50 int, col51 int, col52 int, col53 int, +col54 int, col55 int, col56 int, col57 int, col58 int, +col59 int, col60 int, col61 int, col62 int, col63 int, +col64 int, col65 int, +col varchar(20), +primary key ( + col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, + col11, col12, col13, col14, col15, col16, col17, col18, col19, col20, + col21, col22, col23, col24, col25, col26, col27, col28, col29, col30, + col31, col32, col33, col34, col35, col36, col37, col38, col39, col40, + col41, col42, col43, col44, col45, col46, col47, col48, col49, col50, + col51, col52, col53, col54, col55, col56, col57, col58, col59, col60, + col61, col62, col63, col64 +) +); + +--error 1070 +alter table t_add_pk drop primary key, add primary key ( + col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, + col11, col12, col13, col14, col15, col16, col17, col18, col19, col20, + col21, col22, col23, col24, col25, col26, col27, col28, col29, col30, + col31, col32, col33, col34, col35, col36, col37, col38, col39, col40, + col41, col42, col43, col44, col45, col46, col47, col48, col49, col50, + col51, col52, col53, col54, col55, col56, col57, col58, col59, col60, + col61, col62, col63, col64, col65 +); + +alter table t_add_pk drop primary key; +--error 1070 +alter table t_add_pk add primary key ( + col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, + col11, col12, col13, col14, col15, col16, col17, col18, col19, col20, + col21, col22, col23, col24, col25, col26, col27, col28, col29, col30, + col31, col32, col33, col34, col35, col36, col37, col38, col39, col40, + col41, col42, col43, col44, col45, col46, col47, col48, col49, col50, + col51, col52, col53, col54, col55, col56, col57, col58, col59, col60, + col61, col62, col63, col64, col65 +); + +--disable_warnings +drop table if exists t_with_pk; +--enable_warnings + +--error 1070 +create table t_with_pk (col1 int, col2 int, col3 int, +col4 int, col5 int, col6 int, col7 int, col8 int, +col9 int, col10 int, col11 int, col12 int, col13 int, +col14 int, col15 int, col16 int, col17 int, col18 int, +col19 int, col20 int, col21 int, col22 int, col23 int, +col24 int, col25 int, col26 int, col27 int, col28 int, +col29 int, col30 int, col31 int, col32 int, col33 int, +col34 int, col35 int, col36 int, col37 int, col38 int, +col39 int, col40 int, col41 int, col42 int, col43 int, +col44 int, col45 int, col46 int, col47 int, col48 int, +col49 int, col50 int, col51 int, col52 int, col53 int, +col54 int, col55 int, col56 int, col57 int, col58 int, +col59 int, col60 int, col61 int, col62 int, col63 int, +col64 int, col65 int, +col varchar(20), +primary key ( + col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, + col11, col12, col13, col14, col15, col16, col17, col18, col19, col20, + col21, col22, col23, col24, col25, col26, col27, col28, col29, col30, + col31, col32, col33, col34, col35, col36, col37, col38, col39, col40, + col41, col42, col43, col44, col45, col46, col47, col48, col49, col50, + col51, col52, col53, col54, col55, col56, col57, col58, col59, col60, + col61, col62, col63, col64, col65 +) +); \ No newline at end of file