/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
**********************************************************************/
/* -*-C++-*-
 *****************************************************************************
 *
 * File:         BaseTypes.cpp
 * Description:  Implementation for common data types and utility functions
 *
 *
 * Created:      7/7/95
 * Language:     C++
 *
 *
 *
 *****************************************************************************
 */

#include "Platform.h"

#include "BaseTypes.h"
#include "NAError.h"
#ifdef SQLPARSERGLOBALS_FLAGS
#include "SqlParserGlobals.h"
#else
// stub out a method that is implemented in the parser
//static void Set_SqlParser_Flags(unsigned long) {}
#endif

#include <stdlib.h>		// exit(), in NAExit()

#include "seabed/fs.h"
#include "seabed/ms.h"
extern void my_mpi_fclose();

#include "str.h"
#include "charinfo.h"
#include "SQLTypeDefs.h"
#include "dfs2rec.h"
#include "sqlcli.h"
#include "ComSmallDefs.h"
#include "CompException.h"
#include "StmtCompilationMode.h"

extern void releaseRTSSemaphore();  // Functions implemented in SqlStats.cpp

void NADebug()
{
  if (getenv("SQL_DEBUGLOOP") == NULL)
   DebugBreak();
  else
  {Int32 dbgv = 1;
   Int32 woody; // as in Woody Allen aka Sleeper.

   while (dbgv == 1)
   { woody = SleepEx(100,FALSE); // delay 0.1 seconds
     dbgv = 2 - dbgv;  // another way of saying, "leave dbgv at 1"
   };

  }

}


// Called by NAAbort, NAAssert, CollHeap, EHExceptionHandler::throwException
// as the NAError.h #define ARKCMP_EXCEPTION_EPILOGUE().
//
void NAArkcmpExceptionEpilogue()
{
#ifdef SQLPARSERGLOBALS_FLAGS
  Set_SqlParser_Flags(0);  // see CmpMain::sqlcompCleanup and Parser::parseDML
#endif
  NAError_stub_for_breakpoints();
}

// wrapper for exit(), calling NAError_stub_for_breakpoints() first
void NAExit(Int32 status)
{
    NAAssertMutexLock(); // Serialize termination
    releaseRTSSemaphore();
  if (status)
    NAError_stub_for_breakpoints();
  if (status != 0)
    {
#ifndef _DEBUG
  char *abortOnError = getenv("ABORT_ON_ERROR");
  if (abortOnError != NULL)
     abort();
  else
  if (IdentifyMyself::GetMyName() == I_AM_EMBEDDED_SQL_COMPILER)
     AssertException("", __FILE__, __LINE__).throwException();
   else
#endif
     abort();  // this will create core file on Linux
  }
  else
    // Calling my_mpi_fclose explicitly fixes the problem reported in bug 2243
    // for callers of NAExit(0) which is that registering it via the atexit
    // function does not guarantee that at process termination time
    // msg_mon_process_shutdown will be called before Seabed termination code
    // which requires msg_mon_process_shutdown to be called first.
    {
      my_mpi_fclose();
    }
   exit(status);
}


// This function is intended to help people debug code;
// this is simply a stub function to speed up the hunting down of errors.
//
// Just set a breakpoint here, then look at the stack trace
// to see how you got here.
//
// Of course, for this to work, all error routines have to call this function.
// I've gone through and tried to make them all do this.
// If you find/write another error routine, please add a line to call this
// function in order to make this effort more complete!
//
void NAError_stub_for_breakpoints()
{ /*** delete cmpCurrentContext; cmpCurrentContext = NULL; ***/ }


// A helper function to convert a given datetime field to its Text
const char*
dtFieldToText(rec_datetime_field field)
{
  switch(field)
  {
  case REC_DATE_YEAR:
    return "YEAR";
  case REC_DATE_MONTH:
    return "MONTH";
  case REC_DATE_DAY:
    return "DAY";
  case REC_DATE_HOUR:
    return "HOUR";
  case REC_DATE_MINUTE:
    return "MINUTE";
  case REC_DATE_SECOND:
    return "SECOND";
  case REC_DATE_FRACTION_MP:
    return "FRACTION";
  default:
    return NULL;
  }
}


