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
 

Reply via email to