Github user DaveBirdsall commented on a diff in the pull request:
https://github.com/apache/incubator-trafodion/pull/371#discussion_r55446935
--- Diff: core/sql/exp/exp_datetime.cpp ---
@@ -2410,773 +2550,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;
+
+ // 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;
- }
- srcData += 2;
+ // 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;
--- End diff --
Do we need to add 2000 to (short)dstData when it is a YY format (as opposed
to a YYYY format)?
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---