// A helper function to produce datetime qualifier. This method
// mimics DatetimeType::getDatetimeQualifierAsString().
void
getDatetimeQualifierAsString(char *text,                       // OUTPUT
                             rec_datetime_field startField,    // INPUT
                             rec_datetime_field endField,      // INPUT
                             UInt32 fractionPrecision,       // INPUT
                             NABoolean includeFractionalPrec)  // INPUT
{
  if (endField >= REC_DATE_SECOND && includeFractionalPrec) // &&
    //      (fractionPrecision > 0 || !isSqlMpDatetime))
  {
    text += str_len(text);
    str_sprintf(text, "(%u)", fractionPrecision);
  }
}

// A helper function to convert a datetime type to its Text.
// This method mimics DatetimeType::getTypeSQLname().
// Return -1 in case of error, 0 if everything is okay
short
getDateTimeTypeText(char *text,                    // OUTPUT
                    rec_datetime_field startField, // INPUT
                    rec_datetime_field endField,   // INPUT
                    UInt32 fractionPrecision)    // INPUT
{
  switch (startField)
  {
    case REC_DATE_YEAR:
      switch (endField)
      {
        case REC_DATE_DAY:             // YEAR TO DAY == DATE
          str_sprintf(text, "DATE");
          text += str_len("DATE");
          getDatetimeQualifierAsString(text,
                                       startField,
                                       endField,
                                       fractionPrecision,
                                       TRUE);      // includeFranctionalPrec
          return 0;

        case REC_DATE_SECOND:          // YEAR TO SECOND == TIMESTAMP
        case REC_DATE_FRACTION_MP:
          str_sprintf(text, "TIMESTAMP");
          text += str_len("TIMESTAMP");
          getDatetimeQualifierAsString(text,
                                       startField,
                                       endField,
                                       fractionPrecision,
                                       TRUE);      // includeFranctionalPrec
          return 0;

        case REC_DATE_YEAR:
        case REC_DATE_MONTH:
        case REC_DATE_HOUR:
        case REC_DATE_MINUTE:
          return 0;

        default:
          return -1;
      }    // end switch on endfield
      break;

    case REC_DATE_HOUR:
      switch (endField)
      {
        case REC_DATE_SECOND:          // HOUR TO SECOND == TIME
        case REC_DATE_FRACTION_MP:
          str_sprintf(text, "TIME");
          text += str_len("TIME");
          getDatetimeQualifierAsString(text,
                                       startField,
                                       endField,
                                       fractionPrecision,
                                       TRUE);      // includeFranctionalPrec
          return 0;

        case REC_DATE_HOUR:
        case REC_DATE_MINUTE:
          return 0;

        default:
          return -1;
      }    // end switch on endfield
      break;

    case REC_DATE_MONTH:
    case REC_DATE_DAY:
    case REC_DATE_MINUTE:
    case REC_DATE_SECOND:
    case REC_DATE_FRACTION_MP:
      if (startField <= endField)
      {
        return 0;
      }
      else
        return -1;

    default:
      return -1;
  } // end switch on startField

} // getDateTimeTypeText()


// A helper function convert an Interval type to its Text
short
getIntervalTypeText(char *text,                       // OUTPUT
                    rec_datetime_field datetimestart, // INPUT
                    UInt32 intervalleadingprec,     // INPUT
                    rec_datetime_field datetimeend,   // INPUT
                    UInt32 fractionPrecision)       // INPUT
{
  if (datetimestart >= REC_DATE_SECOND)
  {
    str_sprintf(text,
                "INTERVAL %s(%u,%u)",
                dtFieldToText(datetimestart),
                intervalleadingprec,
                fractionPrecision);
  }
  else if (datetimestart == datetimeend)
  {
    str_sprintf(text,
                "INTERVAL %s(%u)",
                dtFieldToText(datetimestart),
                intervalleadingprec);
  }
  else
  {
    if (datetimeend < REC_DATE_SECOND)
    {
      str_sprintf(text,
                  "INTERVAL %s(%u) TO %s",
                  dtFieldToText(datetimestart),
                  intervalleadingprec,
                  dtFieldToText(datetimeend));
    }
    else
    {
       str_sprintf(text,
                   "INTERVAL %s(%u) TO %s(%u)",
                   dtFieldToText(datetimestart),
                   intervalleadingprec,
                   dtFieldToText(datetimeend),
                   fractionPrecision);
    }
  }

  return 0;
} // getIntervalTypeText()

