blob: 91ac01d62a9743380ff4e27a4ba6212313b79105 [file] [log] [blame]
/**********************************************************************
// @@@ 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;
}