Repository: incubator-trafodion Updated Branches: refs/heads/master c22962ca0 -> 5ee3cb396
[TRAFODION-2131] Fix USTATS cores + some other issues Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/ea655127 Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/ea655127 Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/ea655127 Branch: refs/heads/master Commit: ea655127dbbce1447cae5e27664fd44252c7c5b8 Parents: 5cc5945 Author: Dave Birdsall <[email protected]> Authored: Thu Jul 28 21:05:43 2016 +0000 Committer: Dave Birdsall <[email protected]> Committed: Thu Jul 28 21:05:43 2016 +0000 ---------------------------------------------------------------------- core/sql/generator/GenExpGenerator.cpp | 34 ++++++++++++++++++++--------- core/sql/ustat/hs_cli.cpp | 5 +++++ core/sql/ustat/hs_globals.cpp | 32 +++++++++++++++++++++++++++ core/sql/ustat/hs_update.cpp | 14 ++++++++++++ 4 files changed, 75 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/ea655127/core/sql/generator/GenExpGenerator.cpp ---------------------------------------------------------------------- diff --git a/core/sql/generator/GenExpGenerator.cpp b/core/sql/generator/GenExpGenerator.cpp index bfdc65a..2be4c8b 100644 --- a/core/sql/generator/GenExpGenerator.cpp +++ b/core/sql/generator/GenExpGenerator.cpp @@ -848,19 +848,33 @@ short ExpGenerator::handleUnsupportedCast(Cast * castNode) if ((srcFsType == REC_BIN8_SIGNED) || (srcFsType == REC_BIN8_UNSIGNED) || (tgtFsType == REC_BIN8_SIGNED) || - (tgtFsType == REC_BIN8_UNSIGNED)) + (tgtFsType == REC_BIN8_UNSIGNED) || + (DFS2REC::isInterval(srcFsType)) || + (DFS2REC::isInterval(tgtFsType))) { // add a Cast node to convert from/to tinyint to/from small int. - const NumericType &srcNum = (NumericType&)srcNAType; - NumericType * newType; - if (srcNum.getScale() == 0) - newType = new (generator->wHeap()) - SQLSmall(NOT srcNum.isUnsigned(), - srcNAType.supportsSQLnull()); + NumericType * newType = NULL; + if (DFS2REC::isInterval(srcFsType)) + { + const IntervalType &srcInt = (IntervalType&)srcNAType; + newType = new (generator->wHeap()) + SQLNumeric(sizeof(short), srcInt.getTotalPrecision(), + srcInt.getFractionPrecision(), + TRUE, srcNAType.supportsSQLnull()); + } else - newType = new (generator->wHeap()) - SQLNumeric(sizeof(short), srcNum.getPrecision(), srcNum.getScale(), - NOT srcNum.isUnsigned(), srcNAType.supportsSQLnull()); + { + const NumericType &srcNum = (NumericType&)srcNAType; + if (srcNum.getScale() == 0) + newType = new (generator->wHeap()) + SQLSmall(NOT srcNum.isUnsigned(), + srcNAType.supportsSQLnull()); + else + newType = new (generator->wHeap()) + SQLNumeric(sizeof(short), srcNum.getPrecision(), srcNum.getScale(), + NOT srcNum.isUnsigned(), srcNAType.supportsSQLnull()); + } + ItemExpr * newChild = new (generator->wHeap()) Cast(castNode->child(0), newType); http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/ea655127/core/sql/ustat/hs_cli.cpp ---------------------------------------------------------------------- diff --git a/core/sql/ustat/hs_cli.cpp b/core/sql/ustat/hs_cli.cpp index d65eb0e..9e19a63 100644 --- a/core/sql/ustat/hs_cli.cpp +++ b/core/sql/ustat/hs_cli.cpp @@ -50,6 +50,7 @@ #include "CharType.h" #include "DatetimeType.h" #include "IntervalType.h" +#include "MiscType.h" #include "Int64.h" #include "cli_stdh.h" #include "sql_id.h" @@ -3375,6 +3376,10 @@ Lng32 HSCursor::buildNAType() break; + case REC_BOOLEAN: + type = new(heap_) SQLBooleanNative(nullflag,heap_); + break; + default: HSFuncMergeDiags(- UERR_UNSUPPORTED_DATATYPE); retcode_ = -1; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/ea655127/core/sql/ustat/hs_globals.cpp ---------------------------------------------------------------------- diff --git a/core/sql/ustat/hs_globals.cpp b/core/sql/ustat/hs_globals.cpp index 32654db..aa1c860 100644 --- a/core/sql/ustat/hs_globals.cpp +++ b/core/sql/ustat/hs_globals.cpp @@ -291,6 +291,7 @@ Lng32 MCWrapper::setupMCColumnIterator (HSColGroupStruct *group, MCIterator** it iter[currentLoc] = new (STMTHEAP) MCNonCharIterator<char>((char *)group->mcis_data); break; + case REC_BOOLEAN: case REC_BIN8_UNSIGNED: iter[currentLoc] = new (STMTHEAP) MCNonCharIterator<unsigned char>((unsigned char *)group->mcis_data); break; @@ -4867,6 +4868,7 @@ void HSGlobalsClass::getMemoryRequirementsForOneGroup(HSColGroupStruct* group, I switch (group->ISdatatype) { + case REC_BOOLEAN: case REC_BIN8_SIGNED: case REC_BIN8_UNSIGNED: elementSize = 1; @@ -7067,6 +7069,7 @@ Int32 HSGlobalsClass::processIUSColumn(HSColGroupStruct* smplGroup, case REC_BIN8_SIGNED: return processIUSColumn((Int8*)smplGroup->data, L"%hd", smplGroup, delGroup, insGroup); break; + case REC_BOOLEAN: case REC_BIN8_UNSIGNED: return processIUSColumn((UInt8*)smplGroup->data, L"%hu", smplGroup, delGroup, insGroup); break; @@ -10048,6 +10051,7 @@ Lng32 HSGlobalsClass::processInternalSortNulls(Lng32 rowsRead, HSColGroupStruct processNullsForColumn(group, rowsRead, (Int8*)NULL); break; + case REC_BOOLEAN: case REC_BIN8_UNSIGNED: processNullsForColumn(group, rowsRead, (UInt8*)NULL); break; @@ -10219,6 +10223,7 @@ bool isInternalSortType(HSColumnStruct &col) switch (col.datatype) { + case REC_BOOLEAN: case REC_BIN8_SIGNED: case REC_BIN8_UNSIGNED: case REC_BIN16_SIGNED: @@ -10937,6 +10942,7 @@ Lng32 doSort(HSColGroupStruct *group) (Int8*)group->nextData - (Int8*)group->data - 1); break; + case REC_BOOLEAN: case REC_BIN8_UNSIGNED: quicksort((UInt8*)group->data, 0, (UInt8*)group->nextData - (UInt8*)group->data - 1); @@ -11431,6 +11437,7 @@ Lng32 HSGlobalsClass::createStatsForColumn(HSColGroupStruct *group, Int64 rowsAl createHistogram(group, intCount, sampleRowCount, samplingUsed, (Int8*)NULL); break; + case REC_BOOLEAN: case REC_BIN8_UNSIGNED: createHistogram(group, intCount, sampleRowCount, samplingUsed, (UInt8*)NULL); break; @@ -12692,6 +12699,7 @@ Lng32 HSGlobalsClass::mergeDatasetsForIUS( return mergeDatasetsForIUS((Int8*)smplGroup->data, (Int8*)NULL, smplGroup, smplrows, delGroup, delrows, insGroup, insrows); break; + case REC_BOOLEAN: case REC_BIN8_UNSIGNED: return mergeDatasetsForIUS((UInt8*)smplGroup->data, (UInt8*)NULL, smplGroup, smplrows, delGroup, delrows, insGroup, insrows); @@ -13350,6 +13358,15 @@ Int32 copyValue(Int64 value, char *valueBuff, const HSColumnStruct &colDesc, sho (Int32)(value % 60)); // seconds break; + case REC_BOOLEAN: + { + if (value) + strcpy(valueBuff,"TRUE"); + else + strcpy(valueBuff,"FALSE"); + } + break; + #pragma warning(default:4146) // LCOV_EXCL_START :rfi @@ -13657,6 +13674,7 @@ Lng32 setBufferValue(MCWrapper& value, case REC_BIN8_SIGNED: retcode = copyValue(*((MCNonCharIterator<Int8>*)(value.allCols_[i]))->getContent(value.index_), valueBuff, mgroup->colSet[i], len); break; + case REC_BOOLEAN: case REC_BIN8_UNSIGNED: retcode = copyValue(*((MCNonCharIterator<UInt8>*)(value.allCols_[i]))->getContent(value.index_), valueBuff, mgroup->colSet[i], len); break; @@ -15035,6 +15053,19 @@ NAString HSColGroupStruct::generateTextForColumnCast() if(isMCGroup) textForColumnCast.append(replaceFuncLastPart); } + else if (colSet[i].datatype == REC_BOOLEAN) + { + // CAST of boolean to VARCHAR UCS2 isn't supported in the + // engine yet (you get error 8414 at run-time if you try it), + // so work around this by CASTing to ISO88591 then CASTing + // to UCS2. Once the engine supports this cast we can + // delete this code and just use the "else" case below. + textForColumnCast.append("TRIM(TRAILING FROM CAST (CAST ("); + textForColumnCast.append(columnName.data()); + textForColumnCast.append(" AS CHAR(10)) AS VARCHAR("); + textForColumnCast.append(LongToNAString(maxCharBoundaryLen)); + textForColumnCast.append(") CHARACTER SET UCS2))"); + } else { //CAST ALL OTHER DATATYPES TO UNICODE @@ -15514,6 +15545,7 @@ Lng32 HSGlobalsClass::processFastStatsBatch(CollIndex numCols, HSColGroupStruct* group->fastStatsHist = new(STMTHEAP) FastStatsHist<Int8>(group, cbf); break; + case REC_BOOLEAN: case REC_BIN8_UNSIGNED: group->fastStatsHist = new(STMTHEAP) FastStatsHist<UInt8>(group, cbf); break; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/ea655127/core/sql/ustat/hs_update.cpp ---------------------------------------------------------------------- diff --git a/core/sql/ustat/hs_update.cpp b/core/sql/ustat/hs_update.cpp index 29f054b..e8ca28e 100644 --- a/core/sql/ustat/hs_update.cpp +++ b/core/sql/ustat/hs_update.cpp @@ -294,6 +294,20 @@ Lng32 UpdateStats(char *input, NABoolean requestedByCompiler) retcode = HSFuncExecQuery("CONTROL QUERY DEFAULT WMS_QUERY_MONITORING 'ON'"); HSExitIfError(retcode); } + + // Set some CQDs to allow us to process TINYINT, BOOLEAN and LARGEINT UNSIGNED + // columns correctly. Without these, when we read data into memory for internal + // sort, there is a mismatch between how much space we think a column value will + // take and how much the Executor expects, and we get buffer overruns. (See + // JIRA TRAFODION-2131.) Someday all clients will support these datatypes and + // these CQDs can go away. + retcode = HSFuncExecQuery("CONTROL QUERY DEFAULT TRAF_TINYINT_RETURN_VALUES 'ON'"); + HSExitIfError(retcode); + retcode = HSFuncExecQuery("CONTROL QUERY DEFAULT TRAF_BOOLEAN_IO 'ON'"); + HSExitIfError(retcode); + retcode = HSFuncExecQuery("CONTROL QUERY DEFAULT TRAF_LARGEINT_UNSIGNED_IO 'ON'"); + HSExitIfError(retcode); + LM->StopTimer(); LM->StartTimer("Parse statement");