// A helper function.
//
// Note about this function: This function used to be part of
// NAType and used to use NADatetimeType and NAIntervalType types. To
// make the same functionality available in executor (where NATypes are
// not available) we moved this functionality out of NAType.
// All the required information to find the type is input to this
// function. The helper methods getDatetimeQualifierAsString() and
// getIntervalTypeText() above have code that resemble the code from
// NADatetimeType and NAIntervalType.
//
// This method returns a text representation of the datatype
// based on the datatype information input to this method.
//
// Returns -1 in case of error, 0 if all is ok.
short convertTypeToText_basic(char * text,	   // OUTPUT
			      Lng32 fs_datatype,    // all other vars: INPUT
			      Lng32 length,
			      Lng32 precision,
			      Lng32 scale,
			      rec_datetime_field datetimestart,
			      rec_datetime_field datetimeend,
			      short datetimefractprec,
			      short intervalleadingprec,
			      short upshift,
			      short caseinsensitive,
                              CharInfo::CharSet charSet,
                              const char * collation_name,
                              const char * displaydatatype,
			      short displayCaseSpecific)
{
  short addCharSet = 0;
  short addCollate = 0;

  switch (fs_datatype)
  {
    case REC_BIN64_SIGNED:
      if ((!precision) && (scale == 0))
	str_sprintf(text, "LARGEINT");
      else
	{
	  if (! precision)
	    str_sprintf(text, "NUMERIC(%d, %d)",
			18/*MAX_NUMERIC_PRECISION*/, scale);
	  else
	    str_sprintf(text, "NUMERIC(%d, %d)", precision, scale);
	}
      break;

    case REC_BIN64_UNSIGNED:
      if ((!precision) && (scale == 0))
	str_sprintf(text, "LARGEINT UNSIGNED");
      else
	{
	  if (! precision)
	    str_sprintf(text, "NUMERIC(%d, %d) UNSIGNED",
			18/*MAX_NUMERIC_PRECISION*/, scale);
	  else
	    str_sprintf(text, "NUMERIC(%d, %d) UNSIGNED", precision, scale);
	}
      break;

    case REC_BIN32_SIGNED:
      if (!precision)
	str_sprintf(text, "INT");
      else
	str_sprintf(text, "NUMERIC(%d, %d)", precision, scale);
      break;

    case REC_BIN16_SIGNED:
      if (!precision)
      {
        if (displaydatatype && !str_cmp_c(displaydatatype, "BYTEINT"))
          str_sprintf(text, displaydatatype);
        else
          str_sprintf(text, "SMALLINT");
      }
      else
	str_sprintf(text, "NUMERIC(%d, %d)", precision, scale);

      break;

    case REC_BIN8_SIGNED:
      if (!precision)
        str_sprintf(text, "TINYINT");
      else
	str_sprintf(text, "NUMERIC(%d, %d)", precision, scale);
      break;

    case REC_BIN32_UNSIGNED:
      if (!precision)
	str_sprintf(text, "INT UNSIGNED");
      else
	str_sprintf(text, "NUMERIC(%d, %d) UNSIGNED", precision, scale);
      break;

    case REC_BIN16_UNSIGNED:
      if (!precision)
	str_sprintf(text, "SMALLINT UNSIGNED");
      else
	str_sprintf(text, "NUMERIC(%d, %d) UNSIGNED", precision, scale);
      break;

    case REC_BIN8_UNSIGNED:
      if (!precision)
        str_sprintf(text, "TINYINT UNSIGNED");
      else
	str_sprintf(text, "NUMERIC(%d, %d)  UNSIGNED", precision, scale);
      break;

    case REC_BPINT_UNSIGNED:
      str_sprintf(text, "BIT PRECISION INT(%d) UNSIGNED", precision);
      break;

    case REC_DECIMAL_LSE:
      str_sprintf(text, "DECIMAL(%d, %d)", length, scale);

      break;
    case REC_DECIMAL_UNSIGNED:
      str_sprintf(text, "DECIMAL(%d, %d) UNSIGNED", length, scale);
      break;

    case REC_NUM_BIG_SIGNED:
      str_sprintf(text, "NUMERIC(%d, %d)", precision, scale);
      break;

    case REC_NUM_BIG_UNSIGNED:
      str_sprintf(text, "NUMERIC(%d, %d) UNSIGNED", precision, scale);
      break;

    case REC_FLOAT32:
      if (precision == 0)
	str_sprintf(text, "REAL");
      else
	str_sprintf(text, "FLOAT(%d)", precision);
      break;

    case REC_FLOAT64:
      if (precision == 0)
	str_sprintf(text, "DOUBLE PRECISION");
      else
	str_sprintf(text, "FLOAT(%d)", precision);
      break;

    case REC_BYTE_F_ASCII:
      addCharSet = 1;
#ifdef IS_MP
      if(CharInfo::is_NCHAR_MP(charSet))
	str_sprintf(text, "CHAR(%d)", length/2);
      else
#endif
      if (charSet == CharInfo::UTF8 || charSet == CharInfo::SJIS)
      {
        if(displaydatatype && strlen(displaydatatype) > 0)
        {
          str_sprintf(text, displaydatatype);
          if(str_str(displaydatatype, " CHARACTER SET "))
            addCharSet = 0;
        }
        else
        {
          if (precision/*i.e., charlen*/ > 0) // char len unit is CHAR(S)
          {
            if (precision/*i.e., charlen*/ == 1)
              str_sprintf(text, "CHAR(1 CHAR)");
            else
              str_sprintf(text, "CHAR(%d CHARS)", precision/*i.e., charlen*/);
          }
          else // precision == 0 (char len unit is BYTE[S])
          {
            if (length/*in_bytes*/ == 1)
              str_sprintf(text, "CHAR(1 BYTE)");
            else
              str_sprintf(text, "CHAR(%d BYTES)", length/*in_bytes*/);
          }
        }
      }
      else
	str_sprintf(text, "CHAR(%d)", length);

      addCollate = 1;
      break;

    case REC_BYTE_F_DOUBLE:
      str_sprintf(text, "CHAR(%d)", length/SQL_DBCHAR_SIZE);
      addCharSet = 1;
      addCollate = 1;
      break;

    case REC_BYTE_V_ASCII:
      addCharSet = 1;
#ifdef IS_MP
      if(CharInfo::is_NCHAR_MP(charSet))
	str_sprintf(text, "VARCHAR(%d)", length/2);
      else
#endif
      if (charSet == CharInfo::UTF8 || charSet == CharInfo::SJIS)
      {
        if(displaydatatype && strlen(displaydatatype) > 0)
        {
          str_sprintf(text, displaydatatype);
          if(str_str(displaydatatype, " CHARACTER SET "))
            addCharSet = 0;
        }
        else
        {
          if (precision/*i.e., charlen*/ > 0) // char len unit is CHAR(S)
          {
            if (precision/*i.e., charlen*/ == 1)
              str_sprintf(text, "VARCHAR(1 CHAR)");
            else
              str_sprintf(text, "VARCHAR(%d CHARS)", precision/*i.e., charlen*/);
          }
          else // precision == 0 (char len unit is BYTE[S])
          {
            if (length/*in_bytes*/ == 1)
              str_sprintf(text, "VARCHAR(1 BYTE)");
            else
              str_sprintf(text, "VARCHAR(%d BYTES)", length/*in_bytes*/);
          }
        }
      }
      else
	str_sprintf(text, "VARCHAR(%d)", length);

      addCollate = 1;
      break;

    case REC_BYTE_V_DOUBLE:
      str_sprintf(text, "VARCHAR(%d)", length/SQL_DBCHAR_SIZE);
      addCharSet = 1;
      addCollate = 1;
      break;

    case REC_BYTE_V_ASCII_LONG:
      addCharSet = 1;
      if (charSet == CharInfo::UTF8 || charSet == CharInfo::SJIS)
      {
        if(displaydatatype && strlen(displaydatatype) > 0)
        {
          str_sprintf(text, displaydatatype);
          if(str_str(displaydatatype, " CHARACTER SET "))
            addCharSet = 0;
        }
        else
        {
          if (precision/*i.e., charlen*/ > 0) // char len unit is CHAR(S) - not yet supported
          {
            if (precision/*i.e., charlen*/ == 1)
              str_sprintf(text, "LONG VARCHAR(1 CHAR)");
            else
              str_sprintf(text, "LONG VARCHAR(%d CHARS)", precision/*i.e., charlen*/);
          }
          else // precision == 0 (char len unit is BYTE[S])
          {
            if (length/*in_bytes*/ == 1)
              str_sprintf(text, "LONG VARCHAR(1 BYTE)");
            else
              str_sprintf(text, "LONG VARCHAR(%d BYTES)", length/*in_bytes*/);
          }
        }
      }
      else
	str_sprintf(text, "LONG VARCHAR(%d)", length);

      addCollate = 1;
      break;

    case REC_DATETIME:
      return getDateTimeTypeText(text,
                                 datetimestart,
                                 datetimeend,
                                 datetimefractprec);

    case REC_INT_YEAR:
    case REC_INT_MONTH:
    case REC_INT_YEAR_MONTH:
    case REC_INT_DAY:
    case REC_INT_HOUR:
    case REC_INT_DAY_HOUR:
    case REC_INT_MINUTE:
    case REC_INT_HOUR_MINUTE:
    case REC_INT_DAY_MINUTE:
    case REC_INT_SECOND:
    case REC_INT_MINUTE_SECOND:
    case REC_INT_HOUR_SECOND:
    case REC_INT_DAY_SECOND:
    case REC_INT_FRACTION:
      return getIntervalTypeText(text,
                                 datetimestart,
                                 intervalleadingprec,
                                 datetimeend,
                                 datetimefractprec);
      break;

   case REC_BLOB:
     if (precision > 0)
       str_sprintf(text, "BLOB(length %d M)",
		   precision);
     else
       str_sprintf(text, "BLOB");
     break;

   case REC_CLOB:
     if (precision > 0)
       str_sprintf(text, "CLOB(length %d M)",
		   precision);
     else
       str_sprintf(text, "CLOB");
     break;

   case REC_BOOLEAN:
     str_sprintf(text, "BOOLEAN");
     break;

    default:
      str_sprintf(text, "**ERROR (unknown type %d)", fs_datatype);
      return -1; // error case
  }

  if (addCharSet)
  {
    str_sprintf(&text[str_len(text)],
                " CHARACTER SET %s",
                CharInfo::getCharSetName(charSet));
  }

  if (addCollate && (collation_name != NULL) && 
      (strcmp(collation_name, SQLCOLLATIONSTRING_UNKNOWN) != 0))
  {
    str_sprintf(&text[str_len(text)],
                " COLLATE %s",
                collation_name);
  }

  if (DFS2REC::isAnyCharacter(fs_datatype))
    {
      if (upshift)
	str_sprintf(&text[str_len(text)], " UPSHIFT");

      if (caseinsensitive)
	str_sprintf(&text[str_len(text)], " NOT CASESPECIFIC");
      else if (displayCaseSpecific)
	str_sprintf(&text[str_len(text)], " CASESPECIFIC");
    }


  return 0;
}

