http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/681cad66/core/sql/exp/exp_datetime.cpp ---------------------------------------------------------------------- diff --git a/core/sql/exp/exp_datetime.cpp b/core/sql/exp/exp_datetime.cpp index 781f2dd..456f539 100644 --- a/core/sql/exp/exp_datetime.cpp +++ b/core/sql/exp/exp_datetime.cpp @@ -89,8 +89,53 @@ copyDatetimeFields(rec_datetime_field startField, short dstFractPrec, char *srcData, char *dstData, + Lng32 dstLen, NABoolean *roundedDownFlag); +////////////////////////////////////////////// +// Defined in exp_datetime.h +// +// struct DatetimeFormatInfo +// { +// Lng32 format; +// const char * str; +// Lng32 minLen; +// Lng32 maxLen +// }; +////////////////////////////////////////////// +const ExpDatetime::DatetimeFormatInfo ExpDatetime::datetimeFormat[] = + { + {ExpDatetime::DATETIME_FORMAT_DEFAULT, "YYYY-MM-DD", 10, 10}, + {ExpDatetime::DATETIME_FORMAT_USA, "MM/DD/YYYY", 10, 10}, + {ExpDatetime::DATETIME_FORMAT_EUROPEAN, "DD.MM.YYYY", 10, 10}, + {ExpDatetime::DATETIME_FORMAT_DEFAULT2, "YYYY-MM", 7, 7}, + {ExpDatetime::DATETIME_FORMAT_USA2, "MM/DD/YYYY", 10, 10}, + {ExpDatetime::DATETIME_FORMAT_USA3, "YYYY/MM/DD", 10, 10}, + {ExpDatetime::DATETIME_FORMAT_USA4, "YYYYMMDD", 8, 8}, + {ExpDatetime::DATETIME_FORMAT_USA5, "YY/MM/DD", 8, 8}, + {ExpDatetime::DATETIME_FORMAT_USA6, "MM/DD/YY", 8, 8}, + {ExpDatetime::DATETIME_FORMAT_USA7, "MM-DD-YYYY", 10, 10}, + {ExpDatetime::DATETIME_FORMAT_USA8, "YYYYMM", 6, 6}, + {ExpDatetime::DATETIME_FORMAT_EUROPEAN2, "DD-MM-YYYY", 10, 10}, + {ExpDatetime::DATETIME_FORMAT_EUROPEAN3, "DD-MON-YYYY", 11, 11}, + {ExpDatetime::DATETIME_FORMAT_EUROPEAN4, "DDMONYYYY", 9, 9}, + + {ExpDatetime::DATETIME_FORMAT_TS4, "HH24:MI:SS", 8, 8}, + + {ExpDatetime::DATETIME_FORMAT_TS1, "YYYYMMDDHH24MISS", 14, 14}, + {ExpDatetime::DATETIME_FORMAT_TS2, "DD.MM.YYYY:HH24:MI:SS", 19, 19}, + {ExpDatetime::DATETIME_FORMAT_TS3, "YYYY-MM-DD HH24:MI:SS", 19, 19}, + {ExpDatetime::DATETIME_FORMAT_TS5, "YYYYMMDD:HH24:MI:SS", 17, 17}, + {ExpDatetime::DATETIME_FORMAT_TS6, "MMDDYYYY HH24:MI:SS", 17, 17}, + {ExpDatetime::DATETIME_FORMAT_TS7, "MM/DD/YYYY HH24:MI:SS", 19, 19}, + {ExpDatetime::DATETIME_FORMAT_TS8, "DD-MON-YYYY HH:MI:SS", 20, 20}, + {ExpDatetime::DATETIME_FORMAT_TS9, "MONTH DD, YYYY, HH:MI", 19, 25}, + + {ExpDatetime::DATETIME_FORMAT_NUM1, "99:99:99:99", 11, 11}, + {ExpDatetime::DATETIME_FORMAT_NUM2, "-99:99:99:99", 12, 12} + + }; + ExpDatetime::ExpDatetime() { setClassID(SimpleTypeID); @@ -911,6 +956,7 @@ ExpDatetime::arithDatetimeInterval(arithOps operation, datetimeOpType->getScale(), datetimeOpData, dateTimeValue, + MAX_DATETIME_SIZE, NULL) != 0) { ExRaiseSqlError(heap, diagsArea, EXE_INTERNAL_ERROR); return -1; @@ -1326,6 +1372,7 @@ copyDatetimeFields(rec_datetime_field startField, short dstFractPrec, char *srcData, char *dstData, + Lng32 dstLen, NABoolean *roundedDownFlag) { @@ -1360,7 +1407,9 @@ copyDatetimeFields(rec_datetime_field startField, dstFractPrec, roundedDownFlag); } - str_cpy_all(dstData, (char *) &fraction, sizeof(fraction)); + // if destination has space for fraction, copy it. + if ((dstLen > 0) && (dstLen >= (size + sizeof(fraction)))) + str_cpy_all(dstData, (char *) &fraction, sizeof(fraction)); } return 0; } @@ -1439,6 +1488,7 @@ ExpDatetime::convDatetimeDatetime(char *srcData, rec_datetime_field dstEndField, short dstFractPrec, char *dstData, + Lng32 dstLen, short validateFlag, NABoolean *roundedDownFlag) { @@ -1487,6 +1537,7 @@ ExpDatetime::convDatetimeDatetime(char *srcData, dstFractPrec, srcData, dstData, + dstLen, roundedDownFlag) != 0) { return -1; } @@ -1552,13 +1603,13 @@ ExpDatetime::extractDatetime(rec_datetime_field srcStartField, (rec_datetime_field)(dstStartField - 1), srcFractPrec); - if (copyDatetimeFields(dstStartField, dstEndField, srcFractPrec, getScale(), srcData, dstData, + getLength(), NULL) != 0) { return -1; } @@ -1590,7 +1641,7 @@ ExpDatetime::extractDatetime(rec_datetime_field srcStartField, // NA_EIDPROC static -ExpDatetime::asciiFormats +ExpDatetime::DatetimeFormats determineFormat(char *src, rec_datetime_field startField, rec_datetime_field endField) @@ -2302,9 +2353,9 @@ ExpDatetime::convAsciiToDatetime(char *srcData, heap, diagsArea, flags); } -NA_EIDPROC -static NABoolean -convertStrToMonth(char * value, char *result) +static NABoolean convertStrToMonth(char* &srcData, char *result, + const char * nextByte, + CollHeap * heap, ComDiagsArea** diagsArea) { const char * months[] = { @@ -2325,10 +2376,59 @@ convertStrToMonth(char * value, char *result) for (Int32 i = 0; i < 12; i++) { char upVal[3]; - str_cpy_convert(upVal, value, 3, 1); + str_cpy_convert(upVal, srcData, 3, 1); if (memcmp(upVal, months[i], 3) == 0) { *result = (char)(i + 1); + + srcData += 3; + + if (nextByte) + { + if (*srcData != *nextByte) + { + // string contains non-digit + ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + return FALSE; // error + } + srcData++; + } + + return TRUE; + } + } // for + + // error + return FALSE; +} + +static NABoolean +convertStrToMonthLongFormat(char* &value, char *result) +{ + const char * months[] = + { + "JANUARY", + "FEBRUARY", + "MARCH", + "APRIL", + "MAY", + "JUNE", + "JULY", + "AUGUST", + "SEPTEMBER", + "OCTOBER", + "NOVEMBER", + "DECEMBER" + }; + + for (Int32 i = 0; i < 12; i++) + { + char upVal[10]; + str_cpy_convert(upVal, value, strlen(months[i]), 1); + if (memcmp(upVal, months[i], strlen(months[i])) == 0) + { + *result = (char)(i + 1); + value += strlen(months[i]); return TRUE; } } @@ -2337,6 +2437,50 @@ convertStrToMonth(char * value, char *result) return FALSE; } +static short convSrcDataToDst(Lng32 numSrcBytes, char* &srcData, + Lng32 numTgtBytes, char *dstData, + const char * nextByte, + CollHeap * heap, ComDiagsArea** diagsArea) +{ + Lng32 src = 0; + Lng32 val = 0; + for (val = 0, src = 0; src < numSrcBytes && isDigit8859_1(*srcData); + src++, srcData++) + val = val * 10 + (*srcData - '0'); + + if (src < numSrcBytes) + { + // string contains non-digit + // + ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + return -1; + } + + if (numTgtBytes == sizeof(Lng32)) + *(Lng32*)dstData = val; + else if (numTgtBytes == sizeof(short)) + *(short*)dstData = val; + else if (numTgtBytes == sizeof(char)) + *(char*)dstData = val; + else + return -1; + + if (nextByte && (strlen(nextByte) > 0)) + { + if (*srcData != *nextByte) + { + // string contains non-digit + ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + return -1; + } + + srcData++; + } + + return 0; +} + +////////////////////////////////////////////////////////////////////////// // ExpDatetime::convAsciiToDate() ================================ // This method is used to convert the given ASCII string // to a datetime date value. @@ -2345,24 +2489,26 @@ convertStrToMonth(char * value, char *result) // 'dstData'. This buffer must be allocated by the caller and it // must be large enough to hold the result. // -// The ASCII string can be in one of three formats: -// -// Default : yyyy-mm-dd -// USA : mm/dd/yyyy -// European: dd.mm.yyyy -// // This method is called assuming the correct source format. The source // string must contain date and, possibly, leading and trailing blanks // only. The size of destination buffer should be just enough to hold // internal representation of the date value, i.e. 4 bytes. // -// This method was added as part of the IMPORT performance improvement -// project. +// target dstData has the format: +// Timestamp: +// dstData[0..1] 2-bytes for year. +// dstData[2] .. dstData[6] 1-byte for month through second. +// dstData[7..10] 4-bytes for fraction. +// Date: +// dstData[0..1] 2-bytes for year. +// dstData[2] .. dstData[3] 1-byte for month through day. +// Time: +// dstData[0] .. dstData[2] 1-byte for hour through second. // ===================================================================== // short ExpDatetime::convAsciiToDate(char *srcData, - Lng32 srcLen, + Lng32 inSrcLen, char *dstData, Lng32 dstLen, Int32 format, @@ -2376,6 +2522,7 @@ ExpDatetime::convAsciiToDate(char *srcData, Lng32 srcFormat, i; NABoolean LastDayPrevMonth = FALSE; + Lng32 srcLen = inSrcLen; if (*srcData == ' ') { // skip leading blanks and adjust srcData and srcLen accordingly // @@ -2410,773 +2557,363 @@ ExpDatetime::convAsciiToDate(char *srcData, }; switch (srcFormat) { - case DATETIME_FORMAT_DEFAULT: - case DATETIME_FORMAT_DEFAULT2: - case DATETIME_FORMAT_TS3: + case DATETIME_FORMAT_DEFAULT: // YYYY-MM-DD { - // this is default format: yyyy-mm-dd. first, the year - for (year = 0, i = 0; i < 4 && isDigit8859_1(*srcData); i++, srcData++) -#pragma nowarn(1506) // warning elimination - year = year * 10 + *srcData - '0'; -#pragma warn(1506) // warning elimination + // the year + if (convSrcDataToDst(4, srcData, 2, dstData, "-", heap, diagsArea)) + return -1; - if (i < 4 || *srcData != '-') { - // string contains non-digit or invalid delimiter - // - if (i < 4) - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + // the month + if (convSrcDataToDst(2, srcData, 1, &dstData[2], "-", heap, diagsArea)) + return -1; + + // the day + if (convSrcDataToDst(2, srcData, 1, &dstData[3], NULL, heap, diagsArea)) + return -1; + }; + break; + + case DATETIME_FORMAT_DEFAULT2: // YYYY-MM + { + // the year + if (convSrcDataToDst(4, srcData, 2, dstData, "-", heap, diagsArea)) return -1; - } - str_cpy_all(dstData, (char *)&year, sizeof(year)); - srcData++; // move on to the next field // the month - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[2] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + if (convSrcDataToDst(2, srcData, 1, &dstData[2], NULL, heap, diagsArea)) return -1; - } - srcData += 2; + // the day + // day is not specified, fill in as '1' (first day of month). + dstData[3] = 1; + }; + break; + + case DATETIME_FORMAT_TS3: // YYYY-MM-DD HH24:MI:SS + { + // the year + if (convSrcDataToDst(4, srcData, 2, dstData, "-", heap, diagsArea)) + return -1; + + // the month + if (convSrcDataToDst(2, srcData, 1, &dstData[2], "-", heap, diagsArea)) + return -1; // the day - if (srcFormat == DATETIME_FORMAT_DEFAULT2) - { - // day is not specified, fill in as '1' (first day of month). - dstData[3] = 1; - } - else - { - if (*srcData != '-') { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field - - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[3] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData += 2; - } + if (convSrcDataToDst(2, srcData, 1, &dstData[3], " ", heap, diagsArea)) + return -1; + + // the hour + if (convSrcDataToDst(2, srcData, 1, &dstData[4], ":", heap, diagsArea)) + return -1; - if (srcFormat == DATETIME_FORMAT_TS3) - { - if (*srcData != ' ') { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field + // the minute + if (convSrcDataToDst(2, srcData, 1, &dstData[5], ":", heap, diagsArea)) + return -1; - // the hour - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[4] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - - srcData += 2; + // the second + if (convSrcDataToDst(2, srcData, 1, &dstData[6], NULL, heap, diagsArea)) + return -1; - if (*srcData != ':') { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field - - // the minute - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[5] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - - srcData += 2; - if (*srcData != ':') { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field - - // the second - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[6] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - - srcData += 2; - - dstData[7] = 0; - dstData[8] = 0; - dstData[9] = 0; - dstData[10] = 0; - } - }; // case DEFAULT format + dstData[7] = 0; + dstData[8] = 0; + dstData[9] = 0; + dstData[10] = 0; + }; break; - case DATETIME_FORMAT_USA: + case DATETIME_FORMAT_USA: // MM/DD/YYYY AM|PM case DATETIME_FORMAT_USA2: // MM/DD/YYYY case DATETIME_FORMAT_USA6: // MM/DD/YY case DATETIME_FORMAT_USA7: // MM-DD-YYYY - case DATETIME_FORMAT_TS6: // MMDDYYYY HH24:MI:SS - case DATETIME_FORMAT_TS7: // MM/DD/YYYY HH24:MI:SS { - // this is USA format: mm/dd/yyyy. first, the month - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[2] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } + char sep = (srcFormat == DATETIME_FORMAT_USA7 ? '-' : '/'); - char delim = (srcFormat == DATETIME_FORMAT_USA7 ? '-' - : (srcFormat == DATETIME_FORMAT_TS6 ? 0 : '/')); - srcData += 2; // move on to the delimiter field - if (delim != 0) - { - if (*srcData != delim) { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field - } + // the month + if (convSrcDataToDst(2, srcData, 1, &dstData[2], &sep, heap,diagsArea)) + return -1; // the day - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[3] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + if (convSrcDataToDst(2, srcData, 1, &dstData[3], &sep, heap, diagsArea)) return -1; - } - srcData += 2; // move on to the delimiter field + // the year + Int32 numOfYdigits = (srcFormat == DATETIME_FORMAT_USA6 ? 2 : 4); + if (convSrcDataToDst(numOfYdigits, srcData, 2, dstData, NULL, heap, diagsArea)) + return -1; + }; + break; - if (delim != 0) - { - if (*srcData != delim) { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field - } + case DATETIME_FORMAT_TS6: // MMDDYYYY HH24:MI:SS + case DATETIME_FORMAT_TS7: // MM/DD/YYYY HH24:MI:SS + { + char sep = '/'; + char * septr = (srcFormat == DATETIME_FORMAT_TS7 ? &sep : NULL); + + // the month + if (convSrcDataToDst(2, srcData, 1, &dstData[2], septr, heap, diagsArea)) + return -1; + // the day + if (convSrcDataToDst(2, srcData, 1, &dstData[3], septr, heap, diagsArea)) + return -1; + // the year - Int32 numOfYdigits = (srcFormat == DATETIME_FORMAT_USA6 ? 2 : 4); - for (year = 0, i = 0; i < numOfYdigits && isDigit8859_1(*srcData); i++, srcData++) -#pragma nowarn(1506) // warning elimination - year = year * 10 + *srcData - '0'; -#pragma warn(1506) // warning elimination + if (convSrcDataToDst(4, srcData, 2, dstData, " ", heap, diagsArea)) + return -1; - if (i < numOfYdigits) { - // string contains non-digit - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + // the hour + if (convSrcDataToDst(2, srcData, 1, &dstData[4], ":", heap, diagsArea)) return -1; - } - str_cpy_all(dstData, (char *)&year, sizeof(year)); - if ((srcFormat == DATETIME_FORMAT_TS6) || - (srcFormat == DATETIME_FORMAT_TS7)) - { - if (*srcData != ' ') { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field + // the minute + if (convSrcDataToDst(2, srcData, 1, &dstData[5], ":", heap, diagsArea)) + return -1; - // the hour - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[4] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - - srcData += 2; + // the second + if (convSrcDataToDst(2, srcData, 1, &dstData[6], NULL, heap, diagsArea)) + return -1; - if (*srcData != ':') { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field - - // the minute - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[5] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - - srcData += 2; - if (*srcData != ':') { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field - - // the second - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[6] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - - srcData += 2; - - dstData[7] = 0; - dstData[8] = 0; - dstData[9] = 0; - dstData[10] = 0; - } - }; // case USA format + dstData[7] = 0; + dstData[8] = 0; + dstData[9] = 0; + dstData[10] = 0; + }; break; - case DATETIME_FORMAT_USA3: - case DATETIME_FORMAT_USA4: - case DATETIME_FORMAT_USA5: - case DATETIME_FORMAT_USA8: + case DATETIME_FORMAT_USA3: // YYYY/MM/DD + case DATETIME_FORMAT_USA4: // YYYYMMDD + case DATETIME_FORMAT_USA5: // YY/MM/DD { - // this is USA format: See exp_datetime.h for details. + // the year + Lng32 numYearDigits = (srcFormat == DATETIME_FORMAT_USA5 ? 2 : 4); + char sep = '/'; + char * septr = (srcFormat == DATETIME_FORMAT_USA4 ? NULL : &sep); // the year - Lng32 numYearDigits = 4; - if (srcFormat == DATETIME_FORMAT_USA5) - numYearDigits = 2; - for (year = 0, i = 0; - i < numYearDigits && isDigit8859_1(*srcData); i++, srcData++) -#pragma nowarn(1506) // warning elimination - year = year * 10 + *srcData - '0'; -#pragma warn(1506) // warning elimination + if (convSrcDataToDst(numYearDigits, srcData, 2, dstData, septr, heap, diagsArea)) + return -1; - if (i < numYearDigits) { - // string contains non-digit - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + // the month + if (convSrcDataToDst(2, srcData, 1, &dstData[2], septr, heap, diagsArea)) return -1; - } - str_cpy_all(dstData, (char *)&year, sizeof(year)); + // the day + if (convSrcDataToDst(2, srcData, 1, &dstData[3], NULL, heap, diagsArea)) + return -1; - if ((srcFormat != DATETIME_FORMAT_USA4) && - (srcFormat != DATETIME_FORMAT_USA8)) { - if (*srcData != '/') { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field - } + }; + break; - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[2] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + case DATETIME_FORMAT_USA8: // YYYYMM + { + // the year + if (convSrcDataToDst(4, srcData, 2, dstData, NULL, heap, diagsArea)) return -1; - } - srcData += 2; // move on to the delimiter field - if ((srcFormat != DATETIME_FORMAT_USA4) && - (srcFormat != DATETIME_FORMAT_USA8)) { - if (*srcData != '/') { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field - } + // the month + if (convSrcDataToDst(2, srcData, 1, &dstData[2], NULL, heap, diagsArea)) + return -1; // the day - if (srcFormat == DATETIME_FORMAT_USA8) - { - // day is not specified, fill in as '1' (first day of month). - dstData[3] = 1; - } - else - { - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[3] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - - srcData += 2; - } - }; // case USA format + // day is not specified, fill in as '1' (first day of month). + dstData[3] = 1; + }; break; - case DATETIME_FORMAT_TS1: - case DATETIME_FORMAT_TS5: + case DATETIME_FORMAT_TS1: // YYYYMMDDHH24MISS + case DATETIME_FORMAT_TS5: // YYYYMMDD:HH24:MI:SS { - // this is TS1 format: YYYYMMDDHH24MISS - // TS5 format: YYYYMMDD:HH24:MI:SS - // See exp_datetime.h for details. - + char sep = ':'; + char * septr = (srcFormat == DATETIME_FORMAT_TS1 ? NULL : &sep); + // the year - Lng32 numYearDigits = 4; - for (year = 0, i = 0; - i < numYearDigits && isDigit8859_1(*srcData); i++, srcData++) -#pragma nowarn(1506) // warning elimination - year = year * 10 + *srcData - '0'; -#pragma warn(1506) // warning elimination - - if (i < numYearDigits) { - // string contains non-digit - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + if (convSrcDataToDst(4, srcData, 2, dstData, NULL, heap, diagsArea)) return -1; - } - - str_cpy_all(dstData, (char *)&year, sizeof(year)); - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[2] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + // the month + if (convSrcDataToDst(2, srcData, 1, &dstData[2], NULL, heap, diagsArea)) return -1; - } - - srcData += 2; // move on to the delimiter field // the day - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[3] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + if (convSrcDataToDst(2, srcData, 1, &dstData[3], septr, heap, diagsArea)) return -1; - } - - srcData += 2; - - if (srcFormat == DATETIME_FORMAT_TS5) - { - if (*srcData != ':') { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field - } - + // the hour - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[4] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + if (convSrcDataToDst(2, srcData, 1, &dstData[4], septr, heap, diagsArea)) return -1; - } - - srcData += 2; - - if (srcFormat == DATETIME_FORMAT_TS5) - { - if (*srcData != ':') { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field - } // the minute - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[5] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + if (convSrcDataToDst(2, srcData, 1, &dstData[5], septr, heap, diagsArea)) return -1; - } - srcData += 2; + // the second + if (convSrcDataToDst(2, srcData, 1, &dstData[6], NULL, heap, diagsArea)) + return -1; - if (srcFormat == DATETIME_FORMAT_TS5) - { - if (*srcData != ':') { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field - } + dstData[7] = 0; + dstData[8] = 0; + dstData[9] = 0; + dstData[10] = 0; + }; + break; - // the second - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[6] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); + case DATETIME_FORMAT_TS9: // MONTH DD, YYYY, HH:MI AM|PM + { + // the month + char * prevSrcData = srcData; + if (! convertStrToMonthLongFormat(srcData, &dstData[2])) { ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); return -1; } + minLength += (srcData - prevSrcData); + srcData += 1; // skip blank after "Month" - srcData += 2; + // the day + if (convSrcDataToDst(2, srcData, 1, &dstData[3], ",", heap, diagsArea)) + return -1; + srcData++; // skip over blank + // the year + if (convSrcDataToDst(4, srcData, 2, dstData, ",", heap, diagsArea)) + return -1; + srcData++; // skip over blank + + // the hour + if (convSrcDataToDst(2, srcData, 1, &dstData[4], ":", heap, diagsArea)) + return -1; + + // the minute + if (convSrcDataToDst(2, srcData, 1, &dstData[5], NULL, heap, diagsArea)) + return -1; + + dstData[6] = 0; dstData[7] = 0; dstData[8] = 0; dstData[9] = 0; dstData[10] = 0; - }; // case TS1 format + } break; - case DATETIME_FORMAT_EUROPEAN: - case DATETIME_FORMAT_EUROPEAN2: - case DATETIME_FORMAT_EUROPEAN3: - case DATETIME_FORMAT_EUROPEAN4: - case DATETIME_FORMAT_TS2: + case DATETIME_FORMAT_EUROPEAN: // DD.MM.YYYY + case DATETIME_FORMAT_EUROPEAN2: // DD-MM-YYYY { - // this is European format: dd.mm.yyyy. first, the day - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[3] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } + char sep = (srcFormat == DATETIME_FORMAT_EUROPEAN ? '.' : '-'); - srcData += 2; // move on to the delimiter field - if ((((srcFormat == DATETIME_FORMAT_EUROPEAN) || - (srcFormat == DATETIME_FORMAT_TS2)) && - (*srcData != '.')) || - (((srcFormat == DATETIME_FORMAT_EUROPEAN2) || - (srcFormat == DATETIME_FORMAT_EUROPEAN3)) && - (*srcData != '-'))) { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + // the day + if (convSrcDataToDst(2, srcData, 1, &dstData[3], &sep, heap, diagsArea)) return -1; - } - - if (srcFormat != DATETIME_FORMAT_EUROPEAN4) - srcData++; // move on to the next field + + // the month + if (convSrcDataToDst(2, srcData, 1, &dstData[2], &sep, heap, diagsArea)) + return -1; + + // the year + if (convSrcDataToDst(4, srcData, 2, dstData, NULL, heap, diagsArea)) + return -1; + }; + break; + case DATETIME_FORMAT_EUROPEAN3: // DD-MON-YYYY + case DATETIME_FORMAT_EUROPEAN4: // DDMONYYYY + { + char sep = '-'; + char * septr = (srcFormat == DATETIME_FORMAT_EUROPEAN3 ? &sep : NULL); + + // the day + if (convSrcDataToDst(2, srcData, 1, &dstData[3], septr, heap, diagsArea)) + return -1; + // the month - if ((srcFormat == DATETIME_FORMAT_EUROPEAN3) || - (srcFormat == DATETIME_FORMAT_EUROPEAN4)) - { - if (! convertStrToMonth(srcData, &dstData[2])) { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData += 3; // move on to the delimiter field - } - else - { - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[2] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData += 2; // move on to the delimiter field - } + if (! convertStrToMonth(srcData, &dstData[2], septr, heap, diagsArea)) + return -1; - if ((((srcFormat == DATETIME_FORMAT_EUROPEAN) || - (srcFormat == DATETIME_FORMAT_TS2)) && - (*srcData != '.')) || - (((srcFormat == DATETIME_FORMAT_EUROPEAN2) || - (srcFormat == DATETIME_FORMAT_EUROPEAN3)) && - (*srcData != '-'))) { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + // the year + if (convSrcDataToDst(4, srcData, 2, dstData, NULL, heap, diagsArea)) return -1; - } - - if (srcFormat != DATETIME_FORMAT_EUROPEAN4) - srcData++; // move on to the next field + }; + break; + case DATETIME_FORMAT_TS2: // DD.MM.YYYY:HH24:MI:SS + { + // the day + if (convSrcDataToDst(2, srcData, 1, &dstData[3], ".", heap, diagsArea)) + return -1; + + // the month + if (convSrcDataToDst(2, srcData, 1, &dstData[2], ".", heap, diagsArea)) + return -1; + // the year - for (year = 0, i = 0; i < 4 && isDigit8859_1(*srcData); i++, srcData++) -#pragma nowarn(1506) // warning elimination - year = year * 10 + *srcData - '0'; -#pragma warn(1506) // warning elimination + if (convSrcDataToDst(4, srcData, 2, dstData, ":", heap, diagsArea)) + return -1; - if (i < 4) { - // string contains non-digit - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + // the hour + if (convSrcDataToDst(2, srcData, 1, &dstData[4], ":", heap, diagsArea)) return -1; - } - str_cpy_all(dstData, (char *)&year, sizeof(year)); + // the minute + if (convSrcDataToDst(2, srcData, 1, &dstData[5], ":", heap, diagsArea)) + return -1; - if (srcFormat == DATETIME_FORMAT_TS2) - { - if (*srcData != ':') { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field + // the second + if (convSrcDataToDst(2, srcData, 1, &dstData[6], NULL, heap, diagsArea)) + return -1; - // the hour - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[4] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - - srcData += 2; + dstData[7] = 0; + dstData[8] = 0; + dstData[9] = 0; + dstData[10] = 0; + }; + break; - if (*srcData != ':') { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field - - // the minute - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[5] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - - srcData += 2; - if (*srcData != ':') { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field - - // the second - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[6] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - - srcData += 2; - - dstData[7] = 0; - dstData[8] = 0; - dstData[9] = 0; - dstData[10] = 0; - } + case DATETIME_FORMAT_TS8: // DD-MON-YYYY HH:MI:SS + { + // the day + if (convSrcDataToDst(2, srcData, 1, &dstData[3], "-", heap, diagsArea)) + return -1; + + // the month + if (! convertStrToMonth(srcData, &dstData[2], "-", heap, diagsArea)) + return -1; - }; // case EUROPEAN format + // the year + if (convSrcDataToDst(4, srcData, 2, dstData, " ", heap, diagsArea)) + return -1; + + // the hour + if (convSrcDataToDst(2, srcData, 1, &dstData[4], ":", heap, diagsArea)) + return -1; + + // the minute + if (convSrcDataToDst(2, srcData, 1, &dstData[5], ":", heap, diagsArea)) + return -1; + + // the second + if (convSrcDataToDst(2, srcData, 1, &dstData[6], NULL, heap, diagsArea)) + return -1; + + dstData[7] = 0; + dstData[8] = 0; + dstData[9] = 0; + dstData[10] = 0; + }; break; - case DATETIME_FORMAT_TS4: + case DATETIME_FORMAT_TS4: // HH24:MI:SS { // the hour - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[0] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - - srcData += 2; - - if (*srcData != ':') { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field - + if (convSrcDataToDst(2, srcData, 1, &dstData[0], ":", heap, diagsArea)) + return -1; + // the minute - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[1] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - - srcData += 2; - if (*srcData != ':') { - // string contains invalid delimiter - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - srcData++; // move on to the next field - + if (convSrcDataToDst(2, srcData, 1, &dstData[1], ":", heap, diagsArea)) + return -1; + // the second - if (isDigit8859_1(*srcData) && isDigit8859_1(*(srcData+1))) { -#pragma nowarn(1506) // warning elimination - dstData[2] = char (*srcData - '0') * 10 + (*(srcData+1) - '0'); -#pragma warn(1506) // warning elimination - } else { - // string contains non-digit charecter(s) - // - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_STRING_ERROR); - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); - return -1; - } - - srcData += 2; - - dstData[3] = 0; - dstData[4] = 0; - dstData[5] = 0; - dstData[6] = 0; - + if (convSrcDataToDst(2, srcData, 1, &dstData[2], NULL, heap, diagsArea)) + return -1; }; break; @@ -3293,6 +3030,32 @@ convertMonthToStr(Lng32 value, char *&result, UInt32 width) result += width; } +static void +convertMonthToStrLongFormat(Lng32 value, char *&result, UInt32 width) +{ + const char * months[] = + { + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December" + }; + + strcpy(result, months[value-1]); + + // Update result pointer to point to end of string. + // + result += strlen(months[value-1]); +} + Lng32 ExpDatetime::getDatetimeFormatLen(Lng32 format, NABoolean to_date, rec_datetime_field startField, rec_datetime_field endField) @@ -3305,13 +3068,8 @@ Lng32 ExpDatetime::getDatetimeFormatLen(Lng32 format, NABoolean to_date, { if (to_date) { - if (format == DATETIME_FORMAT_DEFAULT) - return DATETIME_FORMAT_DEFAULT_LEN; - else if (format == DATETIME_FORMAT_USA) - return DATETIME_FORMAT_USA_LEN; - else //if (format == DATETIME_FORMAT_EUROPEAN) - return DATETIME_FORMAT_EUROPEAN_LEN; - } + return ExpDatetime::getDatetimeFormatLen(format); + } else { Lng32 minReqDstLen = 0; @@ -3348,34 +3106,12 @@ Lng32 ExpDatetime::getDatetimeFormatLen(Lng32 format, NABoolean to_date, } } break; - case DATETIME_FORMAT_DEFAULT2: return DATETIME_FORMAT_DEFAULT2_LEN; - - case DATETIME_FORMAT_USA2: return DATETIME_FORMAT_USA2_LEN; - case DATETIME_FORMAT_USA3: return DATETIME_FORMAT_USA3_LEN; - case DATETIME_FORMAT_USA4: return DATETIME_FORMAT_USA4_LEN; - case DATETIME_FORMAT_USA5: return DATETIME_FORMAT_USA5_LEN; - case DATETIME_FORMAT_USA6: return DATETIME_FORMAT_USA6_LEN; - case DATETIME_FORMAT_USA7: return DATETIME_FORMAT_USA7_LEN; - case DATETIME_FORMAT_USA8: return DATETIME_FORMAT_USA8_LEN; - - case DATETIME_FORMAT_EUROPEAN2: return DATETIME_FORMAT_EUROPEAN2_LEN; - case DATETIME_FORMAT_EUROPEAN3: return DATETIME_FORMAT_EUROPEAN3_LEN; - case DATETIME_FORMAT_EUROPEAN4: return DATETIME_FORMAT_EUROPEAN4_LEN; - - case DATETIME_FORMAT_TIME1: return DATETIME_FORMAT_TIME1_LEN; - case DATETIME_FORMAT_TIME2: return DATETIME_FORMAT_TIME2_LEN; - - case DATETIME_FORMAT_TS1: return DATETIME_FORMAT_TS1_LEN; - case DATETIME_FORMAT_TS2: return DATETIME_FORMAT_TS2_LEN; - case DATETIME_FORMAT_TS3: return DATETIME_FORMAT_TS3_LEN; - case DATETIME_FORMAT_TS4: return DATETIME_FORMAT_TS4_LEN; - case DATETIME_FORMAT_TS5: return DATETIME_FORMAT_TS5_LEN; - case DATETIME_FORMAT_TS6: return DATETIME_FORMAT_TS6_LEN; - case DATETIME_FORMAT_TS7: return DATETIME_FORMAT_TS7_LEN; - case DATETIME_FORMAT_TS8: return DATETIME_FORMAT_TS8_LEN; - - default: return -1; + + default: + return ExpDatetime::getDatetimeFormatLen(format); } + + return 0; } // convDatetimeToASCII() ============================================ @@ -3572,6 +3308,20 @@ ExpDatetime::convDatetimeToASCII(char *srcData, } break; + case DATETIME_FORMAT_TS9: + { + convertMonthToStrLongFormat(month, dstDataPtr, 3); + *dstDataPtr++ = ' '; + + convertToAscii(day, dstDataPtr, 2); + *dstDataPtr++ = ','; + *dstDataPtr++ = ' '; + + convertToAscii(year, dstDataPtr, 4); + *dstDataPtr++ = ','; + } + break; + case DATETIME_FORMAT_TS4: { // do nothing for date part. @@ -3707,6 +3457,29 @@ ExpDatetime::convDatetimeToASCII(char *srcData, dstDataPtr += 3; } + // if format includes time field but source is a DATE datatype, extend + // the returned string with zeroes + if (isTimestampFormat(format)) + { + if (format == DATETIME_FORMAT_TS1) + { + } + else if ((format == DATETIME_FORMAT_TS2) || + (format == DATETIME_FORMAT_TS5)) + { + *dstDataPtr = ':'; + dstDataPtr++; + } + else + { + *dstDataPtr = ' '; + dstDataPtr++; + } + + str_cpy_all(dstDataPtr, "00:00:00", 8); + dstDataPtr += 8; + } + // Return the actual number of bytes formatted. // return dstDataPtr - dstData; @@ -3745,15 +3518,15 @@ ExpDatetime::convNumericTimeToASCII(char *srcData, CollHeap *heap, ComDiagsArea** diagsArea) { - if ((format != DATETIME_FORMAT_TIME1) && - (format != DATETIME_FORMAT_TIME2)) + if ((format != DATETIME_FORMAT_NUM1) && + (format != DATETIME_FORMAT_NUM2)) return -1; - if ((format == DATETIME_FORMAT_TIME1) && + if ((format == DATETIME_FORMAT_NUM1) && (dstLen < 11)) return -1; - if ((format == DATETIME_FORMAT_TIME2) && + if ((format == DATETIME_FORMAT_NUM2) && (dstLen < 12)) return -1; @@ -3761,9 +3534,16 @@ ExpDatetime::convNumericTimeToASCII(char *srcData, NABoolean negative = FALSE; if (temp < 0) { + // cannot convert negative number with NUM1 format + if (format == DATETIME_FORMAT_NUM1) + { + ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + return -1; + } + temp = -temp; - if (format == DATETIME_FORMAT_TIME2) + if (format == DATETIME_FORMAT_NUM2) { negative = TRUE; } @@ -3792,7 +3572,14 @@ ExpDatetime::convNumericTimeToASCII(char *srcData, part1 = (Lng32)(temp - (temp/100)*100); temp = temp/100; - if (format == DATETIME_FORMAT_TIME2) + // if more digits left in input, error out. + if (temp > 0) + { + ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_DATETIME_ERROR); + return -1; + } + + if (format == DATETIME_FORMAT_NUM2) { if (negative) str_sprintf(dstData, "-%02d:%02d:%02d:%02d", part1, part2, part3, part4);
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/681cad66/core/sql/exp/exp_datetime.h ---------------------------------------------------------------------- diff --git a/core/sql/exp/exp_datetime.h b/core/sql/exp/exp_datetime.h index 28ec909..8f6fa1b 100644 --- a/core/sql/exp/exp_datetime.h +++ b/core/sql/exp/exp_datetime.h @@ -49,67 +49,65 @@ class SQLEXP_LIB_FUNC ExpDatetime : public SimpleType { public: - enum asciiFormats + // these enums must be in the same order as the datetimeFormat[] array + // (defined in exp_datetime.cpp). + enum DatetimeFormats { - DATETIME_FORMAT_DEFAULT = 0, // YYYY-MM-DD - DATETIME_FORMAT_USA = 1, // MM/DD/YYYY AM|PM - DATETIME_FORMAT_EUROPEAN = 2, // DD.MM.YYYY - DATETIME_FORMAT_DEFAULT2, // YYYY-MM - DATETIME_FORMAT_USA2, // MM/DD/YYYY - DATETIME_FORMAT_USA3, // YYYY/MM/DD - DATETIME_FORMAT_USA4, // YYYYMMDD - DATETIME_FORMAT_USA5, // YY/MM/DD - DATETIME_FORMAT_USA6, // MM/DD/YY - DATETIME_FORMAT_USA7, // MM-DD-YYYY - DATETIME_FORMAT_USA8, // YYYYMM - DATETIME_FORMAT_EUROPEAN2, // DD-MM-YYYY - DATETIME_FORMAT_EUROPEAN3, // DD-MON-YYYY - DATETIME_FORMAT_EUROPEAN4, // DDMONYYYY - DATETIME_FORMAT_TIME1, // 99:99:99:99 - DATETIME_FORMAT_TIME2, // -99:99:99:99 - DATETIME_FORMAT_TS1, // YYYYMMDDHH24MISS - DATETIME_FORMAT_TS2, // DD.MM.YYYY:HH24:MI:SS - DATETIME_FORMAT_TS3, // YYYY-MM-DD HH24:MI:SS - DATETIME_FORMAT_TS4, // HH24:MI:SS - DATETIME_FORMAT_TS5, // YYYYMMDD:HH24:MI:SS - DATETIME_FORMAT_TS6, // MMDDYYYY HH24:MI:SS - DATETIME_FORMAT_TS7, // MM/DD/YYYY HH24:MI:SS - DATETIME_FORMAT_TS8, // DD-MON-YYYY HH:MI:SS - DATETIME_FORMAT_DATE_STR, // format in str - DATETIME_FORMAT_TIME_STR, // format in str + DATETIME_FORMAT_MIN = 0, + DATETIME_FORMAT_MIN_DATE = DATETIME_FORMAT_MIN, + DATETIME_FORMAT_DEFAULT = DATETIME_FORMAT_MIN_DATE, // YYYY-MM-DD + DATETIME_FORMAT_USA, // MM/DD/YYYY AM|PM + DATETIME_FORMAT_EUROPEAN, // DD.MM.YYYY + DATETIME_FORMAT_DEFAULT2, // YYYY-MM + DATETIME_FORMAT_USA2, // MM/DD/YYYY + DATETIME_FORMAT_USA3, // YYYY/MM/DD + DATETIME_FORMAT_USA4, // YYYYMMDD + DATETIME_FORMAT_USA5, // YY/MM/DD + DATETIME_FORMAT_USA6, // MM/DD/YY + DATETIME_FORMAT_USA7, // MM-DD-YYYY + DATETIME_FORMAT_USA8, // YYYYMM + DATETIME_FORMAT_EUROPEAN2, // DD-MM-YYYY + DATETIME_FORMAT_EUROPEAN3, // DD-MON-YYYY + DATETIME_FORMAT_EUROPEAN4, // DDMONYYYY + DATETIME_FORMAT_MAX_DATE = DATETIME_FORMAT_EUROPEAN4, + + DATETIME_FORMAT_MIN_TIME, + DATETIME_FORMAT_TS4 = DATETIME_FORMAT_MIN_TIME, // HH24:MI:SS + DATETIME_FORMAT_MAX_TIME = DATETIME_FORMAT_TS4, + + DATETIME_FORMAT_MIN_TS, + DATETIME_FORMAT_TS1 = DATETIME_FORMAT_MIN_TS, // YYYYMMDDHH24MISS + DATETIME_FORMAT_TS2, // DD.MM.YYYY:HH24:MI:SS + DATETIME_FORMAT_TS3, // YYYY-MM-DD HH24:MI:SS + DATETIME_FORMAT_TS5, // YYYYMMDD:HH24:MI:SS + DATETIME_FORMAT_TS6, // MMDDYYYY HH24:MI:SS + DATETIME_FORMAT_TS7, // MM/DD/YYYY HH24:MI:SS + DATETIME_FORMAT_TS8, // DD-MON-YYYY HH:MI:SS + DATETIME_FORMAT_TS9, // MONTH DD, YYYY, HH:MI AM|PM + DATETIME_FORMAT_MAX_TS = DATETIME_FORMAT_TS9, + + DATETIME_FORMAT_MAX = DATETIME_FORMAT_MAX_TS, + + DATETIME_FORMAT_MIN_NUM = DATETIME_FORMAT_MAX, + DATETIME_FORMAT_NUM1, // 99:99:99:99 + DATETIME_FORMAT_NUM2, // -99:99:99:99 + DATETIME_FORMAT_MAX_NUM = DATETIME_FORMAT_NUM2, + + DATETIME_FORMAT_DATE_STR, // format in str + DATETIME_FORMAT_TIME_STR, // format in str DATETIME_FORMAT_NONE, - DATETIME_FORMAT_ERROR + DATETIME_FORMAT_ERROR = -1 }; - enum asciiFormtLen { - DATETIME_FORMAT_DEFAULT_LEN = 10, // YYYY-MM-DD - DATETIME_FORMAT_USA_LEN = 10, // MM/DD/YYYY AM|PM - DATETIME_FORMAT_EUROPEAN_LEN = 10, // DD.MM.YYYY - DATETIME_FORMAT_DEFAULT2_LEN = 7, // YYYY-MM - DATETIME_FORMAT_USA2_LEN = 10, // MM/DD/YYYY - DATETIME_FORMAT_USA3_LEN = 10, // YYYY/MM/DD - DATETIME_FORMAT_USA4_LEN = 8, // YYYYMMDD - DATETIME_FORMAT_USA5_LEN = 8, // YY/MM/DD - DATETIME_FORMAT_USA6_LEN = 8, // MM/DD/YY - DATETIME_FORMAT_USA7_LEN = 10, // MM-DD-YYYY - DATETIME_FORMAT_USA8_LEN = 6, // YYYYMM - DATETIME_FORMAT_EUROPEAN2_LEN = 10, // DD-MM-YYYY - DATETIME_FORMAT_EUROPEAN3_LEN = 11, // DD-MON-YYYY - DATETIME_FORMAT_EUROPEAN4_LEN = 9, // DDMONYYYY - DATETIME_FORMAT_TIME1_LEN = 11, // 99:99:99:99 - DATETIME_FORMAT_TIME2_LEN = 12, // -99:99:99:99 - DATETIME_FORMAT_TS1_LEN = 14, // YYYYMMDDHH24MISS - DATETIME_FORMAT_TS2_LEN = 19, // DD.MM.YYYY:HH24:MI:SS - DATETIME_FORMAT_TS3_LEN = 19, // YYYY-MM-DD HH24:MI:SS - DATETIME_FORMAT_TS4_LEN = 8, // HH24:MI:SS - DATETIME_FORMAT_TS5_LEN = 17, // YYYYMMDD:HH24:MI:SS - DATETIME_FORMAT_TS6_LEN = 17, // MMDDYYYY HH24:MI:SS - DATETIME_FORMAT_TS7_LEN = 19, // MM/DD/YYYY HH24:MI:SS - DATETIME_FORMAT_TS8_LEN = 20, // DD-MON-YYYY HH:MI:SS - DATETIME_FORMAT_DATE_STR_LEN = -1, // format in str - DATETIME_FORMAT_TIME_STR_LEN = -1, // format in str - DATETIME_FORMAT_NONE_LEN = -1, - DATETIME_FORMAT_ERROR_LEN = -1 + + struct DatetimeFormatInfo + { + Lng32 format; // defined by enum DatetimeFormats + const char * str; // string representation of datetime format + Lng32 minLen; // minimum length to hold this format + Lng32 maxLen; }; + + static const DatetimeFormatInfo datetimeFormat[]; enum { DATETIME_MAX_NUM_FIELDS = 7 }; enum { MAX_DATETIME_SIZE = 11 }; @@ -224,6 +222,7 @@ NA_EIDPROC rec_datetime_field dstEndField, short dstFractPrec, char *dstData, + Lng32 dstLen, short validateFlag, NABoolean *roundedDownFlag = NULL); @@ -302,9 +301,7 @@ static CollHeap *heap, ComDiagsArea** diagsArea); -#ifndef __EID char *getDefaultStringValue(CollHeap *heap); -#endif // --------------------------------------------------------------------- // Redefinition of methods inherited from NAVersionedObject. @@ -323,11 +320,81 @@ static NA_EIDPROC virtual short getClassSize() { return (short)sizeof(*this); } // --------------------------------------------------------------------- + static const char * getDatetimeFormatStr(Lng32 frmt) + { + return datetimeFormat[frmt].str; + } + + static const Lng32 getDatetimeFormat(const char * formatStr) + { + for (Lng32 i = DATETIME_FORMAT_MIN; i <= DATETIME_FORMAT_MAX; i++) + { + if (strcmp(formatStr, datetimeFormat[i].str) == 0) + { + if (datetimeFormat[i].format != i) + return -1; + + return i; + } + } + + for (Lng32 i = DATETIME_FORMAT_MIN_NUM; i <= DATETIME_FORMAT_MAX_NUM; i++) + { + if (strcmp(formatStr, datetimeFormat[i].str) == 0) + { + if (datetimeFormat[i].format != i) + return -1; + + return i; + } + } + + return -1; + } + + static NABoolean isDateTimeFormat(Lng32 frmt) + { + return ((frmt >= DATETIME_FORMAT_MIN) && + (frmt <= DATETIME_FORMAT_MAX)); + } + + static NABoolean isDateFormat(Lng32 frmt) + { + return ((frmt >= DATETIME_FORMAT_MIN_DATE) && + (frmt <= DATETIME_FORMAT_MAX_DATE)); + } + + static NABoolean isTimestampFormat(Lng32 frmt) + { + return ((frmt >= DATETIME_FORMAT_MIN_TS) && + (frmt <= DATETIME_FORMAT_MAX_TS)); + } + + static NABoolean isTimeFormat(Lng32 frmt) + { + return ((frmt >= DATETIME_FORMAT_MIN_TIME) && + (frmt <= DATETIME_FORMAT_MAX_TIME)); + } + + static NABoolean isNumericFormat(Lng32 frmt) + { + return ((frmt == DATETIME_FORMAT_NUM1) || (frmt == DATETIME_FORMAT_NUM2)); + } + + static Lng32 getDatetimeFormatLen(Lng32 frmt) + { + return datetimeFormat[frmt].minLen; + } + + static Lng32 getDatetimeFormatMaxLen(Lng32 frmt) + { + return datetimeFormat[frmt].maxLen; + } + private: }; - #pragma warning ( default : 4251 ) #endif http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/681cad66/core/sql/exp/exp_function.cpp ---------------------------------------------------------------------- diff --git a/core/sql/exp/exp_function.cpp b/core/sql/exp/exp_function.cpp index 97be8c5..4e3211d 100644 --- a/core/sql/exp/exp_function.cpp +++ b/core/sql/exp/exp_function.cpp @@ -2534,9 +2534,8 @@ ex_expr::exp_return_type ex_function_dateformat::eval(char *op_data[], char *formatStr = op_data[2]; char *result = op_data[0]; - if ((getDateFormat() == ExpDatetime::DATETIME_FORMAT_TIME1) || - (getDateFormat() == ExpDatetime::DATETIME_FORMAT_TIME2) || - (getDateFormat() == ExpDatetime::DATETIME_FORMAT_TIME_STR)) + if ((getDateFormat() == ExpDatetime::DATETIME_FORMAT_NUM1) || + (getDateFormat() == ExpDatetime::DATETIME_FORMAT_NUM2)) { // numeric to TIME conversion. if(ExpDatetime::convNumericTimeToASCII(opData, @@ -2563,9 +2562,11 @@ ex_expr::exp_return_type ex_function_dateformat::eval(char *op_data[], if ((DFS2REC::isAnyCharacter(getOperand(1)->getDatatype())) && (DFS2REC::isDateTime(getOperand(0)->getDatatype()))) { + Lng32 sourceLen = getOperand(1)->getLength(op_data[-MAX_OPERANDS+1]); + ExpDatetime *datetimeOpType = (ExpDatetime *) getOperand(0); if(datetimeOpType->convAsciiToDate(opData, - getOperand(1)->getLength(), + sourceLen, result, getOperand(0)->getLength(), getDateFormat(), @@ -2573,10 +2574,13 @@ ex_expr::exp_return_type ex_function_dateformat::eval(char *op_data[], diagsArea, 0) < 0) { - ExRaiseFunctionSqlError(heap, diagsArea, EXE_INTERNAL_ERROR, - derivedFunction(), - origFunctionOperType()); - + if (diagsArea && (*diagsArea) && + (*diagsArea)->getNumber(DgSqlCode::ERROR_) == 0) + { + ExRaiseFunctionSqlError(heap, diagsArea, EXE_INTERNAL_ERROR, + derivedFunction(), + origFunctionOperType()); + } return ex_expr::EXPR_ERROR; } } @@ -2584,7 +2588,7 @@ ex_expr::exp_return_type ex_function_dateformat::eval(char *op_data[], { ExpDatetime *datetimeOpType = (ExpDatetime *) getOperand(1); if(datetimeOpType->convDatetimeToASCII(opData, - result, + result, getOperand(0)->getLength(), getDateFormat(), formatStr, @@ -4434,12 +4438,14 @@ Lng32 ex_function_hivehash::hashForCharType(char* data, Lng32 length) { // To compute: SUM (i from 0 to n-1) (s(i) * 31^(n-1-i) + ULng32 resultCopy = 0; ULng32 result = (ULng32)data[0]; for (Lng32 i=1; i<length; i++ ) { // perform result * 31, optimized as (result <<5 - result) - result << 5; - result -= result; + resultCopy = result; + result <<= 5; + result -= resultCopy; result += (ULng32)(data[i]); } http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/681cad66/core/sql/generator/GenExpGenerator.cpp ---------------------------------------------------------------------- diff --git a/core/sql/generator/GenExpGenerator.cpp b/core/sql/generator/GenExpGenerator.cpp index 5629bda..c03e369 100644 --- a/core/sql/generator/GenExpGenerator.cpp +++ b/core/sql/generator/GenExpGenerator.cpp @@ -294,7 +294,7 @@ Attributes * ExpGenerator::convertNATypeToAttributes attr->setIsoMapping((CharInfo::CharSet)SqlParser_ISO_MAPPING); - if (naType->getTypeQualifier() == NA_CHARACTER_TYPE) + if (naType->getTypeQualifier() == NA_CHARACTER_TYPE) { const CharType *charType = (CharType *)naType; @@ -378,6 +378,7 @@ Attributes * ExpGenerator::convertNATypeToAttributes Int16 scale = lobLen & 0xFFFF; attr->setPrecision(precision); attr->setScale(scale); + attr->setCharSet(lobType->getCharSet()); } else http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/681cad66/core/sql/generator/GenItemFunc.cpp ---------------------------------------------------------------------- diff --git a/core/sql/generator/GenItemFunc.cpp b/core/sql/generator/GenItemFunc.cpp index 8c8f7e6..d328900 100644 --- a/core/sql/generator/GenItemFunc.cpp +++ b/core/sql/generator/GenItemFunc.cpp @@ -1851,143 +1851,11 @@ short DateFormat::codeGen(Generator * generator) -1) == 1) return 0; - Int32 expDateFormat = ExpDatetime::DATETIME_FORMAT_ERROR; - switch (getDateFormat()) - { - case DEFAULT: - expDateFormat = ExpDatetime::DATETIME_FORMAT_DEFAULT; - break; - - case USA: - expDateFormat = ExpDatetime::DATETIME_FORMAT_USA; - break; - - case EUROPEAN: - expDateFormat = ExpDatetime::DATETIME_FORMAT_EUROPEAN; - break; - - case DATE_FORMAT_STR: - { - if (child(1)->castToItemExpr()->getOperatorType() == ITM_CONSTANT) - { - ConstValue * cv = (ConstValue*)(child(1)->castToItemExpr()); - if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "YYYY-MM-DD") - expDateFormat = ExpDatetime::DATETIME_FORMAT_DEFAULT; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "YYYY-MM") - expDateFormat = ExpDatetime::DATETIME_FORMAT_DEFAULT2; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "MM/DD/YYYY") - expDateFormat = ExpDatetime::DATETIME_FORMAT_USA2; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "YYYY/MM/DD") - expDateFormat = ExpDatetime::DATETIME_FORMAT_USA3; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "YYYYMMDD") - expDateFormat = ExpDatetime::DATETIME_FORMAT_USA4; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "YY/MM/DD") - expDateFormat = ExpDatetime::DATETIME_FORMAT_USA5; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "MM/DD/YY") - expDateFormat = ExpDatetime::DATETIME_FORMAT_USA6; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "MM-DD-YYYY") - expDateFormat = ExpDatetime::DATETIME_FORMAT_USA7; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "YYYYMM") - expDateFormat = ExpDatetime::DATETIME_FORMAT_USA8; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "DD.MM.YYYY") - expDateFormat = ExpDatetime::DATETIME_FORMAT_EUROPEAN; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "DD-MM-YYYY") - expDateFormat = ExpDatetime::DATETIME_FORMAT_EUROPEAN2; - else if ((NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "DD-MMM-YYYY") || - (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "DD-MON-YYYY")) - expDateFormat = ExpDatetime::DATETIME_FORMAT_EUROPEAN3; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "DDMONYYYY") - expDateFormat = ExpDatetime::DATETIME_FORMAT_EUROPEAN4; - else - expDateFormat = ExpDatetime::DATETIME_FORMAT_DATE_STR; - } - else - { - expDateFormat = ExpDatetime::DATETIME_FORMAT_DATE_STR; - } - } - break; - - case TIME_FORMAT_STR: - { - if (child(1)->castToItemExpr()->getOperatorType() == ITM_CONSTANT) - { - ConstValue * cv = (ConstValue*)(child(1)->castToItemExpr()); - if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "99:99:99:99") - expDateFormat = ExpDatetime::DATETIME_FORMAT_TIME1; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "-99:99:99:99") - expDateFormat = ExpDatetime::DATETIME_FORMAT_TIME2; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "HH24:MI:SS") - expDateFormat = ExpDatetime::DATETIME_FORMAT_TS4; - else - expDateFormat = ExpDatetime::DATETIME_FORMAT_TIME_STR; - } - else - { - expDateFormat = ExpDatetime::DATETIME_FORMAT_TIME_STR; - } - } - break; - - case TIMESTAMP_FORMAT_STR: - { - if (child(1)->castToItemExpr()->getOperatorType() == ITM_CONSTANT) - { - ConstValue * cv = (ConstValue*)(child(1)->castToItemExpr()); - - if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "YYYYMMDDHH24MISS") - expDateFormat = ExpDatetime::DATETIME_FORMAT_TS1; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "DD.MM.YYYY:HH24:MI:SS") - expDateFormat = ExpDatetime::DATETIME_FORMAT_TS2; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "YYYY-MM-DD HH24:MI:SS") - expDateFormat = ExpDatetime::DATETIME_FORMAT_TS3; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "YYYYMMDD:HH24:MI:SS") - expDateFormat = ExpDatetime::DATETIME_FORMAT_TS5; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "MMDDYYYY HH24:MI:SS") - expDateFormat = ExpDatetime::DATETIME_FORMAT_TS6; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "MM/DD/YYYY HH24:MI:SS") - expDateFormat = ExpDatetime::DATETIME_FORMAT_TS7; - else if (NAString((char*)(cv->getConstValue()), cv->getStorageSize()) - == "DD-MON-YYYY HH:MI:SS") - expDateFormat = ExpDatetime::DATETIME_FORMAT_TS8; - else - { - expDateFormat = ExpDatetime::DATETIME_FORMAT_DATE_STR; - } - } - } - break; - - }; - ex_clause * function_clause = new(generator->getSpace()) ex_function_dateformat(getOperatorType(), attr, generator->getSpace(), - expDateFormat); + getExpDatetimeFormat()); generator->getExpGenerator()->linkClause(this, function_clause); return 0; @@ -2842,6 +2710,9 @@ short LOBinsert::codeGen(Generator * generator) li->setLobStorageLocation((char*)lobStorageLocation().data()); li->setLobMaxSize(getLobMaxSize()); li->setLobMaxChunkMemSize(getLobMaxChunkMemSize()); + li->setLobGCLimit(getLobGCLimit()); + li->setLobHdfsServer((char *)getLobHdfsServer().data()); + li->setLobHdfsPort(getLobHdfsPort()); generator->getExpGenerator()->linkClause(this, li); return 0; @@ -2867,7 +2738,8 @@ short LOBdelete::codeGen(Generator * generator) ld->lobNum() = lobNum(); ld->setLobStorageType(lobStorageType()); ld->setLobStorageLocation((char*)lobStorageLocation().data()); - + ld->setLobHdfsServer((char *)getLobHdfsServer().data()); + ld->setLobHdfsPort(getLobHdfsPort()); generator->getExpGenerator()->linkClause(this, ld); return 0; @@ -2911,6 +2783,9 @@ short LOBupdate::codeGen(Generator * generator) lu->setLobStorageLocation((char*)lobStorageLocation().data()); lu->setLobMaxSize(getLobMaxSize()); lu->setLobMaxChunkMemSize(getLobMaxChunkMemSize()); + lu->setLobGCLimit(getLobGCLimit()); + lu->setLobHdfsServer((char *)getLobHdfsServer().data()); + lu->setLobHdfsPort(getLobHdfsPort()); generator->getExpGenerator()->linkClause(this, lu); return 0; @@ -2932,7 +2807,8 @@ short LOBselect::codeGen(Generator * generator) ls->lobNum() = lobNum(); ls->setLobStorageType(lobStorageType()); ls->setLobStorageLocation((char*)lobStorageLocation().data()); - + ls->setLobHdfsServer((char *)getLobHdfsServer().data()); + ls->setLobHdfsPort(getLobHdfsPort()); generator->getExpGenerator()->linkClause(this, ls); return 0; @@ -2960,7 +2836,8 @@ short LOBconvertHandle::codeGen(Generator * generator) lu->lobNum() = lobNum(); lu->setLobStorageType(lobStorageType()); lu->setLobStorageLocation((char*)lobStorageLocation().data()); - + lu->setLobHdfsServer((char *)getLobHdfsServer().data()); + lu->setLobHdfsPort(getLobHdfsPort()); generator->getExpGenerator()->linkClause(this, lu); return 0; @@ -2990,6 +2867,8 @@ short LOBconvert::codeGen(Generator * generator) lc->setLobStorageLocation((char*)lobStorageLocation().data()); generator->getExpGenerator()->linkClause(this, lc); lc->setConvertSize(getTgtSize()); + lc->setLobHdfsServer((char *)getLobHdfsServer().data()); + lc->setLobHdfsPort(getLobHdfsPort()); return 0; } http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/681cad66/core/sql/generator/GenPreCode.cpp ---------------------------------------------------------------------- diff --git a/core/sql/generator/GenPreCode.cpp b/core/sql/generator/GenPreCode.cpp index e6a3e01..2752e61 100644 --- a/core/sql/generator/GenPreCode.cpp +++ b/core/sql/generator/GenPreCode.cpp @@ -4824,7 +4824,7 @@ RelExpr * HbaseDelete::preCodeGen(Generator * generator, } NABoolean isAlignedFormat = getTableDesc()->getNATable()->isAlignedFormat(getIndexDesc()); - if (producesOutputs()) + if (producesOutputs()) { retColRefSet_ = getIndexDesc()->getIndexColumns(); } @@ -4890,6 +4890,15 @@ RelExpr * HbaseDelete::preCodeGen(Generator * generator, // value is needed to retrieve a row. HbaseAccess::addColReferenceFromVIDlist(getIndexDesc()->getIndexKey(), retColRefSet_); } + + if (getTableDesc()->getNATable()->hasLobColumn()) + { + for (Lng32 i = 0; i < getIndexDesc()->getIndexColumns().entries(); i++) + { + const ValueId vid = getIndexDesc()->getIndexColumns()[i]; + retColRefSet_.insert(vid); + } + } } NABoolean inlinedActions = FALSE; @@ -4915,8 +4924,9 @@ RelExpr * HbaseDelete::preCodeGen(Generator * generator, uniqueHbaseOper() = FALSE; if ((generator->oltOptInfo()->multipleRowsReturned()) && (CmpCommon::getDefault(HBASE_ROWSET_VSBB_OPT) == DF_ON) && - (NOT generator->isRIinliningForTrafIUD())) - uniqueRowsetHbaseOper() = TRUE; + (NOT generator->isRIinliningForTrafIUD()) && + (NOT getTableDesc()->getNATable()->hasLobColumn())) + uniqueRowsetHbaseOper() = TRUE; } else if (isUnique) @@ -4933,7 +4943,8 @@ RelExpr * HbaseDelete::preCodeGen(Generator * generator, { if ((generator->oltOptInfo()->multipleRowsReturned()) && (CmpCommon::getDefault(HBASE_ROWSET_VSBB_OPT) == DF_ON) && - (NOT generator->isRIinliningForTrafIUD())) + (NOT generator->isRIinliningForTrafIUD()) && + (NOT getTableDesc()->getNATable()->hasLobColumn())) uniqueRowsetHbaseOper() = TRUE; else if ((NOT generator->oltOptInfo()->multipleRowsReturned()) && (listOfDelUniqueRows_.entries() == 0)) @@ -4945,15 +4956,24 @@ RelExpr * HbaseDelete::preCodeGen(Generator * generator, } } } - else if (producesOutputs()) + + if ((producesOutputs()) && + ((NOT isUnique) || (getUpdateCKorUniqueIndexKey()))) { // Cannot do olt msg opt if: // -- values are to be returned and unique operation is not being used. + // -- or this delete was transformed from an update of pkey/index key // set an indication that multiple rows will be returned. generator->oltOptInfo()->setMultipleRowsReturned(TRUE); generator->oltOptInfo()->setOltCliOpt(FALSE); } + if (getTableDesc()->getNATable()->hasLobColumn()) + { + canDoCheckAndUpdel() = FALSE; + uniqueRowsetHbaseOper() = FALSE; + } + generator->setUpdSavepointOnError(FALSE); generator->setUpdPartialOnError(FALSE); @@ -4988,7 +5008,7 @@ RelExpr * HbaseDelete::preCodeGen(Generator * generator, // flag for hbase tables generator->setHdfsAccess(TRUE); - + markAsPreCodeGenned(); return this; @@ -11386,7 +11406,7 @@ NABoolean HbaseAccess::isHbaseFilterPredV2(Generator * generator, ItemExpr * ie, } //check if not an added column with default non null if ((foundBinary || foundUnary)&& (NOT hbaseLookupPred)){ - if (colVID.isAddedColumnWithNonNullDefault()){ + if (colVID.isColumnWithNonNullNonCurrentDefault()){ foundBinary=FALSE; foundUnary=FALSE; } @@ -11827,7 +11847,7 @@ RelExpr * HbaseAccess::preCodeGen(Generator * generator, { if (originExePreds->isNotNullable(vid)){// it is non nullable OperatorTypeEnum operatorType = vid.getItemExpr()->getOperatorType(); - if ((operatorType == ITM_BASECOLUMN || operatorType == ITM_INDEXCOLUMN) && !vid.isAddedColumnWithNonNullDefault()){//check if added and with default... notgood + if ((operatorType == ITM_BASECOLUMN || operatorType == ITM_INDEXCOLUMN) && !vid.isColumnWithNonNullNonCurrentDefault()){//check if with non null or non current default... notgood needAddingNonNullableColumn = false; // we found one column meeting all criteria break; } http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/681cad66/core/sql/generator/GenRelUpdate.cpp ---------------------------------------------------------------------- diff --git a/core/sql/generator/GenRelUpdate.cpp b/core/sql/generator/GenRelUpdate.cpp index e544c36..ec5c3b4 100644 --- a/core/sql/generator/GenRelUpdate.cpp +++ b/core/sql/generator/GenRelUpdate.cpp @@ -787,6 +787,7 @@ short HbaseDelete::codeGen(Generator * generator) ex_expr *convert_expr = NULL; ex_expr * keyColValExpr = NULL; ex_expr *preCondExpr = NULL; + ex_expr *lobExpr = NULL; ex_cri_desc * givenDesc = generator->getCriDesc(Generator::DOWN); @@ -891,6 +892,7 @@ short HbaseDelete::codeGen(Generator * generator) ULng32 convertRowLen = 0; + ValueIdList lobDelVIDlist; for (CollIndex ii = 0; ii < numColumns; ii++) { ItemExpr * col_node = ((columnList[ii]).getValueDesc())->getItemExpr(); @@ -917,6 +919,15 @@ short HbaseDelete::codeGen(Generator * generator) castValue->bindNode(generator->getBindWA()); convertExprCastVids.insert(castValue->getValueId()); + + if (col_node->getValueId().getType().isLob()) + { + ItemExpr * ld = new(generator->wHeap()) + LOBdelete(castValue); + ld->bindNode(generator->getBindWA()); + lobDelVIDlist.insert(ld->getValueId()); + } + } // for (ii = 0; ii < numCols; ii++) // Add ascii columns to the MapTable. After this call the MapTable @@ -1060,7 +1071,39 @@ short HbaseDelete::codeGen(Generator * generator) expGen->generateExpr(newPredTree->getValueId(), ex_expr::exp_SCAN_PRED, &scanExpr); } - + + ex_expr * lobDelExpr = NULL; + if (getTableDesc()->getNATable()->hasLobColumn()) + { + // generate code to delete rows from LOB desc table + expGen->generateListExpr(lobDelVIDlist, + ex_expr::exp_ARITH_EXPR, &lobDelExpr); + } + +#ifdef __ignore + ex_expr * lobDelExpr = NULL; + if (getTableDesc()->getNATable()->hasLobColumn()) + { + // generate code to delete rows from LOB desc table + + ValueIdList lobDelVIDlist; + for (Lng32 i = 0; i < getIndexDesc()->getIndexColumns().entries(); i++) + { + const ValueId vid = getIndexDesc()->getIndexColumns()[i]; + if (vid.getType().isLob()) + { + ItemExpr * ld = new(generator->wHeap()) + LOBdelete(vid.getItemExpr()); + ld->bindNode(generator->getBindWA()); + lobDelVIDlist.insert(ld->getValueId()); + } + } + + expGen->generateListExpr(lobDelVIDlist, + ex_expr::exp_ARITH_EXPR, &lobDelExpr); + } +#endif + ULng32 rowIdAsciiRowLen = 0; ExpTupleDesc * rowIdAsciiTupleDesc = 0; ex_expr * rowIdExpr = NULL; @@ -1219,7 +1262,7 @@ short HbaseDelete::codeGen(Generator * generator) scanExpr, rowIdExpr, NULL, // updateExpr - NULL, // mergeInsertExpr + lobDelExpr, // NULL, // mergeInsertExpr NULL, // mergeInsertRowIdExpr NULL, // mergeUpdScanExpr NULL, // projExpr http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/681cad66/core/sql/generator/Generator.cpp ---------------------------------------------------------------------- diff --git a/core/sql/generator/Generator.cpp b/core/sql/generator/Generator.cpp index 2486755..d1e174b 100644 --- a/core/sql/generator/Generator.cpp +++ b/core/sql/generator/Generator.cpp @@ -1979,6 +1979,7 @@ desc_struct * Generator::createVirtualTableDesc( index_desc->body.indexes_desc.tablename = table_desc->body.table_desc.tablename; index_desc->body.indexes_desc.indexname = table_desc->body.table_desc.tablename; index_desc->body.indexes_desc.keytag = 0; // primary index + index_desc->body.indexes_desc.indexUID = 0; index_desc->body.indexes_desc.record_length = table_desc->body.table_desc.record_length; index_desc->body.indexes_desc.colcount = table_desc->body.table_desc.colcount; index_desc->body.indexes_desc.isVerticalPartition = 0; @@ -1989,8 +1990,10 @@ desc_struct * Generator::createVirtualTableDesc( index_desc->body.indexes_desc.rowFormat = table_desc->body.table_desc.rowFormat; if (tableInfo) { - index_desc->body.indexes_desc.numSaltPartns = tableInfo->numSaltPartns; - if (tableInfo->hbaseCreateOptions) + index_desc->body.indexes_desc.indexUID = tableInfo->objUID; + + index_desc->body.indexes_desc.numSaltPartns = tableInfo->numSaltPartns; + if (tableInfo->hbaseCreateOptions) { index_desc->body.indexes_desc.hbaseCreateOptions = new HEAP char[strlen(tableInfo->hbaseCreateOptions) + 1]; @@ -1998,7 +2001,7 @@ desc_struct * Generator::createVirtualTableDesc( tableInfo->hbaseCreateOptions); } } - + if (numIndexes > 0) { desc_struct * prev_desc = index_desc; @@ -2014,6 +2017,7 @@ desc_struct * Generator::createVirtualTableDesc( curr_index_desc->body.indexes_desc.indexname = new HEAP char[strlen(indexInfo[i].indexName)+1]; strcpy(curr_index_desc->body.indexes_desc.indexname, indexInfo[i].indexName); + curr_index_desc->body.indexes_desc.indexUID = indexInfo[i].indexUID; curr_index_desc->body.indexes_desc.keytag = indexInfo[i].keytag; curr_index_desc->body.indexes_desc.unique = indexInfo[i].isUnique; curr_index_desc->body.indexes_desc.isCreatedExplicitly = indexInfo[i].isExplicit; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/681cad66/core/sql/nskgmake/Makerules.linux ---------------------------------------------------------------------- diff --git a/core/sql/nskgmake/Makerules.linux b/core/sql/nskgmake/Makerules.linux index a707a5e..d0b0e63 100755 --- a/core/sql/nskgmake/Makerules.linux +++ b/core/sql/nskgmake/Makerules.linux @@ -423,10 +423,10 @@ copytoolslibs: cp -Pf $(THRIFT_LIB_DIR)/$(THRIFT_SO)* $(LIBROOT) cp -Pf $(THRIFT_LIB_DIR)/libthrift.so $(LIBROOT) # if these are not found, then... - -cp -Pf $(HADOOP_LIB_DIR)/$(LIBHDFS_SO)* $(LIBROOT) - -cp -Pf $(HADOOP_LIB_DIR)/$(LIBHADOOP_SO)* $(LIBROOT) - -cp -Pf $(HADOOP_INC_DIR)/hdfs.h $(MY_SQROOT)/export/include - # download Hadoop source and build the hdfs library + -cp -Pf $(HADOOP_BLD_LIB)/$(LIBHDFS_SO)* $(LIBROOT) + -cp -Pf $(HADOOP_BLD_LIB)/$(LIBHADOOP_SO)* $(LIBROOT) + -cp -Pf $(HADOOP_BLD_INC)/hdfs.h $(MY_SQROOT)/export/include + # download Hadoop-common distro get_libhdfs_files --verbose linuxmklinksdebug linuxmklinksrelease: copytoolslibs http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/681cad66/core/sql/nskgmake/SqlCompilerDebugger/Makefile ---------------------------------------------------------------------- diff --git a/core/sql/nskgmake/SqlCompilerDebugger/Makefile b/core/sql/nskgmake/SqlCompilerDebugger/Makefile index e34afa2..2d49b72 100644 --- a/core/sql/nskgmake/SqlCompilerDebugger/Makefile +++ b/core/sql/nskgmake/SqlCompilerDebugger/Makefile @@ -35,9 +35,10 @@ FINAL_DLLS += $(CMPGUI_FINAL) $(CMPGUI_FINAL) : cmpdbg_qt_build +# optional component, ignore cp return code cmpdbg_qt_build : - cd ../$(basename $(CMPGUI_OBJ)) && . ./mk.sh; \ - cp -f $$PWD/$(LIBPREFIX)$(notdir $(obj)) $(CMPGUI_FINAL); + cd ../$(basename $(CMPGUI_OBJ)) && . ./mk.sh + -cp -f ../$(basename $(CMPGUI_OBJ))/$(LIBPREFIX)$(notdir $(obj)) $(CMPGUI_FINAL) #when clean, this clean first
