diff --git a/build/bootstrap_mcs.sh b/build/bootstrap_mcs.sh index 7ba080db3..b84eefe87 100755 --- a/build/bootstrap_mcs.sh +++ b/build/bootstrap_mcs.sh @@ -372,7 +372,7 @@ run_unit_tests() else message "Running unittests" cd $MARIA_BUILD_PATH - ${CTEST_BIN_NAME} . -R columnstore: -j $(nproc) --progress + ${CTEST_BIN_NAME} . -R columnstore: -j $(nproc) --progress --output-on-failure cd - > /dev/null fi } diff --git a/dbcon/ddlpackageproc/altertableprocessor.cpp b/dbcon/ddlpackageproc/altertableprocessor.cpp index 8c0dd0231..107b2409b 100644 --- a/dbcon/ddlpackageproc/altertableprocessor.cpp +++ b/dbcon/ddlpackageproc/altertableprocessor.cpp @@ -45,6 +45,8 @@ using namespace ddlpackage; #include "messagelog.h" using namespace logging; +#include "mariadb_my_sys.h" + #include "we_messages.h" #include "we_ddlcommandclient.h" #include "we_ddlcommon.h" @@ -88,6 +90,14 @@ struct extentInfo namespace { + +bool checkTextTypesLengthAreEqual(const CalpontSystemCatalog::ColType& colType, const ColumnType& newType) +{ + auto newTypeCharset = get_charset(newType.fCharsetNum, MYF(MY_WME)); + auto bytesInChar = newTypeCharset ? newTypeCharset->mbmaxlen : colType.getCharset()->mbmaxlen; + return colType.colWidth == newType.fLength * bytesInChar; +} + bool typesAreSame(const CalpontSystemCatalog::ColType& colType, const ColumnType& newType) { switch (colType.colDataType) @@ -117,7 +127,7 @@ bool typesAreSame(const CalpontSystemCatalog::ColType& colType, const ColumnType break; case (CalpontSystemCatalog::CHAR): - if (newType.fType == DDL_CHAR && colType.colWidth == newType.fLength) + if (newType.fType == DDL_CHAR && checkTextTypesLengthAreEqual(colType, newType)) return true; break; @@ -252,7 +262,7 @@ bool typesAreSame(const CalpontSystemCatalog::ColType& colType, const ColumnType break; case (CalpontSystemCatalog::VARCHAR): - if (newType.fType == DDL_VARCHAR && colType.colWidth == newType.fLength) + if (newType.fType == DDL_VARCHAR && checkTextTypesLengthAreEqual(colType, newType)) return true; break; @@ -738,8 +748,7 @@ void AlterTableProcessor::addColumn(uint32_t sessionID, execplan::CalpontSystemC if ((dataType == CalpontSystemCatalog::CHAR && columnDefPtr->fType->fLength > 8) || (dataType == CalpontSystemCatalog::VARCHAR && columnDefPtr->fType->fLength > 7) || (dataType == CalpontSystemCatalog::VARBINARY && columnDefPtr->fType->fLength > 7) || - (dataType == CalpontSystemCatalog::TEXT) || - (dataType == CalpontSystemCatalog::BLOB)) + (dataType == CalpontSystemCatalog::TEXT) || (dataType == CalpontSystemCatalog::BLOB)) { isDict = true; } diff --git a/dbcon/execplan/calpontsystemcatalog.cpp b/dbcon/execplan/calpontsystemcatalog.cpp index 53294ccc1..699a6618b 100644 --- a/dbcon/execplan/calpontsystemcatalog.cpp +++ b/dbcon/execplan/calpontsystemcatalog.cpp @@ -6192,7 +6192,7 @@ CalpontSystemCatalog::ColType& CalpontSystemCatalog::ColType::operator=(const Co return *this; } -CHARSET_INFO* CalpontSystemCatalog::ColType::getCharset() +CHARSET_INFO* CalpontSystemCatalog::ColType::getCharset() const { if (!cs) cs = &datatypes::Charset(charsetNumber).getCharset(); diff --git a/dbcon/execplan/calpontsystemcatalog.h b/dbcon/execplan/calpontsystemcatalog.h index bbce5ef3f..79a78654d 100644 --- a/dbcon/execplan/calpontsystemcatalog.h +++ b/dbcon/execplan/calpontsystemcatalog.h @@ -224,7 +224,7 @@ class CalpontSystemCatalog : public datatypes::SystemCatalog bool autoincrement = 0; // set to true if SYSCOLUMN autoincrement is �y� uint64_t nextvalue = 0; // next autoincrement value uint32_t charsetNumber = default_charset_info->number; - const CHARSET_INFO* cs = nullptr; + const mutable CHARSET_INFO* cs = nullptr; private: long timeZone; @@ -237,7 +237,7 @@ class CalpontSystemCatalog : public datatypes::SystemCatalog int32_t compressionType_, OID columnOID_, const ColDataType& colDataType_); ColType& operator=(const ColType& rhs); - CHARSET_INFO* getCharset(); + CHARSET_INFO* getCharset() const; long getTimeZone() const { diff --git a/mysql-test/columnstore/bugfixes/mcol-5779.result b/mysql-test/columnstore/bugfixes/mcol-5779.result new file mode 100644 index 000000000..efd4b8b85 --- /dev/null +++ b/mysql-test/columnstore/bugfixes/mcol-5779.result @@ -0,0 +1,28 @@ +DROP DATABASE IF EXISTS mcol5779; +CREATE DATABASE mcol5779; +USE mcol5779; +CREATE TABLE `t1` ( +`id` int(11) DEFAULT NULL, +`name1` char(10) DEFAULT NULL COMMENT 'test name', +`name2` varchar(100) DEFAULT NULL COMMENT 'test name', +`name3` text DEFAULT NULL COMMENT 'test name' +) ENGINE=Columnstore DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; +ALTER TABLE t1 CHANGE COLUMN id id1 INT; +ALTER TABLE t1 CHANGE COLUMN id1 id INT COMMENT 'new comment'; +ALTER TABLE t1 CHANGE COLUMN name1 firstname char(10); +ALTER TABLE t1 CHANGE COLUMN firstname firstname char(10) COMMENT 'new comment'; +ALTER TABLE t1 CHANGE COLUMN name2 lastname varchar(100); +ALTER TABLE t1 CHANGE COLUMN lastname lastname varchar(100) COMMENT 'new comment'; +ALTER TABLE t1 CHANGE COLUMN name3 surname text; +ALTER TABLE t1 CHANGE COLUMN surname surname text COMMENT 'new comment'; +CREATE TABLE `t2` ( +`name4` varchar(2666) DEFAULT NULL COMMENT 'test name' +) ENGINE=Columnstore DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; +ALTER TABLE t2 CHANGE COLUMN name4 pseudoname varchar(2666); +ALTER TABLE t2 CHANGE COLUMN pseudoname pseudoname varchar(2666) COMMENT 'new comment'; +CREATE TABLE `t3` ( +`name4` varchar(8000) DEFAULT NULL COMMENT 'test name' +) ENGINE=Columnstore DEFAULT CHARSET=latin1; +ALTER TABLE t3 CHANGE COLUMN name4 pseudoname varchar(8000); +ALTER TABLE t3 CHANGE COLUMN pseudoname pseudoname varchar(8000) COMMENT 'new comment'; +DROP DATABASE mcol5779; diff --git a/mysql-test/columnstore/bugfixes/mcol-5779.test b/mysql-test/columnstore/bugfixes/mcol-5779.test new file mode 100644 index 000000000..66a3a4044 --- /dev/null +++ b/mysql-test/columnstore/bugfixes/mcol-5779.test @@ -0,0 +1,48 @@ +--source ../include/have_columnstore.inc + +--disable_warnings +DROP DATABASE IF EXISTS mcol5779; +--enable_warnings + +CREATE DATABASE mcol5779; +USE mcol5779; + + +CREATE TABLE `t1` ( + `id` int(11) DEFAULT NULL, + `name1` char(10) DEFAULT NULL COMMENT 'test name', + `name2` varchar(100) DEFAULT NULL COMMENT 'test name', + `name3` text DEFAULT NULL COMMENT 'test name' +) ENGINE=Columnstore DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; + +ALTER TABLE t1 CHANGE COLUMN id id1 INT; +ALTER TABLE t1 CHANGE COLUMN id1 id INT COMMENT 'new comment'; + +ALTER TABLE t1 CHANGE COLUMN name1 firstname char(10); +ALTER TABLE t1 CHANGE COLUMN firstname firstname char(10) COMMENT 'new comment'; + +ALTER TABLE t1 CHANGE COLUMN name2 lastname varchar(100); +ALTER TABLE t1 CHANGE COLUMN lastname lastname varchar(100) COMMENT 'new comment'; + +ALTER TABLE t1 CHANGE COLUMN name3 surname text; +ALTER TABLE t1 CHANGE COLUMN surname surname text COMMENT 'new comment'; + + +CREATE TABLE `t2` ( + `name4` varchar(2666) DEFAULT NULL COMMENT 'test name' +) ENGINE=Columnstore DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; + + +ALTER TABLE t2 CHANGE COLUMN name4 pseudoname varchar(2666); +ALTER TABLE t2 CHANGE COLUMN pseudoname pseudoname varchar(2666) COMMENT 'new comment'; + +CREATE TABLE `t3` ( + `name4` varchar(8000) DEFAULT NULL COMMENT 'test name' +) ENGINE=Columnstore DEFAULT CHARSET=latin1; + + +ALTER TABLE t3 CHANGE COLUMN name4 pseudoname varchar(8000); +ALTER TABLE t3 CHANGE COLUMN pseudoname pseudoname varchar(8000) COMMENT 'new comment'; + +DROP DATABASE mcol5779; +