// Helper functions to map between FS types and ANSI types. ANSI types
// are defined by the SQLTYPE_CODE enumeration in cli/sqlcli.h
Lng32 getAnsiTypeFromFSType(Lng32 datatype)
{
   Lng32 numeric_value = -1;

   switch (datatype)
   {
   case REC_BIN8_SIGNED:
      numeric_value = SQLTYPECODE_TINYINT;
      break;

   case REC_BIN8_UNSIGNED:
      numeric_value = SQLTYPECODE_TINYINT_UNSIGNED;
      break;

   case REC_BIN16_SIGNED:
      numeric_value = SQLTYPECODE_SMALLINT;
      break;

   case REC_BIN16_UNSIGNED:
      numeric_value = SQLTYPECODE_SMALLINT_UNSIGNED;
      break;

   case REC_BPINT_UNSIGNED:
      // numeric_value = SQLTYPECODE_BPINT_UNSIGNED; -Peter
      numeric_value = SQLTYPECODE_SMALLINT_UNSIGNED;
      break;

   case REC_BIN32_SIGNED:
      numeric_value = SQLTYPECODE_INTEGER;
      break;

   case REC_BIN32_UNSIGNED:
      numeric_value = SQLTYPECODE_INTEGER_UNSIGNED;
      break;

   case REC_BIN64_SIGNED:
      numeric_value = SQLTYPECODE_LARGEINT;
      break;

   case REC_BIN64_UNSIGNED:
      numeric_value = SQLTYPECODE_LARGEINT_UNSIGNED;
      break;

   case REC_FLOAT32:
      numeric_value = SQLTYPECODE_IEEE_REAL;
      break;

   case REC_FLOAT64:
      numeric_value = SQLTYPECODE_IEEE_DOUBLE;
      break;

   case REC_DECIMAL_UNSIGNED:
      numeric_value = SQLTYPECODE_DECIMAL_UNSIGNED;
      break;

   case REC_DECIMAL_LSE:
      numeric_value = SQLTYPECODE_DECIMAL;
      break;

   case REC_NUM_BIG_UNSIGNED:
   case REC_NUM_BIG_SIGNED:
     numeric_value = SQLTYPECODE_NUMERIC;
     break;

   case REC_BYTE_F_ASCII:
   case REC_BYTE_F_DOUBLE: // use the ANSI type code for any fixed char types
      numeric_value = SQLTYPECODE_CHAR;
      break;

   case REC_BYTE_V_ASCII_LONG:
      numeric_value = SQLTYPECODE_VARCHAR_LONG;
      break;

   case REC_BYTE_V_ASCII:
   case REC_BYTE_V_DOUBLE:
     numeric_value = SQLTYPECODE_VARCHAR_WITH_LENGTH;
     break;

   case REC_BYTE_V_ANSI:
   case REC_NCHAR_V_ANSI_UNICODE:
      numeric_value = SQLTYPECODE_VARCHAR;
      break;

   case REC_DATETIME:
      numeric_value = SQLTYPECODE_DATETIME;
      break;
   case REC_BLOB:
     numeric_value = SQLTYPECODE_BLOB;
     break;
   case REC_CLOB:
     numeric_value = SQLTYPECODE_CLOB;
     break;

   case REC_BOOLEAN:
     numeric_value = SQLTYPECODE_BOOLEAN;
     break;

   case REC_INT_YEAR:
   case REC_INT_MONTH:
   case REC_INT_YEAR_MONTH:
   case REC_INT_DAY:
   case REC_INT_HOUR:
   case REC_INT_DAY_HOUR:
   case REC_INT_MINUTE:
   case REC_INT_HOUR_MINUTE:
   case REC_INT_DAY_MINUTE:
   case REC_INT_SECOND:
   case REC_INT_MINUTE_SECOND:
   case REC_INT_HOUR_SECOND:
   case REC_INT_DAY_SECOND:
      numeric_value = SQLTYPECODE_INTERVAL;
      break;

   default:
      // error
      break;
   }
   return numeric_value;
}

