Repository: incubator-trafodion Updated Branches: refs/heads/master ea6a93355 -> 2980764ae
[TRAFODION-1676] rework, fix executor regression test022 failures Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/758bc382 Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/758bc382 Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/758bc382 Branch: refs/heads/master Commit: 758bc3828fadcb01633b3ac84d36ba9ead2599bf Parents: 5d06605 Author: Liu Ming <[email protected]> Authored: Thu Sep 1 14:35:49 2016 +0000 Committer: Liu Ming <[email protected]> Committed: Thu Sep 1 14:35:49 2016 +0000 ---------------------------------------------------------------------- core/sql/exp/exp_datetime.cpp | 197 ++++++-------------------- core/sql/optimizer/BindRelExpr.cpp | 6 +- core/sql/regress/executor/EXPECTED022.SB | 8 +- 3 files changed, 52 insertions(+), 159 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/758bc382/core/sql/exp/exp_datetime.cpp ---------------------------------------------------------------------- diff --git a/core/sql/exp/exp_datetime.cpp b/core/sql/exp/exp_datetime.cpp index 1df4ca7..2f7ce07 100644 --- a/core/sql/exp/exp_datetime.cpp +++ b/core/sql/exp/exp_datetime.cpp @@ -92,6 +92,30 @@ copyDatetimeFields(rec_datetime_field startField, Lng32 dstLen, NABoolean *roundedDownFlag); +// Helper function to format extra error message text and report error +// srcData is not null terminated, so need a buffer copy to build a C-style string +// +static void +raiseDateConvErrorWithSrcData(int srcLen, ComDiagsArea** diagsArea, char *srcData, CollHeap *heap) +{ + char errstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; + memset(errstr, 0 , sizeof(errstr) ); + if(srcLen > MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN -1 ) + srcLen = MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN -1; + strncpy(errstr, srcData, srcLen); + ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,errstr); +} + +// Helper function to format extra error message text and report error +// +static void +raiseDateConvErrorWithSrcDataNumeric(ComDiagsArea** diagsArea, long srcData, CollHeap *heap) +{ + char errstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; + memset(errstr, 0 , sizeof(errstr) ); + sprintf(errstr,"%ld",srcData); + ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,errstr); +} ////////////////////////////////////////////// // Defined in exp_datetime.h // @@ -2023,13 +2047,7 @@ ExpDatetime::convAsciiToDatetime(char *srcData, // If the format could not be determined, issue an error. // if (format == DATETIME_FORMAT_ERROR) { - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(originalSrcData); - if(copyLen > sizeof(hexstr) -1 ) - copyLen = sizeof(hexstr) -1; - strncpy(hexstr,originalSrcData,copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(originalSrcLen,diagsArea, originalSrcData, heap); return -1; } @@ -2065,13 +2083,7 @@ ExpDatetime::convAsciiToDatetime(char *srcData, // if timezone is specified and end field is not DAY, return error. if ((defZ || TZD) && (dstEndField == REC_DATE_DAY)) { - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(originalSrcData); - if(copyLen > sizeof(hexstr) -1 ) - copyLen = sizeof(hexstr) -1; - strncpy(hexstr,originalSrcData,copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(originalSrcLen,diagsArea, originalSrcData, heap); return -1; } @@ -2167,15 +2179,7 @@ ExpDatetime::convAsciiToDatetime(char *srcData, heap, diagsArea, flags)) { - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(originalSrcData); - if(copyLen > sizeof(hexstr) -1 ) - copyLen = sizeof(hexstr) -1; - strncpy(hexstr,originalSrcData,copyLen); - if(*diagsArea != NULL) - **diagsArea << DgString0(hexstr); + raiseDateConvErrorWithSrcData(originalSrcLen,diagsArea, originalSrcData, heap); return -1; } } @@ -2183,13 +2187,7 @@ ExpDatetime::convAsciiToDatetime(char *srcData, // If there are any remaining characters in the input string. if (src != srcEnd) { - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(originalSrcData); - if(copyLen > sizeof(hexstr) -1 ) - copyLen = sizeof(hexstr) -1; - strncpy(hexstr,originalSrcData,copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(originalSrcLen,diagsArea, originalSrcData, heap); return -1; } @@ -2200,13 +2198,7 @@ ExpDatetime::convAsciiToDatetime(char *srcData, containsField(REC_DATE_HOUR, dstStartField, dstEndField) && usaAmPm) { if (datetimeValues[REC_DATE_HOUR] > 12) { - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(originalSrcData); - if(copyLen > sizeof(hexstr) -1 ) - copyLen = sizeof(hexstr) -1; - strncpy(hexstr,originalSrcData,copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(originalSrcLen,diagsArea, originalSrcData, heap); return -1; } @@ -2226,13 +2218,7 @@ ExpDatetime::convAsciiToDatetime(char *srcData, } } } else if (usaAmPm) { - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(originalSrcData); - if(copyLen > sizeof(hexstr) -1 ) - copyLen = sizeof(hexstr) -1; - strncpy(hexstr,originalSrcData,copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(originalSrcLen,diagsArea, originalSrcData, heap); return -1; } @@ -2282,13 +2268,7 @@ ExpDatetime::convAsciiToDatetime(char *srcData, } break; default: - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(originalSrcData); - if(copyLen > sizeof(hexstr) - 1 ) - copyLen = sizeof(hexstr) - 1; - strncpy(hexstr,originalSrcData, copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(originalSrcLen,diagsArea, originalSrcData, heap); return -1; } } @@ -2301,13 +2281,7 @@ ExpDatetime::convAsciiToDatetime(char *srcData, if (validateDate(dstStartField, dstEndField, dstData, NULL, FALSE, LastDayPrevMonth)) { - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(originalSrcData); - if(copyLen > sizeof(hexstr) - 1 ) - copyLen = sizeof(hexstr) - 1; - strncpy(hexstr,originalSrcData, copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(originalSrcLen,diagsArea, originalSrcData, heap); return -1; }; @@ -2323,13 +2297,7 @@ ExpDatetime::convAsciiToDatetime(char *srcData, short error; Int64 juliantimestamp = COMPUTETIMESTAMP(timestamp, &error); if (error) { - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(originalSrcData); - if(copyLen > sizeof(hexstr) - 1 ) - copyLen = sizeof(hexstr) - 1; - strncpy(hexstr,originalSrcData, copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(originalSrcLen,diagsArea, originalSrcData, heap); return -1; } @@ -2377,13 +2345,7 @@ ExpDatetime::convAsciiToDatetime(char *srcData, } break; default: - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(originalSrcData); - if(copyLen > sizeof(hexstr) - 1 ) - copyLen = sizeof(hexstr) - 1; - strncpy(hexstr,originalSrcData, copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(originalSrcLen,diagsArea, originalSrcData, heap); return -1; } } @@ -2458,12 +2420,7 @@ static NABoolean convertStrToMonth(char* &srcData, char *result, if (*srcData != *nextByte) { // string contains non-digit - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - if(copyLen > sizeof(hexstr) -1 ) - copyLen = sizeof(hexstr) -1; - strncpy(hexstr,originalSrcData,copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(copyLen,diagsArea, originalSrcData, heap); return FALSE; // error } srcData++; @@ -2526,14 +2483,7 @@ static short convSrcDataToDst(Lng32 numSrcBytes, char* &srcData, if (src < numSrcBytes) { // string contains non-digit - // - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(srcData); - if( copyLen > sizeof(hexstr) - 1) - copyLen = sizeof(hexstr) - 1; - strncpy(hexstr,srcData,copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(numSrcBytes,diagsArea, srcData, heap); return -1; } @@ -2551,13 +2501,7 @@ static short convSrcDataToDst(Lng32 numSrcBytes, char* &srcData, if (*srcData != *nextByte) { // string contains non-digit - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(srcData); - if( copyLen > sizeof(hexstr) - 1) - copyLen = sizeof(hexstr) - 1; - strncpy(hexstr,srcData,copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(numSrcBytes,diagsArea, srcData, heap); return -1; } @@ -2619,14 +2563,7 @@ ExpDatetime::convAsciiToDate(char *srcData, if (i == srcLen) { // string contains only blanks. - // - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(srcData); - if(copyLen > sizeof(hexstr) - 1) - copyLen = sizeof(hexstr) - 1; - strncpy(hexstr,srcData,copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(inSrcLen,diagsArea, srcData, heap); return -1; }; @@ -2645,13 +2582,7 @@ ExpDatetime::convAsciiToDate(char *srcData, if ((minLength <= 0) || (srcLen < minLength)) { // string doesn't seem to contain all date fields. // - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(srcData); - if(copyLen > sizeof(hexstr) - 1) - copyLen = sizeof(hexstr) - 1; - strncpy(hexstr,srcData,copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(inSrcLen,diagsArea, srcData, heap); return -1; }; @@ -2862,13 +2793,7 @@ ExpDatetime::convAsciiToDate(char *srcData, // the month char * prevSrcData = srcData; if (! convertStrToMonthLongFormat(srcData, &dstData[2])) { - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(srcData); - if(copyLen > sizeof(hexstr) -1 ) - copyLen = sizeof(hexstr) -1 ; - strncpy(hexstr,srcData,copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(inSrcLen,diagsArea, srcData, heap); return -1; } minLength += (srcData - prevSrcData); @@ -3034,14 +2959,7 @@ ExpDatetime::convAsciiToDate(char *srcData, default: { // Format could not be determined, issue an error. - // - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(srcData); - if(copyLen > sizeof(hexstr) -1 ) - copyLen = sizeof(hexstr) -1 ; - strncpy(hexstr,srcData,copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(inSrcLen,diagsArea, srcData, heap); return -1; } }; @@ -3053,14 +2971,7 @@ ExpDatetime::convAsciiToDate(char *srcData, for (i = 0; i < srcLen; i++) { if (srcData[i] != ' ') { // string contains only blanks. - // - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(srcData); - if(copyLen > sizeof(hexstr) -1 ) - copyLen = sizeof(hexstr) -1 ; - strncpy(hexstr,srcData,copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(inSrcLen,diagsArea,srcData,heap); return -1; } } @@ -3074,13 +2985,7 @@ ExpDatetime::convAsciiToDate(char *srcData, if (validateDate(REC_DATE_YEAR, REC_DATE_DAY, dstData, NULL, FALSE, LastDayPrevMonth)) { - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(srcData); - if(copyLen > sizeof(hexstr) -1 ) - copyLen = sizeof(hexstr) -1 ; - strncpy(hexstr,srcData,copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcData(inSrcLen,diagsArea,srcData,heap); return -1; }; } @@ -3676,13 +3581,7 @@ ExpDatetime::convNumericTimeToASCII(char *srcData, // cannot convert negative number with NUM1 format if (format == DATETIME_FORMAT_NUM1) { - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(srcData); - if(copyLen > sizeof(hexstr) -1 ) - copyLen = sizeof(hexstr) -1; - strncpy(hexstr,srcData,copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcDataNumeric(diagsArea,temp,heap); return -1; } @@ -3720,13 +3619,7 @@ ExpDatetime::convNumericTimeToASCII(char *srcData, // if more digits left in input, error out. if (temp > 0) { - char hexstr[MAX_OFFENDING_SOURCE_DATA_DISPLAY_LEN]; - memset(hexstr, 0 , sizeof(hexstr) ); - int copyLen = strlen(srcData); - if(copyLen > sizeof(hexstr) -1 ) - copyLen = sizeof(hexstr) -1; - strncpy(hexstr,srcData,copyLen); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR,NULL,NULL,NULL,NULL,hexstr); + raiseDateConvErrorWithSrcDataNumeric(diagsArea,temp,heap); return -1; } http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/758bc382/core/sql/optimizer/BindRelExpr.cpp ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/BindRelExpr.cpp b/core/sql/optimizer/BindRelExpr.cpp index 4e88616..e7bd236 100644 --- a/core/sql/optimizer/BindRelExpr.cpp +++ b/core/sql/optimizer/BindRelExpr.cpp @@ -2964,7 +2964,7 @@ RelExpr *Intersect::bindNode(BindWA *bindWA) // if(CmpCommon::getDefault(MODE_SPECIAL_4) != DF_ON) { - *CmpCommon::diags() << DgSqlCode(-3022) // ## INTERSECT not yet supported + *CmpCommon::diags() << DgSqlCode(-3022) // ## INTERSECT not yet supported , not fully tested << DgString0("INTERSECT"); // ## bindWA->setErrStatus(); // ## if (bindWA->errStatus()) return NULL; // ## @@ -3056,7 +3056,7 @@ RelExpr *Except::bindNode(BindWA *bindWA) // if(CmpCommon::getDefault(MODE_SPECIAL_4) != DF_ON) { - *CmpCommon::diags() << DgSqlCode(-3022) // ## INTERSECT not yet supported + *CmpCommon::diags() << DgSqlCode(-3022) // ## EXCEPT not yet supported: not fully tested << DgString0("EXCEPT"); // ## bindWA->setErrStatus(); // ## if (bindWA->errStatus()) return NULL; // ## @@ -3097,7 +3097,7 @@ RelExpr *Except::bindNode(BindWA *bindWA) return this; } - // Needs to be removed when supporting get_next for INTERSECT + // Needs to be removed when supporting get_next for EXCEPT if (getGroupAttr()->isEmbeddedUpdateOrDelete()) { *CmpCommon::diags() << DgSqlCode(-4160) << DgString0(fmtdList1) http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/758bc382/core/sql/regress/executor/EXPECTED022.SB ---------------------------------------------------------------------- diff --git a/core/sql/regress/executor/EXPECTED022.SB b/core/sql/regress/executor/EXPECTED022.SB index e588531..5635915 100644 --- a/core/sql/regress/executor/EXPECTED022.SB +++ b/core/sql/regress/executor/EXPECTED022.SB @@ -882,7 +882,7 @@ A B C >>select cast ('23:11:61' as time) from t022t1; -*** ERROR[8415] The provided DATE, TIME, or TIMESTAMP is not valid and cannot be converted. Source data: 23:11:61-05:000 +*** ERROR[8415] The provided DATE, TIME, or TIMESTAMP is not valid and cannot be converted. Source data: 23:11:61 --- 0 row(s) selected. >>select cast ('23:11:06' as timestamp) from t022t1; @@ -892,7 +892,7 @@ A B C --- 0 row(s) selected. >>select cast('2010-01-01' as time) from t022t1; -*** ERROR[8415] The provided DATE, TIME, or TIMESTAMP is not valid and cannot be converted. Source data: 2010-01-015:000 +*** ERROR[8415] The provided DATE, TIME, or TIMESTAMP is not valid and cannot be converted. Source data: 2010-01-01 --- 0 row(s) selected. >>select timestamp'2010-01-01 10' from t022t1; @@ -5652,7 +5652,7 @@ A B C >>select cast ('23:11:61' as time) from t022t1; -*** ERROR[8415] The provided DATE, TIME, or TIMESTAMP is not valid and cannot be converted. Source data: 23:11:61-05:000 +*** ERROR[8415] The provided DATE, TIME, or TIMESTAMP is not valid and cannot be converted. Source data: 23:11:61 --- 0 row(s) selected. >>select cast ('23:11:06' as timestamp) from t022t1; @@ -5662,7 +5662,7 @@ A B C --- 0 row(s) selected. >>select cast('2010-01-01' as time) from t022t1; -*** ERROR[8415] The provided DATE, TIME, or TIMESTAMP is not valid and cannot be converted. Source data: 2010-01-015:000 +*** ERROR[8415] The provided DATE, TIME, or TIMESTAMP is not valid and cannot be converted. Source data: 2010-01-01 --- 0 row(s) selected. >>select timestamp'2010-01-01 10' from t022t1;
