1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-07-29 08:21:15 +03:00

Merge pull request #1891 from mariadb-SergeyZefirov/MCOL-4673-Regression-calShowPartition-returns-NA

Mcol 4673 regression cal show partition returns na
This commit is contained in:
Roman Nozdrin
2021-05-24 12:10:55 +03:00
committed by GitHub
6 changed files with 54 additions and 24 deletions

View File

@ -430,14 +430,7 @@ CommandPackageProcessor::processPackage(dmlpackage::CalpontDMLPackage& cpackage)
if (!cpInvalidated) if (!cpInvalidated)
{ {
// The code below assumes that in case of COMMIT all ranges for all touched LBIDs fDbrm->invalidateUncommittedExtentLBIDs(0, &lbidList);
// are either correctly set or correctly reset.
// It is also assumes that ROLLBACK or other operations but COMMIT may not return ranges
// to state that is correct. This is why we invalidate extents when we are not committing.
if (stmt != "COMMIT")
{
fDbrm->invalidateUncommittedExtentLBIDs(0, &lbidList);
}
} }
} }
} }

View File

@ -1,7 +1,6 @@
# #
# MCOL-4614 calShowPartitions() precision loss for huge narrow decimal # MCOL-4614 calShowPartitions() precision loss for huge narrow decimal
# #
CREATE FUNCTION calshowpartitions RETURNS STRING SONAME "ha_columnstore.so";
CREATE TABLE t1 (a DECIMAL(17,1)) ENGINE=ColumnStore; CREATE TABLE t1 (a DECIMAL(17,1)) ENGINE=ColumnStore;
INSERT INTO t1 VALUES (-8999999999999999.9); INSERT INTO t1 VALUES (-8999999999999999.9);
SELECT * FROM t1 WHERE a=0; SELECT * FROM t1 WHERE a=0;
@ -11,4 +10,3 @@ calshowpartitions('t1','a')
Part# Min Max Status Part# Min Max Status
0.0.1 -8999999999999999.9 -8999999999999999.9 Enabled 0.0.1 -8999999999999999.9 -8999999999999999.9 Enabled
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
DROP FUNCTION calshowpartitions;

View File

@ -1,11 +1,16 @@
--source include/testdb_only.inc
--source ../include/have_columnstore.inc --source ../include/have_columnstore.inc
--echo # --echo #
--echo # MCOL-4614 calShowPartitions() precision loss for huge narrow decimal --echo # MCOL-4614 calShowPartitions() precision loss for huge narrow decimal
--echo # --echo #
CREATE FUNCTION calshowpartitions RETURNS STRING SONAME "ha_columnstore.so"; let $func_exists=`SELECT COUNT(*) FROM mysql.func WHERE name='calshowpartitions'`;
--disable_query_log
if (!$func_exists)
{
CREATE FUNCTION calshowpartitions RETURNS STRING SONAME "ha_columnstore.so";
}
--enable_query_log
CREATE TABLE t1 (a DECIMAL(17,1)) ENGINE=ColumnStore; CREATE TABLE t1 (a DECIMAL(17,1)) ENGINE=ColumnStore;
INSERT INTO t1 VALUES (-8999999999999999.9); INSERT INTO t1 VALUES (-8999999999999999.9);
@ -13,4 +18,9 @@ SELECT * FROM t1 WHERE a=0;
SELECT calshowpartitions('t1','a'); SELECT calshowpartitions('t1','a');
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
DROP FUNCTION calshowpartitions; --disable_query_log
if (!$func_exists)
{
DROP FUNCTION calshowpartitions;
}
--enable_query_log

View File

@ -146,8 +146,9 @@ typedef struct _SIDTIDEntry SIDTIDEntry;
// for multiple extents. // for multiple extents.
// Special seqNum field values. // Special seqNum field values.
#define SEQNUM_MARK_INVALID (-1) #define SEQNUM_MARK_INVALID (-1)
#define SEQNUM_MARK_INVALID_SET_RANGE (-2) #define SEQNUM_MARK_INVALID_SET_RANGE (-2)
#define SEQNUM_MARK_UPDATING_INVALID_SET_RANGE (-3)
// Used in vectors. // Used in vectors.
struct CPInfo struct CPInfo

View File

@ -4594,7 +4594,7 @@ void DBRM::invalidateUncommittedExtentLBIDs(execplan::CalpontSystemCatalog::SCN
aInfo.isBinaryColumn = false; aInfo.isBinaryColumn = false;
} }
aInfo.seqNum = SEQNUM_MARK_INVALID_SET_RANGE; aInfo.seqNum = SEQNUM_MARK_UPDATING_INVALID_SET_RANGE;
cpInfos.push_back(aInfo); cpInfos.push_back(aInfo);
} }

View File

@ -347,8 +347,16 @@ int ExtentMap::_markInvalid(const LBID_t lbid, const execplan::CalpontSystemCata
if (isUnsigned(colDataType)) if (isUnsigned(colDataType))
{ {
fExtentMap[i].partition.cprange.bigLoVal = -1; if (fExtentMap[i].colWid != datatypes::MAXDECIMALWIDTH)
fExtentMap[i].partition.cprange.bigHiVal = 0; {
fExtentMap[i].partition.cprange.loVal = numeric_limits<uint64_t>::max();
fExtentMap[i].partition.cprange.hiVal = numeric_limits<uint64_t>::min();
}
else
{
fExtentMap[i].partition.cprange.bigLoVal = -1; // XXX: unsigned wide decimals do not exceed rang of signed wide decimals.
fExtentMap[i].partition.cprange.bigHiVal = 0;
}
} }
else else
{ {
@ -704,6 +712,26 @@ void ExtentMap::setExtentsMaxMin(const CPMaxMinMap_t& cpMap, bool firstNode, boo
incSeqNum(fExtentMap[i].partition.cprange.sequenceNum); incSeqNum(fExtentMap[i].partition.cprange.sequenceNum);
extentsUpdated++; extentsUpdated++;
} }
else if (it->second.seqNum == SEQNUM_MARK_UPDATING_INVALID_SET_RANGE)
{
makeUndoRecord(&fExtentMap[i], sizeof(struct EMEntry));
if (fExtentMap[i].partition.cprange.isValid == CP_UPDATING)
{
if (it->second.isBinaryColumn)
{
fExtentMap[i].partition.cprange.bigHiVal = it->second.bigMax;
fExtentMap[i].partition.cprange.bigLoVal = it->second.bigMin;
}
else
{
fExtentMap[i].partition.cprange.hiVal = it->second.max;
fExtentMap[i].partition.cprange.loVal = it->second.min;
}
fExtentMap[i].partition.cprange.isValid = CP_INVALID;
}
incSeqNum(fExtentMap[i].partition.cprange.sequenceNum);
extentsUpdated++;
}
// else sequence has changed since start of the query. Don't update the EM entry. // else sequence has changed since start of the query. Don't update the EM entry.
else else
{ {
@ -725,14 +753,14 @@ void ExtentMap::setExtentsMaxMin(const CPMaxMinMap_t& cpMap, bool firstNode, boo
for (i = 0; i < entries; i++) for (i = 0; i < entries; i++)
{ {
if (fExtentMap[i].range.start == it->first) if (fExtentMap[i].range.start == it->first)
{ {
break; break;
} }
} }
if (i < entries) if (i < entries)
{ {
continue; continue;
} }
oss << " " << it->first; oss << " " << it->first;
} }