const char * getAnsiTypeStrFromFSType(Lng32 datatype)
{
   switch (datatype)
   {
   case REC_BIN8_SIGNED:
     return COM_TINYINT_SIGNED_SDT_LIT;
     break;

   case REC_BIN8_UNSIGNED:
      return COM_TINYINT_UNSIGNED_SDT_LIT;
      break;

   case REC_BIN16_SIGNED:
     return COM_SMALLINT_SIGNED_SDT_LIT;
     break;

   case REC_BIN16_UNSIGNED:
      return COM_SMALLINT_UNSIGNED_SDT_LIT;
      break;

   case REC_BPINT_UNSIGNED:
      return COM_SMALLINT_UNSIGNED_SDT_LIT;
      break;

   case REC_BIN32_SIGNED:
     return COM_INTEGER_SIGNED_SDT_LIT;
     break;

   case REC_BIN32_UNSIGNED:
     return COM_INTEGER_UNSIGNED_SDT_LIT;
     break;

   case REC_BIN64_SIGNED:
     return COM_LARGEINT_SIGNED_SDT_LIT;
     break;

   case REC_BIN64_UNSIGNED:
     return COM_LARGEINT_UNSIGNED_SDT_LIT;
     break;

   case REC_FLOAT32:
     return COM_REAL_SDT_LIT;
      break;

   case REC_FLOAT64:
     return COM_DOUBLE_SDT_LIT;
      break;

   case REC_DECIMAL_UNSIGNED:
     return COM_DECIMAL_UNSIGNED_SDT_LIT;
      break;

   case REC_DECIMAL_LSE:
     return COM_DECIMAL_SIGNED_SDT_LIT;
      break;

   case REC_NUM_BIG_SIGNED:
     return COM_NUMERIC_SIGNED_SDT_LIT;
     break;

   case REC_NUM_BIG_UNSIGNED:
     return COM_NUMERIC_UNSIGNED_SDT_LIT;
     break;

   case REC_BYTE_F_ASCII:
   case REC_BYTE_F_DOUBLE: // use the ANSI type code for any fixed char types
     return COM_CHARACTER_SDT_LIT;
     break;

   case REC_BYTE_V_ASCII_LONG:
     return COM_LONG_VARCHAR_SDT_LIT;
     break;

   case REC_BYTE_V_ASCII:
   case REC_BYTE_V_DOUBLE:
     return COM_VARCHAR_SDT_LIT;
     break;

   case REC_BYTE_V_ANSI:
   case REC_NCHAR_V_ANSI_UNICODE:
     return COM_VARCHAR_SDT_LIT;
     break;

   case REC_DATETIME:
     return COM_DATETIME_SDT_LIT;
     break;

   case REC_BLOB:
     return COM_BLOB_SDT_LIT;
     break;
   case REC_CLOB:
     return COM_CLOB_SDT_LIT;
     break;

   case REC_BOOLEAN:
     return COM_BOOLEAN_SDT_LIT;
     break;

   case REC_INT_YEAR:
   case REC_INT_MONTH:
   case REC_INT_YEAR_MONTH:
   case REC_INT_DAY:
   case REC_INT_HOUR:
   case REC_INT_DAY_HOUR:
   case REC_INT_MINUTE:
   case REC_INT_HOUR_MINUTE:
   case REC_INT_DAY_MINUTE:
   case REC_INT_SECOND:
   case REC_INT_MINUTE_SECOND:
   case REC_INT_HOUR_SECOND:
   case REC_INT_DAY_SECOND:
     return COM_INTERVAL_SDT_LIT;
     break;
   
   default:
      // error
      break;
   }

   return NULL;
}

Lng32 getDatetimeCodeFromFSType(Lng32 datatype)
{
   Lng32 numeric_value = -1;

   switch (datatype)
   {
   case REC_INT_YEAR:
      numeric_value = SQLINTCODE_YEAR;
      break;

   case REC_INT_MONTH:
      numeric_value = SQLINTCODE_MONTH;
      break;

   case REC_INT_YEAR_MONTH:
      numeric_value = SQLINTCODE_YEAR_MONTH;
      break;

   case REC_INT_DAY:
      numeric_value = SQLINTCODE_DAY;
      break;

   case REC_INT_HOUR:
      numeric_value = SQLINTCODE_HOUR;
      break;

   case REC_INT_DAY_HOUR:
      numeric_value = SQLINTCODE_DAY_HOUR;
      break;

   case REC_INT_MINUTE:
      numeric_value = SQLINTCODE_MINUTE;
      break;

   case REC_INT_HOUR_MINUTE:
      numeric_value = SQLINTCODE_HOUR_MINUTE;
      break;

   case REC_INT_DAY_MINUTE:
      numeric_value = SQLINTCODE_DAY_MINUTE;
      break;

   case REC_INT_SECOND:
      numeric_value = SQLINTCODE_SECOND;
      break;

   case REC_INT_MINUTE_SECOND:
      numeric_value = SQLINTCODE_MINUTE_SECOND;
      break;

   case REC_INT_HOUR_SECOND:
      numeric_value = SQLINTCODE_HOUR_SECOND;
      break;

   case REC_INT_DAY_SECOND:
      numeric_value = SQLINTCODE_DAY_SECOND;
      break;

   default:
      numeric_value = -1;
      break;
   }
   return numeric_value;
}

Lng32 getFSTypeFromDatetimeCode(Lng32 datetime_code)
{
   Lng32 datatype;

   switch (datetime_code)
   {
   case SQLINTCODE_YEAR:
       datatype = REC_INT_YEAR;
       break;

   case SQLINTCODE_MONTH:
       datatype = REC_INT_MONTH;
       break;

   case SQLINTCODE_YEAR_MONTH:
       datatype = REC_INT_YEAR_MONTH;
       break;

   case SQLINTCODE_DAY:
       datatype = REC_INT_DAY;
       break;

   case SQLINTCODE_HOUR:
       datatype = REC_INT_HOUR;
       break;

   case SQLINTCODE_DAY_HOUR:
       datatype = REC_INT_DAY_HOUR;
       break;

   case SQLINTCODE_MINUTE:
       datatype = REC_INT_MINUTE;
       break;

   case SQLINTCODE_HOUR_MINUTE:
       datatype = REC_INT_HOUR_MINUTE;
       break;

   case SQLINTCODE_DAY_MINUTE:
       datatype = REC_INT_DAY_MINUTE;
       break;

   case SQLINTCODE_SECOND:
       datatype = REC_INT_SECOND;
       break;

   case SQLINTCODE_MINUTE_SECOND:
       datatype = REC_INT_MINUTE_SECOND;
       break;

   case SQLINTCODE_HOUR_SECOND:
       datatype = REC_INT_HOUR_SECOND;
       break;

   case SQLINTCODE_DAY_SECOND:
       datatype = REC_INT_DAY_SECOND;
       break;

   default:
       datatype = -1;
       break;
   }

   return datatype;
}

Lng32 getFSTypeFromANSIType(Lng32 ansitype)
{
   Lng32 datatype;

   switch (ansitype)
   {
   case SQLTYPECODE_TINYINT:
      datatype = REC_BIN8_SIGNED;
      break;

   case SQLTYPECODE_TINYINT_UNSIGNED:
      datatype = REC_BIN8_UNSIGNED;
      break;

   case SQLTYPECODE_SMALLINT:
      datatype = REC_BIN16_SIGNED;
      break;

   case SQLTYPECODE_SMALLINT_UNSIGNED:
      datatype = REC_BIN16_UNSIGNED;
      break;

   case SQLTYPECODE_BPINT_UNSIGNED:
      datatype = REC_BPINT_UNSIGNED;
      break;

   case SQLTYPECODE_INTEGER:
      datatype = REC_BIN32_SIGNED;
      break;

   case SQLTYPECODE_INTEGER_UNSIGNED:
      datatype = REC_BIN32_UNSIGNED;
      break;

   case SQLTYPECODE_LARGEINT:
      datatype = REC_BIN64_SIGNED;
      break;

   case SQLTYPECODE_LARGEINT_UNSIGNED:
      datatype = REC_BIN64_UNSIGNED;
      break;

   case SQLTYPECODE_NUMERIC :
       datatype = REC_BIN32_SIGNED;
       break;

   case SQLTYPECODE_NUMERIC_UNSIGNED :
       datatype = REC_BIN32_UNSIGNED;
       break;

   case SQLTYPECODE_IEEE_REAL:
      datatype = REC_FLOAT32;
      break;

   case SQLTYPECODE_IEEE_DOUBLE:
      datatype = REC_FLOAT64;
      break;

   case SQLTYPECODE_IEEE_FLOAT:
      datatype = REC_FLOAT64;
      break;

   case SQLTYPECODE_DECIMAL_UNSIGNED:
      datatype = REC_DECIMAL_UNSIGNED;
      break;

   case SQLTYPECODE_DECIMAL:
      datatype = REC_DECIMAL_LSE;
      break;

   case SQLTYPECODE_CHAR:
      datatype = REC_BYTE_F_ASCII;
      break;

   case SQLTYPECODE_VARCHAR_LONG:
      datatype = REC_BYTE_V_ASCII_LONG;
      break;

   case SQLTYPECODE_VARCHAR:
      datatype = REC_BYTE_V_ANSI;
      break;

   case SQLTYPECODE_VARCHAR_WITH_LENGTH:
      datatype = REC_BYTE_V_ASCII;
      break;

   case SQLTYPECODE_DATETIME:
      datatype = REC_DATETIME;
      break;
   case SQLTYPECODE_BLOB:
     datatype = REC_BLOB;
     break;
   case SQLTYPECODE_CLOB:
     datatype = REC_CLOB;
     break;
   default:
      // error
      datatype = ansitype;
      break;
   }

   return datatype;
}
