JIRA TRAFODION-2060 Add support for tinyint datatype -- added support for tinyint datatype to be used in create and cast statements -- added support for returning tinyint in select list and input params -- currently tinyint select list and input params is only enabled for queries from sqlci. Some support for it has been added to jdbc T4 but need to be completed. Until then, tinyint select/param support is not enabled for t4/t2/odbc interfaces -- removed obsolete tandem floating point datatypes
Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/88ec4fea Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/88ec4fea Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/88ec4fea Branch: refs/heads/master Commit: 88ec4feaaabcd2a609653e28496ed44ee9359ee3 Parents: 0e6728d Author: Anoop Sharma <[email protected]> Authored: Tue Jun 14 19:14:32 2016 +0000 Committer: Anoop Sharma <[email protected]> Committed: Tue Jun 14 19:14:32 2016 +0000 ---------------------------------------------------------------------- .../trafodion/jdbc/t4/InterfaceResultSet.java | 17 + .../trafodion/jdbc/t4/InterfaceStatement.java | 25 + .../java/org/trafodion/jdbc/t4/TrafT4Desc.java | 4 +- .../jdbc/t4/TrafT4PreparedStatement.java | 2 +- .../java/org/trafodion/jdbc/t4/Utility.java | 12 +- .../odbc/src/odbc/nsksrvrcore/sqlinterface.cpp | 65 ++- core/sql/cli/CliExpExchange.cpp | 29 +- core/sql/cli/Descriptor.cpp | 8 +- core/sql/cli/sqlcli.h | 4 + core/sql/comexe/ComTdb.cpp | 51 -- core/sql/comexe/ComTdb.h | 24 +- core/sql/common/BaseTypes.cpp | 60 ++- core/sql/common/ComSmallDefs.h | 10 + core/sql/common/NAType.cpp | 10 +- core/sql/common/NumericType.cpp | 153 +++++- core/sql/common/NumericType.h | 195 ++++--- core/sql/common/SQLTypeDefs.h | 5 + core/sql/common/dfs2rec.h | 8 +- core/sql/executor/ExHbaseIUD.cpp | 6 +- core/sql/exp/ExpPCodeClauseGen.cpp | 2 - core/sql/exp/exp_arith.cpp | 99 +--- core/sql/exp/exp_attrs.cpp | 4 +- core/sql/exp/exp_clause_derived.h | 18 +- core/sql/exp/exp_comp.cpp | 80 +-- core/sql/exp/exp_conv.cpp | 529 +++++++++++++++---- core/sql/exp/exp_fixup.cpp | 44 +- core/sql/exp/exp_function.cpp | 165 +----- core/sql/exp/exp_math_func.cpp | 107 +--- core/sql/generator/GenPreCode.cpp | 77 +-- core/sql/langman/LmJavaType.cpp | 21 +- core/sql/langman/LmJavaType.h | 1 + core/sql/langman/LmResultSetJava.cpp | 56 +- core/sql/langman/LmRoutineCSql.cpp | 27 + core/sql/optimizer/BindRelExpr.cpp | 89 +--- core/sql/optimizer/EncodedValue.cpp | 10 +- core/sql/optimizer/ItemExpr.cpp | 10 +- core/sql/optimizer/ItemFunc.h | 36 +- core/sql/optimizer/NAColumn.cpp | 50 +- core/sql/optimizer/NATable.cpp | 57 +- core/sql/optimizer/OptRange.cpp | 2 - core/sql/optimizer/ValueDesc.cpp | 66 +-- core/sql/parser/ParKeyWords.cpp | 3 - core/sql/parser/sqlparser.y | 55 +- core/sql/regress/executor/EXPECTED022.SB | 246 ++++++--- core/sql/regress/executor/TEST022 | 54 +- core/sql/regress/hive/EXPECTED005 | 6 +- core/sql/regress/hive/tbl_bad.data | 2 +- core/sql/regress/hive/tbl_type.data | 2 +- core/sql/regress/seabase/EXPECTED003 | 425 +++++++++++++++ core/sql/regress/seabase/TEST003 | 138 +++++ core/sql/regress/udr/EXPECTED100.SB | 53 +- core/sql/regress/udr/TEST100 | 13 + core/sql/regress/udr/t100.java | 4 + core/sql/sqlci/Formatter.cpp | 14 +- core/sql/sqlci/Param.cpp | 4 +- core/sql/sqlci/SqlciEnv.cpp | 28 +- core/sql/sqlci/SqlciEnv.h | 2 +- core/sql/sqlcomp/CmpSeabaseDDLroutine.cpp | 2 + core/sql/sqlcomp/DefaultConstants.h | 22 +- core/sql/sqlcomp/nadefaults.cpp | 12 +- core/sql/ustat/hs_cli.cpp | 42 +- core/sql/ustat/hs_faststats.cpp | 6 + core/sql/ustat/hs_globals.cpp | 121 +++-- 63 files changed, 2196 insertions(+), 1296 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceResultSet.java ---------------------------------------------------------------------- diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceResultSet.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceResultSet.java index 2d2390b..81ef66c 100644 --- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceResultSet.java +++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceResultSet.java @@ -63,6 +63,10 @@ class InterfaceResultSet { static final int SQLTYPECODE_BPINT_UNSIGNED = -503; + /* TINYINT */ + static final int SQLTYPECODE_TINYINT = -403; + static final int SQLTYPECODE_TINYINT_UNSIGNED = -404; + /* * DOUBLE depending on precision */ @@ -263,6 +267,14 @@ class InterfaceResultSet { break; } break; + case SQLTYPECODE_TINYINT: + short sValue1 = (byte) ibuffer[byteIndex]; + retObj = new Short(sValue1); + break; + case SQLTYPECODE_TINYINT_UNSIGNED: + short sValue2 = (byte) ibuffer[byteIndex]; + retObj = new Short(sValue2); + break; case SQLTYPECODE_SMALLINT: short sValue = Bytes.extractShort(ibuffer, byteIndex, this.ic_.getByteSwap()); retObj = new Short(sValue); @@ -503,6 +515,11 @@ class InterfaceResultSet { break; } break; + case SQLTYPECODE_TINYINT: + case SQLTYPECODE_TINYINT_UNSIGNED: + short sValue1 = (byte) values[noNullValue]; + retObj = new Short(sValue1); + break; case SQLTYPECODE_SMALLINT: short sValue = Bytes.extractShort(values, noNullValue, swap); retObj = new Short(sValue); http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceStatement.java ---------------------------------------------------------------------- diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceStatement.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceStatement.java index 153394d..06aaa64 100644 --- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceStatement.java +++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/InterfaceStatement.java @@ -507,6 +507,30 @@ class InterfaceStatement { Bytes.insertInt(values, noNullValue, tmpbd.intValue(), this.ic_.getByteSwap()); break; + + case InterfaceResultSet.SQLTYPECODE_TINYINT: + tmpbd = Utility.getBigDecimalValue(locale, paramValue); + if (scale > 0) { + throw TrafT4Messages.createSQLException(pstmt.connection_.props_, locale, "invalid_parameter_value", + "Cannot have scale for param: " + paramNumber); + } + + Utility.checkSignedTinyintBoundary(locale, tmpbd); + + Bytes.insertShort(values, noNullValue, tmpbd.byteValueExact(), this.ic_.getByteSwap()); + + break; + case InterfaceResultSet.SQLTYPECODE_TINYINT_UNSIGNED: + tmpbd = Utility.getBigDecimalValue(locale, paramValue); + if (scale > 0) { + throw TrafT4Messages.createSQLException(pstmt.connection_.props_, locale, "invalid_parameter_value", + "Cannot have scale for param: " + paramNumber); + } + + Utility.checkUnsignedTinyintBoundary(locale, tmpbd); + + Bytes.insertShort(values, noNullValue, tmpbd.byteValueExact(), this.ic_.getByteSwap()); + break; case InterfaceResultSet.SQLTYPECODE_SMALLINT: tmpbd = Utility.getBigDecimalValue(locale, paramValue); if (scale > 0) { @@ -538,6 +562,7 @@ class InterfaceStatement { // range checking } + Utility.checkSignedShortBoundary(locale, tmpbd); // check boundary condition for Numeric. http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Desc.java ---------------------------------------------------------------------- diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Desc.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Desc.java index 65ce6ea..3a12532 100644 --- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Desc.java +++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4Desc.java @@ -30,6 +30,7 @@ class TrafT4Desc { String getColumnClassName() throws SQLException { switch (dataType_) { + case Types.TINYINT: case Types.SMALLINT: return "java.lang.Integer"; case Types.INTEGER: @@ -61,7 +62,6 @@ class TrafT4Desc { case Types.BLOB: return "java.sql.Blob"; case Types.BIT: - case Types.TINYINT: default: return null; } @@ -135,7 +135,7 @@ class TrafT4Desc { case Types.BLOB: break; default: - System.out.println("Data type is " + dataType_); + System.out.println("Data type is " + dataType_); throw TrafT4Messages.createSQLException(null, locale, "restricted_data_type", null); } return; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4PreparedStatement.java ---------------------------------------------------------------------- diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4PreparedStatement.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4PreparedStatement.java index 15e420b..fae2d7b 100644 --- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4PreparedStatement.java +++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/TrafT4PreparedStatement.java @@ -1279,7 +1279,7 @@ public class TrafT4PreparedStatement extends TrafT4Statement implements java.sql case Types.TINYINT: tmpbd = Utility.getBigDecimalValue(locale, x); tmpbd = Utility.setScale(tmpbd, scale, roundingMode_); - Utility.checkTinyintBoundary(locale, tmpbd); + Utility.checkSignedTinyintBoundary(locale, tmpbd); setShort(parameterIndex, tmpbd.shortValue()); break; case Types.FLOAT: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/Utility.java ---------------------------------------------------------------------- diff --git a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/Utility.java b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/Utility.java index 7099fa7..e984187 100644 --- a/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/Utility.java +++ b/core/conn/jdbcT4/src/main/java/org/trafodion/jdbc/t4/Utility.java @@ -223,10 +223,18 @@ class Utility { * @return none * */ - static void checkTinyintBoundary(Locale locale, BigDecimal inbd) throws SQLException { + static void checkSignedTinyintBoundary(Locale locale, BigDecimal inbd) throws SQLException { long inlong = inbd.longValue(); if ((inlong > Byte.MAX_VALUE) || (inlong < Byte.MIN_VALUE)) { - throw TrafT4Messages.createSQLException(null, locale, "numeric_out_of_range", String.valueOf(inlong)); + throw TrafT4Messages.createSQLException(null, locale, "signed_tinyint_out_of_range", String.valueOf(inlong)); + } + } // end checkTinyintBoundary + + static void checkUnsignedTinyintBoundary(Locale locale, BigDecimal inbd) throws SQLException { + long inlong = inbd.longValue(); + long maxutiny = (Byte.MAX_VALUE * 2) + 1; + if ((inlong < 0) || (inlong > maxutiny)) { + throw TrafT4Messages.createSQLException(null, locale, "unsigned_tinyint_out_of_range", String.valueOf(inlong)); } } // end checkTinyintBoundary http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/conn/odbc/src/odbc/nsksrvrcore/sqlinterface.cpp ---------------------------------------------------------------------- diff --git a/core/conn/odbc/src/odbc/nsksrvrcore/sqlinterface.cpp b/core/conn/odbc/src/odbc/nsksrvrcore/sqlinterface.cpp index 22a4b0f..ee64cc0 100644 --- a/core/conn/odbc/src/odbc/nsksrvrcore/sqlinterface.cpp +++ b/core/conn/odbc/src/odbc/nsksrvrcore/sqlinterface.cpp @@ -191,6 +191,20 @@ SQLRETURN SRVR::GetODBCValues(Int32 DataType, Int32 DateTimeCode, Int32 &Length, ODBCCharset = SQLCharset; break; + case SQLTYPECODE_TINYINT: + ODBCPrecision = 3; + ODBCDataType = SQL_TINYINT; + SignType = TRUE; + totalMemLen += Length; + break; + + case SQLTYPECODE_TINYINT_UNSIGNED: + ODBCPrecision = 3; + ODBCDataType = SQL_TINYINT; + SignType = FALSE; + totalMemLen += Length; + break; + case SQLTYPECODE_SMALLINT: if (Precision == 0) { @@ -676,6 +690,11 @@ SQLRETURN SRVR::SetDataPtr(SQLDESC_ID *pDesc, SQLItemDescList_def *SQLDesc, Int3 VarPtr = memPtr + memOffSet; memOffSet += SQLItemDesc->maxLen + 3; break; + case SQLTYPECODE_TINYINT: + case SQLTYPECODE_TINYINT_UNSIGNED: + VarPtr = memPtr + memOffSet; + memOffSet += SQLItemDesc->maxLen ; + break; case SQLTYPECODE_SMALLINT: memOffSet = ((memOffSet + 2 - 1) >> 1) << 1; VarPtr = memPtr + memOffSet; @@ -971,7 +990,7 @@ SQLRETURN SRVR::AllocAssignValueBuffer( { case SQLTYPECODE_CHAR: case SQLTYPECODE_VARCHAR: - VarPtr = memPtr + memOffSet; + VarPtr = memPtr + memOffSet; memOffSet += SQLItemDesc->maxLen + 1; AllocLength = SQLItemDesc->maxLen + 1; break; @@ -1004,6 +1023,12 @@ SQLRETURN SRVR::AllocAssignValueBuffer( memOffSet += SQLItemDesc->maxLen + 3; AllocLength = SQLItemDesc->maxLen + 3; break; + case SQLTYPECODE_TINYINT: + case SQLTYPECODE_TINYINT_UNSIGNED: + VarPtr = memPtr + memOffSet; + memOffSet += SQLItemDesc->maxLen; + AllocLength = SQLItemDesc->maxLen; + break; case SQLTYPECODE_SMALLINT: memOffSet = ((memOffSet + 2 - 1) >> 1) << 1; VarPtr = memPtr + memOffSet; @@ -1261,7 +1286,14 @@ SQLRETURN SRVR::BuildSQLDesc(SQLDESC_ID *pDesc, break; case 134: DataType = SQLTYPECODE_LARGEINT; - break; + break; + case 136: + DataType = SQLTYPECODE_TINYINT; + break; + case 137: + DataType = SQLTYPECODE_TINYINT_UNSIGNED; + break; + default: break; } @@ -1345,7 +1377,7 @@ SQLRETURN SRVR::BuildSQLDesc2(SQLDESC_ID *pDesc, bool bRWRS = false; if (srvrGlobal->drvrVersion.buildId & ROWWISE_ROWSET) bRWRS = true; - + struct ODBCDescriptors { Int32 varAlign; @@ -1499,7 +1531,14 @@ SQLRETURN SRVR::BuildSQLDesc2(SQLDESC_ID *pDesc, break; case 134: DataType = SQLTYPECODE_LARGEINT; - break; + break; + case 136: + DataType = SQLTYPECODE_TINYINT; + break; + case 137: + DataType = SQLTYPECODE_TINYINT_UNSIGNED; + break; + default: break; } @@ -2234,6 +2273,13 @@ SQLRETURN SRVR::BuildSQLDesc2withRowsets( SQLDESC_ID *pDesc case 134: DataType = SQLTYPECODE_LARGEINT; break; + case 136: + DataType = SQLTYPECODE_TINYINT; + break; + case 137: + DataType = SQLTYPECODE_TINYINT_UNSIGNED; + break; + default: break; } @@ -2444,6 +2490,11 @@ SQLRETURN SRVR::BuildSQLDesc2withRowsets( SQLDESC_ID *pDesc else inputQuadList[i+1].var_layout = SqlDescInfo[i].Length + 1; break; + case SQLTYPECODE_TINYINT: + case SQLTYPECODE_TINYINT_UNSIGNED: + VarPtr = memPtr + memOffSet; + memOffSet += SqlDescInfo[i].Length; + break; case SQLTYPECODE_SMALLINT: case SQLTYPECODE_SMALLINT_UNSIGNED: memOffSet = ((memOffSet + 2 - 1) >> 1) << 1; @@ -6201,7 +6252,6 @@ SQLRETURN SRVR::FETCH2bulk(SRVR_STMT_HDL *pSrvrStmt) if (srvrGlobal->drvrVersion.buildId & ROWWISE_ROWSET) bRWRS = true; - //Changes due to cursor issue if (pSrvrStmt->maxRowCnt > 0) { @@ -6998,6 +7048,11 @@ SQLRETURN SRVR::SetIndandVarPtr(SQLDESC_ID *pDesc, if (!bRWRS) memOffSet += 1; break; + case SQLTYPECODE_TINYINT: + case SQLTYPECODE_TINYINT_UNSIGNED: + VarPtr = memPtr + memOffSet; + memOffSet += SqlDescInfo[i].Length; + break; case SQLTYPECODE_SMALLINT: case SQLTYPECODE_SMALLINT_UNSIGNED: memOffSet = ((memOffSet + 2 - 1) >> 1) << 1; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/cli/CliExpExchange.cpp ---------------------------------------------------------------------- diff --git a/core/sql/cli/CliExpExchange.cpp b/core/sql/cli/CliExpExchange.cpp index 871985d..d047b0c 100644 --- a/core/sql/cli/CliExpExchange.cpp +++ b/core/sql/cli/CliExpExchange.cpp @@ -1111,7 +1111,7 @@ InputOutputExpr::outputValues(atp_struct *atp, if (getenv("DISABLE_ROWWISE_ROWSET")) output_desc->setRowwiseRowsetDisabled(TRUE); #endif - + setupBulkMoveInfo(output_desc, heap, FALSE /* output desc*/, flags); if ( // rowwise rowsets V1 are only supported if bulk move @@ -1147,6 +1147,8 @@ InputOutputExpr::outputValues(atp_struct *atp, } // rowwise rowset } + + if (NOT output_desc->bulkMoveDisabled()) { // bulk move is enabled and setup has been done. @@ -4240,6 +4242,31 @@ InputOutputExpr::inputValues(atp_struct *atp, operand->getHVRowsetLocalSize()) { short targetType = operand->getDatatype(); switch (targetType) { + case REC_BIN8_SIGNED : + if (*((Int8 *) target) <= 0) { + //raise error + ExRaiseSqlError(heap, &diagsArea, EXE_ROWSET_NEGATIVE_SIZE); + if (diagsArea != atp->getDiagsArea()) + atp->setDiagsArea(diagsArea); + return ex_expr::EXPR_ERROR; + } + else { + dynamicRowsetSize = *((Int8 *) target); + break; + } + case REC_BIN8_UNSIGNED : + if (*((UInt8 *) target) == 0) { + //raise error + ExRaiseSqlError(heap, &diagsArea, EXE_ROWSET_NEGATIVE_SIZE); + if (diagsArea != atp->getDiagsArea()) + atp->setDiagsArea(diagsArea); + return ex_expr::EXPR_ERROR; + } + else { + dynamicRowsetSize = *((UInt8 *) target); + break; + } + case REC_BIN16_SIGNED : if (*((short *) target) <= 0) { //raise error http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/cli/Descriptor.cpp ---------------------------------------------------------------------- diff --git a/core/sql/cli/Descriptor.cpp b/core/sql/cli/Descriptor.cpp index e369ee6..5af9568 100644 --- a/core/sql/cli/Descriptor.cpp +++ b/core/sql/cli/Descriptor.cpp @@ -114,12 +114,10 @@ Lng32 Descriptor::setVarLength(desc_struct &descItem) case REC_BIN32_SIGNED: case REC_BIN32_UNSIGNED: case REC_FLOAT32: - case REC_TDM_FLOAT32: descItem.length = 4; break; case REC_BIN64_SIGNED: case REC_FLOAT64: - case REC_TDM_FLOAT64: descItem.length = 8; break; default: @@ -1356,6 +1354,8 @@ short Descriptor::isIntegralFSType(Lng32 datatype) { switch (datatype) { + case REC_BIN8_SIGNED: + case REC_BIN8_UNSIGNED: case REC_BIN16_SIGNED: case REC_BIN16_UNSIGNED: case REC_BIN32_SIGNED: @@ -1376,8 +1376,6 @@ short Descriptor::isFloatFSType(Lng32 datatype) { case REC_FLOAT32: case REC_FLOAT64: - case REC_TDM_FLOAT32: - case REC_TDM_FLOAT64: return TRUE; default: @@ -1438,14 +1436,12 @@ Lng32 Descriptor::DefaultPrecision(Lng32 datatype) case SQLTYPECODE_IEEE_REAL: case SQLTYPECODE_TDM_REAL: case REC_FLOAT32: - case REC_TDM_FLOAT32: precision = 22; break; case SQLTYPECODE_IEEE_DOUBLE: case SQLTYPECODE_TDM_DOUBLE: case REC_FLOAT64: - case REC_TDM_FLOAT64: precision = 54; break; case SQLTYPECODE_NUMERIC: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/cli/sqlcli.h ---------------------------------------------------------------------- diff --git a/core/sql/cli/sqlcli.h b/core/sql/cli/sqlcli.h index 4abac4b..6a05797 100644 --- a/core/sql/cli/sqlcli.h +++ b/core/sql/cli/sqlcli.h @@ -349,6 +349,10 @@ enum SQLTYPE_CODE { SQLTYPECODE_INTEGER_UNSIGNED = -401, SQLTYPECODE_LARGEINT = -402, + /* TINYINT */ + SQLTYPECODE_TINYINT = -403, + SQLTYPECODE_TINYINT_UNSIGNED = -404, + /* SMALLINT */ SQLTYPECODE_SMALLINT = 5, http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/comexe/ComTdb.cpp ---------------------------------------------------------------------- diff --git a/core/sql/comexe/ComTdb.cpp b/core/sql/comexe/ComTdb.cpp index dc8e5c4..88181a6 100644 --- a/core/sql/comexe/ComTdb.cpp +++ b/core/sql/comexe/ComTdb.cpp @@ -271,57 +271,6 @@ NA_EIDPROC void ComTdb::displayContents(Space * space,ULng32 flag) } } -// LCOV_EXCL_START -Float32 ComTdb::getTandemFloatValue(char * v) const -{ - Float32 f = 0; - double d; - - // convert tandem REAL(4 byte) to IEEE FLOAT(4 byte). - // If overflow, return FLT max. - if (convDoIt(v, - 4, - REC_TDM_FLOAT32, - 0, - 0, - (char*)&d, - (Lng32)sizeof(double), - REC_FLOAT64, - 0, 0, - NULL, 0, NULL, NULL, - CONV_UNKNOWN) != ex_expr::EXPR_OK) - f = -1; - else if (d > FLT_MAX) - f = FLT_MAX; - else - f = (Float32) d; - - return f; -} - -Float64 ComTdb::getTandemDoubleValue(char * v) const -{ - Float64 f = 0; - - // convert tandem DOUBLE(8 bytes) to IEEE DOUBLE(8 bytes). - // If overflow, return FLT max. - if (convDoIt(v, - 4, - REC_TDM_FLOAT64, - 0, - 0, - (char*)&f, - (Lng32)sizeof(double), - REC_FLOAT64, - 0, 0, - NULL, 0, NULL, NULL, - CONV_UNKNOWN) != ex_expr::EXPR_OK) - f = -1; - - return f; -} -// LCOV_EXCL_STOP - NA_EIDPROC void ComTdb::displayExpression(Space *space,ULng32 flag) { char buf[100]; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/comexe/ComTdb.h ---------------------------------------------------------------------- diff --git a/core/sql/comexe/ComTdb.h b/core/sql/comexe/ComTdb.h index 689bded..94ac93a 100644 --- a/core/sql/comexe/ComTdb.h +++ b/core/sql/comexe/ComTdb.h @@ -654,23 +654,10 @@ NA_EIDPROC void setPertableStatsTdbId(UInt16 id) { pertableStatsTdbId_ = id; } NA_EIDPROC -Float32 getTandemFloatValue(char * v) const; - -NA_EIDPROC -Float64 getTandemDoubleValue(char * v) const; - -NA_EIDPROC Float32 getFloatValue(char * v) const { Float32 f; - if (floatFieldsAreIEEE()) - str_cpy_all((char *)&f, v, sizeof(Float32)); -// LCOV_EXCL_START - else - { - f = getTandemFloatValue(v); - } -// LCOV_EXCL_STOP + str_cpy_all((char *)&f, v, sizeof(Float32)); return f; } @@ -679,14 +666,7 @@ NA_EIDPROC Float64 getDoubleValue(char * v) const { Float64 f; - if (floatFieldsAreIEEE()) - str_cpy_all((char *)&f, v, sizeof(Float64)); -// LCOV_EXCL_START - else - { - f = getTandemDoubleValue(v); - } -// LCOV_EXCL_STOP + str_cpy_all((char *)&f, v, sizeof(Float64)); return f; } http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/common/BaseTypes.cpp ---------------------------------------------------------------------- diff --git a/core/sql/common/BaseTypes.cpp b/core/sql/common/BaseTypes.cpp index bcc6cf6..cc708ab 100644 --- a/core/sql/common/BaseTypes.cpp +++ b/core/sql/common/BaseTypes.cpp @@ -398,6 +398,13 @@ short convertTypeToText_basic(char * text, // OUTPUT 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"); @@ -412,6 +419,13 @@ short convertTypeToText_basic(char * text, // OUTPUT 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)", precision, scale); + break; + case REC_BPINT_UNSIGNED: str_sprintf(text, "BIT PRECISION INT(%d) UNSIGNED", precision); break; @@ -433,7 +447,6 @@ short convertTypeToText_basic(char * text, // OUTPUT break; case REC_FLOAT32: - case REC_TDM_FLOAT32: if (precision == 0) str_sprintf(text, "REAL"); else @@ -441,7 +454,6 @@ short convertTypeToText_basic(char * text, // OUTPUT break; case REC_FLOAT64: - case REC_TDM_FLOAT64: if (precision == 0) str_sprintf(text, "DOUBLE PRECISION"); else @@ -657,6 +669,14 @@ Lng32 getAnsiTypeFromFSType(Lng32 datatype) 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; @@ -690,14 +710,6 @@ Lng32 getAnsiTypeFromFSType(Lng32 datatype) numeric_value = SQLTYPECODE_IEEE_DOUBLE; break; - case REC_TDM_FLOAT32: - numeric_value = SQLTYPECODE_TDM_REAL; - break; - - case REC_TDM_FLOAT64: - numeric_value = SQLTYPECODE_TDM_DOUBLE; - break; - case REC_DECIMAL_UNSIGNED: numeric_value = SQLTYPECODE_DECIMAL_UNSIGNED; break; @@ -767,6 +779,14 @@ 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; @@ -1006,6 +1026,14 @@ Lng32 getFSTypeFromANSIType(Lng32 ansitype) 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; @@ -1050,18 +1078,6 @@ Lng32 getFSTypeFromANSIType(Lng32 ansitype) datatype = REC_FLOAT64; break; - case SQLTYPECODE_TDM_REAL: - datatype = REC_TDM_FLOAT32; - break; - - case SQLTYPECODE_TDM_DOUBLE: - datatype = REC_TDM_FLOAT64; - break; - - case SQLTYPECODE_TDM_FLOAT: - datatype = REC_TDM_FLOAT64; - break; - case SQLTYPECODE_DECIMAL_UNSIGNED: datatype = REC_DECIMAL_UNSIGNED; break; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/common/ComSmallDefs.h ---------------------------------------------------------------------- diff --git a/core/sql/common/ComSmallDefs.h b/core/sql/common/ComSmallDefs.h index 8055e22..19c7dde 100644 --- a/core/sql/common/ComSmallDefs.h +++ b/core/sql/common/ComSmallDefs.h @@ -794,6 +794,8 @@ enum ComFSDataType { COM_UNKNOWN_FSDT = -1 , COM_VCHAR_FSDT = REC_BYTE_V_ASCII , COM_VCHAR_DBL_FSDT = REC_BYTE_V_DOUBLE , COM_VCHAR_LONG_FSDT = REC_BYTE_V_ASCII_LONG + , COM_SIGNED_BIN8_FSDT = REC_BIN8_SIGNED + , COM_UNSIGNED_BIN8_FSDT = REC_BIN8_UNSIGNED , COM_SIGNED_BIN16_FSDT = REC_BIN16_SIGNED , COM_UNSIGNED_BIN16_FSDT = REC_BIN16_UNSIGNED , COM_SIGNED_BIN32_FSDT = REC_BIN32_SIGNED @@ -991,6 +993,8 @@ enum ComODBCDataType { COM_UNKNOWN_ODT , COM_LONG_VARCHAR_ODT , COM_NUMERIC_SIGNED_ODT , COM_NUMERIC_UNSIGNED_ODT + , COM_TINYINT_SIGNED_ODT + , COM_TINYINT_UNSIGNED_ODT , COM_SMALLINT_SIGNED_ODT , COM_SMALLINT_UNSIGNED_ODT , COM_INTEGER_SIGNED_ODT @@ -1019,6 +1023,8 @@ enum ComODBCDataType { COM_UNKNOWN_ODT #define COM_LONG_VARCHAR_ODT_LIT "LONG VARCHAR " #define COM_NUMERIC_SIGNED_ODT_LIT "SIGNED NUMERIC " #define COM_NUMERIC_UNSIGNED_ODT_LIT "UNSIGNED NUMERIC " +#define COM_TINYINT_SIGNED_ODT_LIT "SIGNED TINYINT " +#define COM_TINYINT_UNSIGNED_ODT_LIT "UNSIGNED TINYINT " #define COM_SMALLINT_SIGNED_ODT_LIT "SIGNED SMALLINT " #define COM_SMALLINT_UNSIGNED_ODT_LIT "UNSIGNED SMALLINT " #define COM_INTEGER_SIGNED_ODT_LIT "SIGNED INTEGER " @@ -1546,6 +1552,8 @@ enum ComSQLDataType { COM_UNKNOWN_SDT , COM_BPINT_UNSIGNED_SDT , COM_NUMERIC_SIGNED_SDT , COM_NUMERIC_UNSIGNED_SDT + , COM_TINYINT_SIGNED_SDT + , COM_TINYINT_UNSIGNED_SDT , COM_SMALLINT_SIGNED_SDT , COM_SMALLINT_UNSIGNED_SDT , COM_INTEGER_SIGNED_SDT @@ -1573,6 +1581,8 @@ enum ComSQLDataType { COM_UNKNOWN_SDT #define COM_LONG_VARCHAR_SDT_LIT "LONG VARCHAR " #define COM_NUMERIC_SIGNED_SDT_LIT "SIGNED NUMERIC " #define COM_NUMERIC_UNSIGNED_SDT_LIT "UNSIGNED NUMERIC " +#define COM_TINYINT_SIGNED_SDT_LIT "SIGNED TINYINT " +#define COM_TINYINT_UNSIGNED_SDT_LIT "UNSIGNED TINYINT " #define COM_SMALLINT_SIGNED_SDT_LIT "SIGNED SMALLINT " #define COM_SMALLINT_UNSIGNED_SDT_LIT "UNSIGNED SMALLINT " #define COM_INTEGER_SIGNED_SDT_LIT "SIGNED INTEGER " http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/common/NAType.cpp ---------------------------------------------------------------------- diff --git a/core/sql/common/NAType.cpp b/core/sql/common/NAType.cpp index d1d3b3e..3553888 100644 --- a/core/sql/common/NAType.cpp +++ b/core/sql/common/NAType.cpp @@ -492,6 +492,14 @@ Lng32 NAType::getDisplayLength(Lng32 datatype, d_len = SQL_USMALL_DISPLAY_SIZE; break; + case REC_BIN8_SIGNED: + d_len = SQL_TINY_DISPLAY_SIZE + scale_len; + break; + + case REC_BIN8_UNSIGNED: + d_len = SQL_UTINY_DISPLAY_SIZE + scale_len; + break; + case REC_BIN16_SIGNED: d_len = SQL_SMALL_DISPLAY_SIZE + scale_len; break; @@ -544,12 +552,10 @@ Lng32 NAType::getDisplayLength(Lng32 datatype, break; case REC_FLOAT32: - case REC_TDM_FLOAT32: d_len = SQL_REAL_DISPLAY_SIZE; break; case REC_FLOAT64: - case REC_TDM_FLOAT64: d_len = SQL_DOUBLE_PRECISION_DISPLAY_SIZE; break; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/common/NumericType.cpp ---------------------------------------------------------------------- diff --git a/core/sql/common/NumericType.cpp b/core/sql/common/NumericType.cpp index c9a3b4a..47d30ba 100644 --- a/core/sql/common/NumericType.cpp +++ b/core/sql/common/NumericType.cpp @@ -45,6 +45,7 @@ #define NAME_BUF_LEN 100 NAString LiteralInteger("INTEGER"); +NAString LiteralTinyInt("TINYINT"); NAString LiteralSmallInt("SMALLINT"); NAString LiteralBPInt("BIT PRECISION INTEGER"); NAString LiteralLargeInt("LARGEINT"); @@ -160,6 +161,10 @@ enum NumericType::NumericTypeEnum { token = SQLSmall_TYPE; } + else if (adtName == "TINYINT") + { + token = SQLTiny_TYPE; + } else if (adtName == "FLOAT") { token = SQLFloat_TYPE; @@ -172,14 +177,6 @@ enum NumericType::NumericTypeEnum { token = SQLDoublePrecision_TYPE; } - else if (adtName == "REAL TDM") - { - token = SQLRealTdm_TYPE; - } - else if (adtName == "DOUBLE PRECISION TDM") - { - token = SQLDoublePrecisionTdm_TYPE; - } else // issue an error { NAString temp = "INTEGER"; @@ -324,12 +321,8 @@ NABoolean NumericType::errorsCanOccur (const NAType& target, // (which today always happens to be true) and if the // target precision is greater than or equal to the source // then no conversion error can occur - // Note: conversion from IEEE 64-bit floating point format to the - // Tandem 64-bit floating point format can generate an error. - if ((getTrueBinaryPrecision() <= - numericTarget.getTrueBinaryPrecision()) && - !((qualifier_ == SQLDoublePrecision_TYPE) && - (numericTarget.qualifier_ == SQLDoublePrecisionTdm_TYPE))) + if (getTrueBinaryPrecision() <= + numericTarget.getTrueBinaryPrecision()) rc = FALSE; } } @@ -353,6 +346,9 @@ NAString NumericType::getTypeName(NumericTypeEnum ntev) const case SQLBPInt_TYPE : adtName = "BIT PRECISION INTEGER"; break; + case SQLTiny_TYPE : + adtName = "TINYINT"; + break; case SQLSmall_TYPE : adtName = "SMALLINT"; break; @@ -383,12 +379,6 @@ NAString NumericType::getTypeName(NumericTypeEnum ntev) const case SQLDoublePrecision_TYPE : adtName = "DOUBLE PRECISION"; break; - case SQLRealTdm_TYPE : - adtName = "REAL TDM"; - break; - case SQLDoublePrecisionTdm_TYPE : - adtName = "DOUBLE PRECISION TDM"; - break; default : assert(0 == 1); // ****ERROR: data type not supported break; @@ -403,11 +393,6 @@ NAString NumericType::getTypeSQLname(NABoolean terse) const NAString rName = getTypeName(qualifier_); switch (qualifier_) { - case SQLDoublePrecisionTdm_TYPE: - case SQLRealTdm_TYPE: - // internally we treat both them as IEEE dounle precision - rName = "DOUBLE PRECISION"; - break; case SQLBigNum_TYPE : rName = "NUMERIC"; if (getScale() > 0) { @@ -854,6 +839,124 @@ NABoolean NumericType::isEncodingNeeded() const } // ----------------------------------------------------------------------- +// Methods for SQLTiny +// ----------------------------------------------------------------------- + +SQLTiny::SQLTiny(NABoolean allowNegValues, NABoolean allowSQLnull,CollHeap * heap) + : NumericType + ( LiteralTinyInt + , SQL_TINY_SIZE + , (allowNegValues ? SQL_SMALL_PRECISION:SQL_USMALL_PRECISION) + , 0 + , 2 + , allowNegValues + , allowSQLnull + ,FALSE + ,heap + ) +{ +} // SQLTiny() + +double SQLTiny::encode (void* bufPtr) const +{ + Int8 tempValue; + UInt8 usTempValue; + char * valPtr = (char *)bufPtr; + if (supportsSQLnull()) + valPtr += getSQLnullHdrSize(); + + if(isUnsigned()) + { + str_cpy_all ((char *)&usTempValue, valPtr, getNominalSize()); + return ((double)usTempValue * pow(10.0, -1 * getScale())); + } + else + { + str_cpy_all ((char *)&tempValue, valPtr, getNominalSize()); + return ((double)tempValue * pow(10.0, -1 * getScale())); + } +} + +// -- Min and max permissible values + +void SQLTiny::minRepresentableValue(void* bufPtr, Lng32* bufLen, + NAString ** stringLiteral, + CollHeap* h) const +{ + assert(*bufLen >= sizeof(char)); + Lng32 valueBuf; + *bufLen = sizeof(char); + if (NumericType::isUnsigned()) + { + *((char*)bufPtr) = 0; + valueBuf = 0; + } + else + { + char temp = CHAR_MIN; + for (Lng32 i = 0; i < sizeof(char); i++) + { + ((char *)bufPtr)[i] = ((char *)&temp)[i]; + } + valueBuf = CHAR_MIN; + } + + if (stringLiteral != NULL) + { + // Generate a printable string for the minimum value + char nameBuf[NAME_BUF_LEN]; // 2 ** 16 == 65536. Need space for 5 digits only + signedLongToAscii(valueBuf, nameBuf); + *stringLiteral = new (h) NAString(nameBuf, h); + } + +} // SQLTiny::minRepresentableValue() + +void SQLTiny::maxRepresentableValue(void* bufPtr, Lng32* bufLen, + NAString ** stringLiteral, + CollHeap* h) const +{ + assert(*bufLen >= sizeof(char)); + Lng32 valueBuf; + *bufLen = sizeof(char); + if (NumericType::isUnsigned()) + { + unsigned short temp = UCHAR_MAX; + for (Lng32 i = 0; i < sizeof(char); i++) + { + ((char *)bufPtr)[i] = ((char *)&temp)[i]; + } + valueBuf = UCHAR_MAX; + } + else + { + short temp = CHAR_MAX; + for (Lng32 i = 0; i < sizeof(char); i++) + { + ((char *)bufPtr)[i] = ((char *)&temp)[i]; + } + valueBuf = CHAR_MAX; + } + + if (stringLiteral != NULL) + { + // Generate a printable string for the maximum value + char nameBuf[NAME_BUF_LEN]; // 2 ** 16 == 65536. Need space for 5 digits only + signedLongToAscii(valueBuf, nameBuf); + *stringLiteral = new (h) NAString(nameBuf, h); + } + +} // SQLTiny::maxRepresentableValue() + +NAString* SQLTiny::convertToString(double v, CollHeap* h) const +{ + Lng32 valueBuf = (Lng32)v; + + char nameBuf[NAME_BUF_LEN]; // 2 ** 16 == 65536. Need space for 5 digits only + signedLongToAscii(valueBuf, nameBuf); + return new (h) NAString(nameBuf, h); +} + +// ----------------------------------------------------------------------- // Methods for SQLSmall // ----------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/common/NumericType.h ---------------------------------------------------------------------- diff --git a/core/sql/common/NumericType.h b/core/sql/common/NumericType.h index 1020e05..448d8bf 100644 --- a/core/sql/common/NumericType.h +++ b/core/sql/common/NumericType.h @@ -49,6 +49,7 @@ // ----------------------------------------------------------------------- class NumericType; class SQLBPInt; +class SQLTiny; class SQLSmall; class SQLInt; class SQLLargeInt; @@ -59,11 +60,9 @@ class SQLBigNum; class SQLFloat; class SQLReal; class SQLDoublePrecision; -class SQLRealTdm; -class SQLDoublePrecisionTdm; - extern NAString LiteralInteger; +extern NAString LiteralTinyInt; extern NAString LiteralSmallInt; extern NAString LiteralBPInt; extern NAString LiteralLargeInt; @@ -277,6 +276,7 @@ private: MIN_NUMERIC_TYPE, MIN_EXACT_NUMERIC_TYPE, SQLBPInt_TYPE, + SQLTiny_TYPE, SQLSmall_TYPE, SQLInt_TYPE, SQLNumeric_TYPE, @@ -289,8 +289,6 @@ private: SQLReal_TYPE, SQLFloat_TYPE, SQLDoublePrecision_TYPE, - SQLRealTdm_TYPE, - SQLDoublePrecisionTdm_TYPE, MAX_APPROX_NUMERIC_TYPE, MAX_NUMERIC_TYPE }; @@ -445,6 +443,99 @@ private: // *********************************************************************** // +// SQLTiny : SQL TINY +// +// *********************************************************************** +class SQLTiny : public NumericType +{ +public: + // --------------------------------------------------------------------- + // Constructor functions + // --------------------------------------------------------------------- + SQLTiny (NABoolean allowNegValues = TRUE, + NABoolean allowSQLnull = TRUE, + CollHeap * heap =0); + + short getFSDatatype() const + { + if (isUnsigned()) + return REC_BIN8_UNSIGNED; + else + return REC_BIN8_SIGNED; + } + + NABoolean roundTripConversionToDouble() const { return TRUE; }; + + virtual Lng32 getMagnitude() const { return isUnsigned() ? 28 : 25; } + + virtual double getMaxValue() const { return isUnsigned() ? 255 : 127; } + + virtual double getMinValue() const { return isUnsigned() ? 0 : -127; } + + virtual NABoolean shouldCheckValueFitInType() const { return TRUE; } + + // --------------------------------------------------------------------- + // Does this data type use decimal or binary precision? + // --------------------------------------------------------------------- + NABoolean decimalPrecision() const { return FALSE; } + + NABoolean binaryPrecision() const { return TRUE; } + + virtual void makeUnsigned() + { + setPrecision(SQL_UTINY_PRECISION); + NumericType::makeUnsigned(); + } + + virtual void makeSigned() + { + setPrecision(SQL_TINY_PRECISION); + NumericType::makeSigned(); + } + + // --------------------------------------------------------------------- + // Methods that return the binary form of the minimum and the maximum + // representable values. + // --------------------------------------------------------------------- + void minRepresentableValue(void* bufPtr, Lng32* bufLen, + NAString ** stringLiteral = NULL, + CollHeap* h=0) const; + void maxRepresentableValue(void* bufPtr, Lng32* bufLen, + NAString ** stringLiteral = NULL, + CollHeap* h=0) const; + + NAString* convertToString(double v, CollHeap* h=0) const; + + // --------------------------------------------------------------------- + // Method that returns the encoded form for a given value to be + // used by the optimizer for estimations. + // --------------------------------------------------------------------- + virtual double encode (void* bufPtr) const; + + // --------------------------------------------------------------------- + // A virtual function to return a copy of the type. + // --------------------------------------------------------------------- + virtual NAType *newCopy(CollHeap* h=0) const + { + return new(h) SQLTiny(!isUnsigned() + ,supportsSQLnull(),h + ); + } + + virtual double getNormalizedValue(void* buf) const + { + if (isUnsigned()) + return (double)(*(unsigned char *)buf); + else + return (double)(*(char *)buf); + }; + +private: + +}; // class SQLTiny + +// *********************************************************************** +// // SQLSmall : SQL SMALLINT // // *********************************************************************** @@ -1362,100 +1453,6 @@ private: }; // class SQLDoublePrecision -// *********************************************************************** -// -// SQLRealTdm : SQL REAL in TANDEM format -// -// *********************************************************************** -class SQLRealTdm : public SQLFloat -{ -public: - // --------------------------------------------------------------------- - // Constructor functions - // --------------------------------------------------------------------- - SQLRealTdm (NABoolean allowSQLnull = TRUE,CollHeap * heap = 0, - Lng32 precision = SQL_REAL_PRECISION) - : SQLFloat(allowSQLnull, SQL_REAL_SIZE, precision, "REAL TDM",heap) - {} - - // sqlparser.y calls the above constructor with zero precision. This can - // mislead callers of getPrecision() into thinking type REAL - // has zero precision. The true precision of type REAL is - // SQL_REAL_PRECISION. - virtual Lng32 getTruePrecision() const { return SQL_REAL_PRECISION; } - - short getFSDatatype() const { return REC_TDM_FLOAT32; } - - NABoolean isExternalType() const - { - return TRUE; - } - - NAType * equivalentType(CollHeap* h=0) const - { - return new(h) SQLDoublePrecision(supportsSQLnull(), h, - getPrecision()); - } - - // --------------------------------------------------------------------- - // A virtual function to return a copy of the type. - // --------------------------------------------------------------------- - virtual NAType *newCopy(CollHeap* h=0) const - { return new(h) SQLRealTdm(supportsSQLnull(),h,getPrecision()); } - -private: - -}; // class SQLRealTdm - -// *********************************************************************** -// -// SQLDoublePrecisionTdm : SQL DOUBLE PRECISION in Tandem format -// -// *********************************************************************** -class SQLDoublePrecisionTdm : public SQLFloat -{ -public: - // --------------------------------------------------------------------- - // Constructor functions - // --------------------------------------------------------------------- - SQLDoublePrecisionTdm (NABoolean allowSQLnull = TRUE,CollHeap * heap =0, - Lng32 precision = SQL_DOUBLE_PRECISION) - : SQLFloat(allowSQLnull, SQL_DOUBLE_PRECISION_SIZE, - precision, "DOUBLE PRECISION TDM",heap) - {} - - // sqlparser.y calls the above constructor with zero precision. This can - // mislead callers of getPrecision() into thinking type DOUBLE PRECISION - // has zero precision. The true precision of type DOUBLE PRECISION is - // SQL_DOUBLE_PRECISION. - virtual Lng32 getTruePrecision() const { return SQL_DOUBLE_PRECISION; } - - short getFSDatatype() const { return REC_TDM_FLOAT64; } - - NABoolean isExternalType() const - { - return TRUE; - } - - NAType * equivalentType(CollHeap* h=0) const - { - return new(h) SQLDoublePrecision(supportsSQLnull(), h, - getPrecision()); - } - - // --------------------------------------------------------------------- - // A virtual function to return a copy of the type. - // --------------------------------------------------------------------- - virtual NAType *newCopy(CollHeap* h=0) const - { - return new(h) SQLDoublePrecisionTdm(supportsSQLnull(),h,getPrecision()); - } - -private: - -}; // class SQLDoublePrecisionTdm - - #endif /* NUMERICTYPE_H */ http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/common/SQLTypeDefs.h ---------------------------------------------------------------------- diff --git a/core/sql/common/SQLTypeDefs.h b/core/sql/common/SQLTypeDefs.h index 7296547..61b3258 100644 --- a/core/sql/common/SQLTypeDefs.h +++ b/core/sql/common/SQLTypeDefs.h @@ -46,6 +46,8 @@ #define BINARY64_PRECISION 64 #define SIGN_BIT 1 +#define SQL_TINY_PRECISION 7 +#define SQL_UTINY_PRECISION 8 #define SQL_SMALL_PRECISION 15 #define SQL_USMALL_PRECISION 16 #define SQL_INT_PRECISION 31 @@ -59,6 +61,7 @@ // ----------------------------------------------------------------------- // Sizes of standard SQL data types in bytes // ----------------------------------------------------------------------- +#define SQL_TINY_SIZE 1 #define SQL_SMALL_SIZE 2 #define SQL_INT_SIZE 4 #define SQL_LARGE_SIZE 8 @@ -75,6 +78,8 @@ // ----------------------------------------------------------------------- // display Sizes of standard SQL data types in bytes // ----------------------------------------------------------------------- +#define SQL_TINY_DISPLAY_SIZE 4 +#define SQL_UTINY_DISPLAY_SIZE 3 #define SQL_SMALL_DISPLAY_SIZE 6 #define SQL_USMALL_DISPLAY_SIZE 5 #define SQL_INT_DISPLAY_SIZE 11 http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/common/dfs2rec.h ---------------------------------------------------------------------- diff --git a/core/sql/common/dfs2rec.h b/core/sql/common/dfs2rec.h index a166047..88852fc 100644 --- a/core/sql/common/dfs2rec.h +++ b/core/sql/common/dfs2rec.h @@ -58,11 +58,11 @@ #define REC_BIN32_UNSIGNED 133 #define REC_BIN64_SIGNED 134 #define REC_BPINT_UNSIGNED 135 // Bit Precision Integer -#define REC_MAX_BINARY 135 +#define REC_BIN8_SIGNED 136 // tinyint signed +#define REC_BIN8_UNSIGNED 137 // tinyint unsigned +#define REC_MAX_BINARY 137 -#define REC_MIN_FLOAT 140 -#define REC_TDM_FLOAT32 140 -#define REC_TDM_FLOAT64 141 +#define REC_MIN_FLOAT 142 #define REC_IEEE_FLOAT32 142 #define REC_IEEE_FLOAT64 143 #define REC_MAX_FLOAT 143 http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/executor/ExHbaseIUD.cpp ---------------------------------------------------------------------- diff --git a/core/sql/executor/ExHbaseIUD.cpp b/core/sql/executor/ExHbaseIUD.cpp index 9553d53..793aee2 100644 --- a/core/sql/executor/ExHbaseIUD.cpp +++ b/core/sql/executor/ExHbaseIUD.cpp @@ -1114,6 +1114,10 @@ static const char* TrafToHiveType(Attributes* attrs) switch (datatype) { + case REC_BIN8_SIGNED: + case REC_BIN8_UNSIGNED: + return "tinyint"; + case REC_BIN16_SIGNED: case REC_BIN16_UNSIGNED: case REC_BPINT_UNSIGNED: @@ -1126,11 +1130,9 @@ static const char* TrafToHiveType(Attributes* attrs) case REC_BIN64_SIGNED: return "bigint"; - case REC_TDM_FLOAT32: case REC_IEEE_FLOAT32: return "float"; - case REC_TDM_FLOAT64: case REC_IEEE_FLOAT64: return "double"; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/exp/ExpPCodeClauseGen.cpp ---------------------------------------------------------------------- diff --git a/core/sql/exp/ExpPCodeClauseGen.cpp b/core/sql/exp/ExpPCodeClauseGen.cpp index 6868a3d..83063c1 100644 --- a/core/sql/exp/ExpPCodeClauseGen.cpp +++ b/core/sql/exp/ExpPCodeClauseGen.cpp @@ -1606,12 +1606,10 @@ ex_expr::exp_return_type ExHDPHash::pCodeGenerate(Space *space, UInt32 f) break; case REC_BIN32_SIGNED: case REC_BIN32_UNSIGNED: - case REC_TDM_FLOAT32: case REC_IEEE_FLOAT32: flags = SWAP_FOUR; break; case REC_BIN64_SIGNED: - case REC_TDM_FLOAT64: case REC_IEEE_FLOAT64: flags = SWAP_EIGHT; break; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/exp/exp_arith.cpp ---------------------------------------------------------------------- diff --git a/core/sql/exp/exp_arith.cpp b/core/sql/exp/exp_arith.cpp index 0059417..dcec35f 100644 --- a/core/sql/exp/exp_arith.cpp +++ b/core/sql/exp/exp_arith.cpp @@ -1388,102 +1388,7 @@ ex_expr::exp_return_type ex_arith_clause::evalUnsupportedOperations( short op1Type = getOperand(1)->getDatatype(); short op2Type = getOperand(2)->getDatatype(); - // if either of the two operands is a Tandem float, convert - // them to IEEE float and then do the arith operation. This case - // will be reached for pre-R2 programs where only tandem floats - // were supported. We support this so as to not require applications - // to recompile. This case is also needed for versioning support - // in mixed node environments. - if ((op1Type == REC_TDM_FLOAT32) || - (op1Type == REC_TDM_FLOAT64) || - (op2Type == REC_TDM_FLOAT32) || - (op2Type == REC_TDM_FLOAT64)) - { - // convert both operands to double. - // Do the arith operation and convert result back to the - // type of result operand. - double op1Double; - double op2Double; - double op0Double; // result - - char * opDoubleData[3]; - opDoubleData[0] = (char *)&op0Double; - opDoubleData[1] = (char *)&op1Double; - opDoubleData[2] = (char *)&op2Double; - - if (convDoIt(op_data[1], - getOperand(1)->getLength(), - op1Type, - getOperand(1)->getPrecision(), - getOperand(1)->getScale(), - (char*)&op1Double, - (Lng32)sizeof(double), - REC_FLOAT64, - 0, - 0, NULL, 0, heap, diagsArea, - CONV_UNKNOWN) != ex_expr::EXPR_OK) - return ex_expr::EXPR_ERROR; - - if (convDoIt(op_data[2], - getOperand(2)->getLength(), - op2Type, - getOperand(2)->getPrecision(), - getOperand(2)->getScale(), - (char*)&op2Double, - (Lng32)sizeof(double), - REC_FLOAT64, - 0, - 0, NULL, 0, heap, diagsArea, - CONV_UNKNOWN) != ex_expr::EXPR_OK) - return ex_expr::EXPR_ERROR; - - // do the arith operation. - ex_arith_clause tempArith; - SimpleType op1DoubleAttr(REC_FLOAT64, sizeof(double), 0, 0, - ExpTupleDesc::SQLMX_FORMAT, - 8, 0, 0, 0, Attributes::NO_DEFAULT, 0); - SimpleType op2DoubleAttr(REC_FLOAT64, sizeof(double), 0, 0, - ExpTupleDesc::SQLMX_FORMAT, - 8, 0, 0, 0, Attributes::NO_DEFAULT, 0); - SimpleType op0DoubleAttr(REC_FLOAT64, sizeof(double), 0, 0, - ExpTupleDesc::SQLMX_FORMAT, - 8, 0, 0, 0, Attributes::NO_DEFAULT, 0); - - tempArith.set_case_index(getOperType(), - &op1DoubleAttr, - &op2DoubleAttr, - &op0DoubleAttr); - - if (tempArith.get_case_index() == ARITH_NOT_SUPPORTED) - { - ExRaiseSqlError(heap, diagsArea, EXE_INTERNAL_ERROR); - return ex_expr::EXPR_ERROR; - } - - if (tempArith.eval(opDoubleData, - heap, diagsArea) != ex_expr::EXPR_OK) - return ex_expr::EXPR_ERROR; - - // convert double result to the actual result type. - if (convDoIt(opDoubleData[0], - (Lng32)sizeof(double), - REC_FLOAT64, - 0, 0, - op_data[0], - getOperand(0)->getLength(), - getOperand(0)->getDatatype(), - getOperand(0)->getPrecision(), - getOperand(0)->getScale(), - NULL, 0, heap, diagsArea, - CONV_UNKNOWN) != ex_expr::EXPR_OK) - return ex_expr::EXPR_ERROR; - } - else - { - ExRaiseSqlError(heap, diagsArea, EXE_INTERNAL_ERROR); - return ex_expr::EXPR_ERROR; - } - - return ex_expr::EXPR_OK; + ExRaiseSqlError(heap, diagsArea, EXE_INTERNAL_ERROR); + return ex_expr::EXPR_ERROR; } http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/exp/exp_attrs.cpp ---------------------------------------------------------------------- diff --git a/core/sql/exp/exp_attrs.cpp b/core/sql/exp/exp_attrs.cpp index 4241a35..b9d3b09 100644 --- a/core/sql/exp/exp_attrs.cpp +++ b/core/sql/exp/exp_attrs.cpp @@ -220,6 +220,8 @@ switch (datatype) // When you add new datatype in /common/dfs2rec.h, don't // forget add new case here. Otherwise, showplan won't display it. + case REC_BIN8_SIGNED: return extFormat? (char *)"TINYINT SIGNED":(char *)"REC_BIN8_SIGNED"; + case REC_BIN8_UNSIGNED: return extFormat? (char *)"TINYINT UNSIGNED":(char *)"REC_BIN8_UNSIGNED"; case REC_BIN16_SIGNED: return extFormat? (char *)"SMALLINT SIGNED":(char *)"REC_BIN16_SIGNED"; case REC_BIN16_UNSIGNED: return extFormat? (char *)"SMALLINT UNSIGNED":(char *)"REC_BIN16_UNSIGNED"; case REC_BIN32_SIGNED: return extFormat? (char *)"INTEGER SIGNED":(char *)"REC_BIN32_SIGNED"; @@ -227,8 +229,6 @@ switch (datatype) case REC_BIN64_SIGNED: return extFormat? (char *)"LARGEINT":(char *)"REC_BIN64_SIGNED"; case REC_BPINT_UNSIGNED: return extFormat? (char *)"BIT PRECISION INTEGER":(char *)"REC_BPINT_UNSIGNED"; - case REC_TDM_FLOAT32: return extFormat? (char *)"FLOAT":(char *)"REC_TDM_FLOAT32"; - case REC_TDM_FLOAT64: return extFormat? (char *)"DOUBLE PRECISION":(char *)"REC_TDM_FLOAT64"; case REC_IEEE_FLOAT32: return extFormat? (char *)"IEEE FLOAT":(char *)"REC_IEEE_FLOAT32"; case REC_IEEE_FLOAT64: return extFormat? (char *)"IEEE DOUBLE PRECISION":(char *)"REC_IEEE_FLOAT64"; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/exp/exp_clause_derived.h ---------------------------------------------------------------------- diff --git a/core/sql/exp/exp_clause_derived.h b/core/sql/exp/exp_clause_derived.h index 41904f6..5301ada 100644 --- a/core/sql/exp/exp_clause_derived.h +++ b/core/sql/exp/exp_clause_derived.h @@ -1544,7 +1544,22 @@ enum conv_case_index { CONV_BLOB_BLOB =249, CONV_BLOB_ASCII_F =250, - CONV_GBK_F_UTF8_V =251 + CONV_GBK_F_UTF8_V =251, + + // TINYINT conversions + CONV_BIN8S_BIN8S =252, + CONV_BIN8U_BIN8U =253, + CONV_BIN8S_BIN16S =254, + CONV_BIN8U_BIN16U =255, + CONV_BIN16S_BIN8S =256, + CONV_BIN16U_BIN8U =257, + CONV_BIN8S_ASCII =258, + CONV_BIN8U_ASCII =259, + CONV_BIN16U_BIN8S =260, + CONV_BIN16S_BIN8U =261, + CONV_BIN8U_BIN16S =262, + CONV_ASCII_BIN8S =263, + CONV_ASCII_BIN8U =264 }; class SQLEXP_LIB_FUNC ex_conv_clause : public ex_clause { @@ -1699,7 +1714,6 @@ public: { return alignment_; } - private: // conv_case_index Int16 case_index; // 00-01 http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/exp/exp_comp.cpp ---------------------------------------------------------------------- diff --git a/core/sql/exp/exp_comp.cpp b/core/sql/exp/exp_comp.cpp index 0a871cf..a238d59 100644 --- a/core/sql/exp/exp_comp.cpp +++ b/core/sql/exp/exp_comp.cpp @@ -1160,84 +1160,8 @@ ex_expr::exp_return_type ex_comp_clause::evalUnsupportedOperations( short op1Type = getOperand(1)->getDatatype(); short op2Type = getOperand(2)->getDatatype(); - // if either of the two operands is a Tandem float, convert - // them to IEEE float and then do the arith operation. This case - // will be reached for pre-R2 programs where only tandem floats - // were supported. We support this so as to not require applications - // to recompile. This case is also needed for versioning support - // in mixed node environments. - if ((op1Type == REC_TDM_FLOAT32) || - (op1Type == REC_TDM_FLOAT64) || - (op2Type == REC_TDM_FLOAT32) || - (op2Type == REC_TDM_FLOAT64)) - { - // convert both operands to double and - // do the comparison operation. - - double op1Double; - double op2Double; - - if (convDoIt(op_data[1], - getOperand(1)->getLength(), - op1Type, - getOperand(1)->getPrecision(), - getOperand(1)->getScale(), - (char*)&op1Double, - (Lng32)sizeof(double), - REC_FLOAT64, - 0, - 0, NULL, 0, heap, diagsArea, - CONV_UNKNOWN) != ex_expr::EXPR_OK) - return ex_expr::EXPR_ERROR; - - if (convDoIt(op_data[2], - getOperand(2)->getLength(), - op2Type, - getOperand(2)->getPrecision(), - getOperand(2)->getScale(), - (char*)&op2Double, - (Lng32)sizeof(double), - REC_FLOAT64, - 0, - 0, NULL, 0, heap, diagsArea, - CONV_UNKNOWN) != ex_expr::EXPR_OK) - return ex_expr::EXPR_ERROR; - - // do the comparison operation. - ex_comp_clause tempComp; - SimpleType op1DoubleAttr(REC_FLOAT64, sizeof(double), 0, 0, - ExpTupleDesc::SQLMX_FORMAT, - 8, 0, 0, 0, Attributes::NO_DEFAULT, 0); - SimpleType op2DoubleAttr(REC_FLOAT64, sizeof(double), 0, 0, - ExpTupleDesc::SQLMX_FORMAT, - 8, 0, 0, 0, Attributes::NO_DEFAULT, 0); - - tempComp.set_case_index(getOperType(), - &op1DoubleAttr, - &op2DoubleAttr); - - if (tempComp.get_case_index() == COMP_NOT_SUPPORTED) - { - ExRaiseSqlError(heap, diagsArea, EXE_INTERNAL_ERROR); - return ex_expr::EXPR_ERROR; - } - - char * opDoubleData[3]; - opDoubleData[1] = (char *)&op1Double; - opDoubleData[2] = (char *)&op2Double; - opDoubleData[0] = op_data[0]; - - if (tempComp.eval(opDoubleData, - heap, diagsArea) != ex_expr::EXPR_OK) - return ex_expr::EXPR_ERROR; - } - else - { - ExRaiseSqlError(heap, diagsArea, EXE_INTERNAL_ERROR); - return ex_expr::EXPR_ERROR; - } - - return ex_expr::EXPR_OK; + ExRaiseSqlError(heap, diagsArea, EXE_INTERNAL_ERROR); + return ex_expr::EXPR_ERROR; } // LCOV_EXCL_STOP http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/exp/exp_conv.cpp ---------------------------------------------------------------------- diff --git a/core/sql/exp/exp_conv.cpp b/core/sql/exp/exp_conv.cpp index 14024ec..1057ff2 100644 --- a/core/sql/exp/exp_conv.cpp +++ b/core/sql/exp/exp_conv.cpp @@ -3917,7 +3917,7 @@ ex_expr::exp_return_type checkPrecision(Int64 source, // We've satisfied the above criteria. Check that the source value // will fit in the target NUMERIC. // - if (targetPrecision <= 18) // ??? Larry Schumacher ??? + if (targetPrecision <= 18) if ((source < getMinDecValue(targetPrecision, targetType)) || (source > getMaxDecValue(targetPrecision)) ) { @@ -4912,6 +4912,292 @@ convDoIt(char * source, } } + case CONV_BIN8S_BIN8S: + { + *(Int8 *)target = *(Int8 *)source; + } + break; + + case CONV_BIN8U_BIN8U: + { + *(UInt8 *)target = *(UInt8 *)source; + } + break; + + case CONV_BIN8S_BIN16S: + { + *(Int16 *)target = *(Int8 *)source; + } + break; + + case CONV_BIN8U_BIN16U: + { + *(UInt16 *)target = *(UInt8 *)source; + } + break; + + case CONV_BIN8U_BIN16S: + { + *(Int16 *)target = *(UInt8 *)source; + } + break; + + case CONV_BIN16U_BIN8S: + { + if (*(UInt16 *)source > CHAR_MAX) + { + if (dataConversionErrorFlag != 0) // Capture error in variable? + { + *(Int8 *)target = CHAR_MAX; + *dataConversionErrorFlag = ex_conv_clause::CONV_RESULT_ROUNDED_DOWN_TO_MAX; + } + else + { + ExRaiseDetailSqlError(heap, diagsArea, EXE_NUMERIC_OVERFLOW, + source, sourceLen, sourceType, sourceScale, + targetType, tempFlags); + return ex_expr::EXPR_ERROR; + } + } + else + { + if (dataConversionErrorFlag != 0) + { // Set the target value. + *(Int8 *)target = (Int8) *(UInt16 *)source; + } + else + { // Check target precision. Then set target value. + if (checkPrecision((Int64)*(UInt16 *)source, + sourceLen, + sourceType, + sourcePrecision, + sourceScale, + targetType, + targetPrecision, + targetScale, + heap, + diagsArea, + tempFlags) == ex_expr::EXPR_OK) + { + *(Int8 *)target = (Int8) *(UInt16 *)source; + } + else + { + return ex_expr::EXPR_ERROR; + } + } + } + } + break; + + case CONV_BIN16S_BIN8U: + { + if (*(Int16 *)source < 0) + { + if (dataConversionErrorFlag != 0) // Capture error in variable? + { + *(UInt8 *)target = 0; + *dataConversionErrorFlag = ex_conv_clause::CONV_RESULT_ROUNDED_UP_TO_MIN; + } + else + { + ExRaiseSqlError(heap, diagsArea, EXE_UNSIGNED_OVERFLOW); + return ex_expr::EXPR_ERROR; + } + } + else if (*(Int16 *)source > UCHAR_MAX) + { + if (dataConversionErrorFlag != 0) + { + *(UInt8 *)target = UCHAR_MAX; + *dataConversionErrorFlag = ex_conv_clause::CONV_RESULT_ROUNDED_DOWN_TO_MAX; + } + else + { + ExRaiseDetailSqlError(heap, diagsArea, EXE_NUMERIC_OVERFLOW, + source, sourceLen, sourceType, sourceScale, + targetType, tempFlags); + return ex_expr::EXPR_ERROR; + } + } + else + { + if (dataConversionErrorFlag != 0) + { + *(UInt8 *)target = (UInt8) *(Int16 *)source; + } + else + { + if (checkPrecision((Int64)*(Int16 *)source, + sourceLen, + sourceType, + sourcePrecision, + sourceScale, + targetType, + targetPrecision, + targetScale, + heap, + diagsArea, + tempFlags) == ex_expr::EXPR_OK) + { + *(UInt8 *)target = (UInt8) *(Int16 *)source; + } + else + { + return ex_expr::EXPR_ERROR; + } + } + } + } + break; + + case CONV_BIN16S_BIN8S: + { + if (*(Int16 *)source < CHAR_MIN) + { + if (dataConversionErrorFlag != 0) // Capture error in variable? + { + *(Int8 *)target = CHAR_MIN; + *dataConversionErrorFlag = ex_conv_clause::CONV_RESULT_ROUNDED_UP_TO_MIN; + } + else + { + ExRaiseDetailSqlError(heap, diagsArea, EXE_NUMERIC_OVERFLOW, + source, sourceLen, sourceType, sourceScale, + targetType, tempFlags); + return ex_expr::EXPR_ERROR; + } + } + else if (*(Int16 *)source > CHAR_MAX) + { + if (dataConversionErrorFlag != 0) // Capture error in variable? + { + *(Int8 *)target = CHAR_MAX; + *dataConversionErrorFlag = ex_conv_clause::CONV_RESULT_ROUNDED_DOWN_TO_MAX; + } + else + { + ExRaiseDetailSqlError(heap, diagsArea, EXE_NUMERIC_OVERFLOW, + source, sourceLen, sourceType, sourceScale, + targetType, tempFlags); + return ex_expr::EXPR_ERROR; + } + } + else + { + if (dataConversionErrorFlag != 0) + { // Set the target value. + *(Int8 *)target = (Int8) *(Int16 *)source; + } + else + { // Check target precision. Then set target value. + if (checkPrecision((Int64)*(Int16 *)source, + sourceLen, + sourceType, + sourcePrecision, + sourceScale, + targetType, + targetPrecision, + targetScale, + heap, + diagsArea, + tempFlags) == ex_expr::EXPR_OK) + { + *(Int8 *)target = (Int8) *(Int16 *)source; + } + else + { + return ex_expr::EXPR_ERROR; + } + } + } + } + break; + + case CONV_BIN16U_BIN8U: + { + if (*(UInt16 *)source > UCHAR_MAX) + { + if (dataConversionErrorFlag != 0) // Capture error in variable? + { + *(UInt8 *)target = UCHAR_MAX; + *dataConversionErrorFlag = ex_conv_clause::CONV_RESULT_ROUNDED_DOWN_TO_MAX; + } + else + { + ExRaiseDetailSqlError(heap, diagsArea, EXE_NUMERIC_OVERFLOW, + source, sourceLen, sourceType, sourceScale, + targetType, tempFlags); + return ex_expr::EXPR_ERROR; + } + } + else + { + if (dataConversionErrorFlag != 0) + { // Set the target value. + *(UInt8 *)target = (UInt8) *(UInt16 *)source; + } + else + { // Check target precision. Then set target value. + if (checkPrecision((Int64)*(UInt16 *)source, + sourceLen, + sourceType, + sourcePrecision, + sourceScale, + targetType, + targetPrecision, + targetScale, + heap, + diagsArea, + tempFlags) == ex_expr::EXPR_OK) + { + *(UInt8 *)target = (UInt8) *(UInt16 *)source; + } + else + { + return ex_expr::EXPR_ERROR; + } + } + } + } + break; + + case CONV_BIN8S_ASCII: { + if (convInt64ToAscii(target, + targetLen, + targetPrecision, + targetScale, + (Int64) *(Int8 *)source, + sourceScale, + varCharLen, + varCharLenSize, + ' ', // filler character + FALSE, + leftPad, + heap, + diagsArea) != ex_expr::EXPR_OK) + return ex_expr::EXPR_ERROR; + }; + break; + + case CONV_BIN8U_ASCII: { + if (convInt64ToAscii(target, + targetLen, + targetPrecision, + targetScale, + (Int64) *(UInt8 *)source, + sourceScale, + varCharLen, + varCharLenSize, + ' ', // filler character + FALSE, + leftPad, + heap, + diagsArea) != ex_expr::EXPR_OK) + return ex_expr::EXPR_ERROR; + }; + break; + case CONV_BIN16S_BIN16S: { if (dataConversionErrorFlag != 0) @@ -8592,6 +8878,8 @@ convDoIt(char * source, }; break; + case CONV_ASCII_BIN8S: + case CONV_ASCII_BIN8U: case CONV_ASCII_BIN16S: case CONV_ASCII_BIN16U: case CONV_ASCII_BIN32S: @@ -8608,6 +8896,129 @@ convDoIt(char * source, switch (index) { + case CONV_ASCII_BIN8S: { + if (interm < CHAR_MIN) + { + if (dataConversionErrorFlag != 0) // Capture error in variable? + { + *(Target<Int8> *)target = CHAR_MIN; + *dataConversionErrorFlag = + ex_conv_clause::CONV_RESULT_ROUNDED_UP_TO_MIN; + } + else + { + ExRaiseDetailSqlError(heap, diagsArea, EXE_NUMERIC_OVERFLOW, + source, sourceLen, sourceType, sourceScale, + targetType, tempFlags); + return ex_expr::EXPR_ERROR; + } + } + else if (interm > CHAR_MAX) + { + if (dataConversionErrorFlag != 0) // Capture error in variable? + { + *(Target<Int8> *)target = CHAR_MAX; + *dataConversionErrorFlag = + ex_conv_clause::CONV_RESULT_ROUNDED_DOWN_TO_MAX; + } + else + { + ExRaiseDetailSqlError(heap, diagsArea, EXE_NUMERIC_OVERFLOW, + source, sourceLen, sourceType, + sourceScale, targetType, tempFlags); + return ex_expr::EXPR_ERROR; + } + } + else + { + if (dataConversionErrorFlag != 0) + { // Set the target value. + *(Target<Int8> *)target = (Int8) interm; + } + else + { // Check target precision. Then set target value. + if ((targetPrecision > 0) && + (checkPrecision(interm, + 8, + REC_BIN64_SIGNED, + 0, + 0, + targetType, + targetPrecision, + targetScale, + heap, + diagsArea, + tempFlags) != ex_expr::EXPR_OK)) + { + return ex_expr::EXPR_ERROR; + } + *(Target<Int8> *)target = (Int8) interm; + } + } + }; + break; + case CONV_ASCII_BIN8U: { + if (interm < 0) + { + if (dataConversionErrorFlag != 0) // Capture error in variable? + { + *(Target<unsigned short> *)target = 0; + *dataConversionErrorFlag = + ex_conv_clause::CONV_RESULT_ROUNDED_UP_TO_MIN; + } + else + { + ExRaiseDetailSqlError(heap, diagsArea, EXE_NUMERIC_OVERFLOW, + source, sourceLen, sourceType, sourceScale, + targetType, tempFlags); + return ex_expr::EXPR_ERROR; + } + } + else if (interm > UCHAR_MAX) + { + if (dataConversionErrorFlag != 0) // Capture error in variable? + { + *(Target<UInt8> *)target = UCHAR_MAX; + *dataConversionErrorFlag = + ex_conv_clause::CONV_RESULT_ROUNDED_DOWN_TO_MAX; + } + else + { + ExRaiseDetailSqlError(heap, diagsArea, EXE_NUMERIC_OVERFLOW, + source, sourceLen, sourceType, + sourceScale, + targetType, tempFlags); + return ex_expr::EXPR_ERROR; + } + } + else + { + if (dataConversionErrorFlag != 0) + { // Set the target value. + *(Target<UInt8> *)target = (UInt8) interm; + } + else + { // Check target precision. Then set target value. + if ((targetPrecision > 0) && + (checkPrecision(interm, + 8, + REC_BIN64_SIGNED, + 0, + 0, + targetType, + targetPrecision, + targetScale, + heap, + diagsArea, + tempFlags) != ex_expr::EXPR_OK)) + { + return ex_expr::EXPR_ERROR; + } + *(Target<UInt8> *)target = (UInt8) interm; + } + } + }; + break; case CONV_ASCII_BIN16S: { if (interm < SHRT_MIN) { @@ -10247,58 +10658,8 @@ convDoIt(char * source, case CONV_NOT_SUPPORTED: { // this conversion is not supported. - - // if this conversion could be done by converting to an - // intermediate datatype, do it. - - // Conversion to/from a tandem float type is only supported if - // the from/to type is a float type. - // Conversion source to ieee double type and then - // convert from ieee double to target type. - if ((targetType == REC_TDM_FLOAT32) || - (targetType == REC_TDM_FLOAT64) || - (sourceType == REC_TDM_FLOAT32) || - (sourceType == REC_TDM_FLOAT64)) - { - double dintermediate; - - if (convDoIt(source, - sourceLen, - sourceType, - sourcePrecision, - sourceScale, - (char*)&dintermediate, - (Lng32)sizeof(double), - REC_FLOAT64, - 0, 0, - NULL, 0, heap, diagsArea, - CONV_UNKNOWN, 0, - tempFlags | CONV_INTERMEDIATE_CONVERSION) != ex_expr::EXPR_OK) - return ex_expr::EXPR_ERROR; - - if (convDoIt((char*)&dintermediate, - sizeof(double), - REC_FLOAT64, - 0, - 0, - target, - targetLen, - targetType, - targetPrecision, - targetScale, - varCharLen, - varCharLenSize, - heap, diagsArea, - CONV_UNKNOWN, - dataConversionErrorFlag, - flags | CONV_INTERMEDIATE_CONVERSION) != ex_expr::EXPR_OK) - return ex_expr::EXPR_ERROR; - } - else - { - ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_NOT_SUPPORTED); - return ex_expr::EXPR_ERROR; - } + ExRaiseSqlError(heap, diagsArea, EXE_CONVERT_NOT_SUPPORTED); + return ex_expr::EXPR_ERROR; } break; @@ -10713,47 +11074,6 @@ ex_expr::exp_return_type scaleDoIt(char *operand, intermediateDouble = *doubleOperandPtr; //*(double*)operand; } break; - // LCOV_EXCL_START - case REC_TDM_FLOAT32: { -#pragma nowarn(1506) // warning elimination - if (convDoIt(operand, - operandLen, - operandType, - 0, - 0, - (char*)&intermediateDouble, - (Lng32)sizeof(double), - REC_FLOAT64, - 0, - 0, NULL, 0, heap, NULL, -#pragma warning (disable : 4244) //warning elimination - CONV_UNKNOWN) != ex_expr::EXPR_OK) -#pragma warning (default : 4244) //warning elimination - return ex_expr::EXPR_ERROR; -#pragma warn(1506) // warning elimination - } - break; - - case REC_TDM_FLOAT64: { -#pragma nowarn(1506) // warning elimination - if (convDoIt(operand, - operandLen, - operandType, - 0, - 0, - (char*)&intermediateDouble, - (Lng32)sizeof(double), - REC_FLOAT64, - 0, - 0, NULL, 0, heap, NULL, -#pragma warning (disable : 4244) //warning elimination - CONV_UNKNOWN) != ex_expr::EXPR_OK) -#pragma warning (default : 4244) //warning elimination - return ex_expr::EXPR_ERROR; -#pragma warn(1506) // warning elimination - } - break; - case REC_DECIMAL_LSE: { case REC_DECIMAL_UNSIGNED: // Check if the first bit is set @@ -10917,27 +11237,6 @@ ex_expr::exp_return_type scaleDoIt(char *operand, } break; - case REC_TDM_FLOAT32: - case REC_TDM_FLOAT64: { -#pragma nowarn(1506) // warning elimination - // LCOV_EXCL_START - if (convDoIt((char*)&intermediateDouble, - sizeof(double), - REC_FLOAT64, - 0, - 0, - operand, - operandLen, - operandType, - 0, - 0, NULL, 0, heap, NULL, -#pragma warning (disable : 4244) //warning elimination - CONV_UNKNOWN) != ex_expr::EXPR_OK) -#pragma warning (default : 4244) //warning elimination -#pragma warn(1506) // warning elimination - return ex_expr::EXPR_ERROR; - } - break; case REC_DECIMAL_LS: { str_cpy_all(&operand[1], &intermediateString[1], operandLen -1); NADELETEBASIC(intermediateString, heap); http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/88ec4fea/core/sql/exp/exp_fixup.cpp ---------------------------------------------------------------------- diff --git a/core/sql/exp/exp_fixup.cpp b/core/sql/exp/exp_fixup.cpp index 183acfc..c58f04e 100644 --- a/core/sql/exp/exp_fixup.cpp +++ b/core/sql/exp/exp_fixup.cpp @@ -1131,6 +1131,17 @@ conv_case_index ex_conv_clause::find_case_index(short sourceType, Lng32 sourceLe {REC_BPINT_UNSIGNED, REC_NCHAR_F_UNICODE, CONV_BIN16U_UNICODE}, {REC_BPINT_UNSIGNED, REC_NCHAR_V_UNICODE, CONV_BIN16U_UNICODE}, + {REC_BIN8_SIGNED, REC_BIN16_SIGNED, CONV_BIN8S_BIN16S}, + {REC_BIN8_SIGNED, REC_BIN8_SIGNED, CONV_BIN8S_BIN8S}, + {REC_BIN8_SIGNED, REC_BYTE_F_ASCII, CONV_BIN8S_ASCII}, + {REC_BIN8_SIGNED, REC_BYTE_V_ASCII, CONV_BIN8S_ASCII}, + + {REC_BIN8_UNSIGNED, REC_BIN16_UNSIGNED, CONV_BIN8U_BIN16U}, + {REC_BIN8_UNSIGNED, REC_BIN16_SIGNED, CONV_BIN8U_BIN16S}, + {REC_BIN8_UNSIGNED, REC_BIN8_UNSIGNED, CONV_BIN8U_BIN8U}, + {REC_BIN8_UNSIGNED, REC_BYTE_F_ASCII, CONV_BIN8U_ASCII}, + {REC_BIN8_UNSIGNED, REC_BYTE_V_ASCII, CONV_BIN8U_ASCII}, + {REC_BIN16_SIGNED, REC_BPINT_UNSIGNED, CONV_BIN16S_BPINTU}, {REC_BIN16_SIGNED, REC_BIN16_SIGNED, CONV_BIN16S_BIN16S}, {REC_BIN16_SIGNED, REC_BIN16_UNSIGNED, CONV_BIN16S_BIN16U}, @@ -1148,7 +1159,10 @@ conv_case_index ex_conv_clause::find_case_index(short sourceType, Lng32 sourceLe {REC_BIN16_SIGNED, REC_BYTE_V_ASCII_LONG, CONV_BIN16S_ASCII}, {REC_BIN16_SIGNED, REC_NCHAR_F_UNICODE, CONV_BIN16S_UNICODE}, {REC_BIN16_SIGNED, REC_NCHAR_V_UNICODE, CONV_BIN16S_UNICODE}, - + + {REC_BIN16_SIGNED, REC_BIN8_SIGNED, CONV_BIN16S_BIN8S}, + {REC_BIN16_SIGNED, REC_BIN8_UNSIGNED, CONV_BIN16S_BIN8U}, + {REC_BIN16_UNSIGNED, REC_BPINT_UNSIGNED, CONV_BIN16U_BPINTU}, {REC_BIN16_UNSIGNED, REC_BIN16_SIGNED, CONV_BIN16U_BIN16S}, {REC_BIN16_UNSIGNED, REC_BIN16_UNSIGNED, CONV_BIN16U_BIN16U}, @@ -1166,6 +1180,9 @@ conv_case_index ex_conv_clause::find_case_index(short sourceType, Lng32 sourceLe {REC_BIN16_UNSIGNED, REC_BYTE_V_ASCII_LONG, CONV_BIN16U_ASCII}, {REC_BIN16_UNSIGNED, REC_NCHAR_F_UNICODE, CONV_BIN16U_UNICODE}, {REC_BIN16_UNSIGNED, REC_NCHAR_V_UNICODE, CONV_BIN16U_UNICODE}, + + {REC_BIN16_UNSIGNED, REC_BIN8_SIGNED, CONV_BIN16U_BIN8S}, + {REC_BIN16_UNSIGNED, REC_BIN8_UNSIGNED, CONV_BIN16U_BIN8U}, {REC_BIN32_SIGNED, REC_BPINT_UNSIGNED, CONV_BIN32S_BPINTU}, {REC_BIN32_SIGNED, REC_BIN16_SIGNED, CONV_BIN32S_BIN16S}, @@ -1274,8 +1291,6 @@ conv_case_index ex_conv_clause::find_case_index(short sourceType, Lng32 sourceLe {REC_FLOAT32, REC_BYTE_V_ASCII_LONG, CONV_FLOAT32_ASCII}, {REC_FLOAT32, REC_NCHAR_F_UNICODE, CONV_FLOAT32_UNICODE}, {REC_FLOAT32, REC_NCHAR_V_UNICODE, CONV_FLOAT32_UNICODE}, - {REC_FLOAT32, REC_TDM_FLOAT32, CONV_FLOAT32IEEE_FLOAT32TDM}, - {REC_FLOAT32, REC_TDM_FLOAT64, CONV_FLOAT32IEEE_FLOAT64TDM}, {REC_FLOAT64, REC_BPINT_UNSIGNED, CONV_FLOAT64_BPINTU}, {REC_FLOAT64, REC_BIN16_SIGNED, CONV_FLOAT64_BIN16S}, @@ -1292,22 +1307,6 @@ conv_case_index ex_conv_clause::find_case_index(short sourceType, Lng32 sourceLe {REC_FLOAT64, REC_BYTE_V_ASCII_LONG, CONV_FLOAT64_ASCII}, {REC_FLOAT64, REC_NCHAR_F_UNICODE, CONV_FLOAT64_UNICODE}, {REC_FLOAT64, REC_NCHAR_V_UNICODE, CONV_FLOAT64_UNICODE}, - {REC_FLOAT64, REC_TDM_FLOAT32, CONV_FLOAT64IEEE_FLOAT32TDM}, - {REC_FLOAT64, REC_TDM_FLOAT64, CONV_FLOAT64IEEE_FLOAT64TDM}, - - {REC_TDM_FLOAT32, REC_IEEE_FLOAT32, CONV_FLOAT32TDM_FLOAT32IEEE}, - {REC_TDM_FLOAT32, REC_IEEE_FLOAT64, CONV_FLOAT32TDM_FLOAT64IEEE}, - {REC_TDM_FLOAT32, REC_TDM_FLOAT32, CONV_FLOAT32TDM_FLOAT32TDM}, - {REC_TDM_FLOAT32, REC_TDM_FLOAT64, CONV_FLOAT32TDM_FLOAT64TDM}, - {REC_TDM_FLOAT32, REC_BYTE_F_ASCII, CONV_FLOAT32TDM_ASCII}, - - - {REC_TDM_FLOAT64, REC_TDM_FLOAT32, CONV_FLOAT64TDM_FLOAT32TDM}, - {REC_TDM_FLOAT64, REC_TDM_FLOAT64, CONV_FLOAT64TDM_FLOAT64TDM}, - {REC_TDM_FLOAT64, REC_IEEE_FLOAT32, CONV_FLOAT64TDM_FLOAT32IEEE}, - {REC_TDM_FLOAT64, REC_IEEE_FLOAT64, CONV_FLOAT64TDM_FLOAT64IEEE}, - {REC_TDM_FLOAT64, REC_BYTE_F_ASCII, CONV_FLOAT64TDM_ASCII}, - {REC_NUM_BIG_UNSIGNED, REC_BPINT_UNSIGNED, CONV_BIGNUM_BIN16U}, {REC_NUM_BIG_UNSIGNED, REC_BIN16_SIGNED, CONV_BIGNUM_BIN16S}, @@ -1393,6 +1392,8 @@ conv_case_index ex_conv_clause::find_case_index(short sourceType, Lng32 sourceLe {REC_INT_SECOND, REC_INT_SECOND, CONV_INTERVALS_INTERVALS_DIV}, {REC_BYTE_F_ASCII, REC_BPINT_UNSIGNED, CONV_ASCII_BIN16U}, + {REC_BYTE_F_ASCII, REC_BIN8_SIGNED, CONV_ASCII_BIN8S}, + {REC_BYTE_F_ASCII, REC_BIN8_UNSIGNED, CONV_ASCII_BIN8U}, {REC_BYTE_F_ASCII, REC_BIN16_SIGNED, CONV_ASCII_BIN16S}, {REC_BYTE_F_ASCII, REC_BIN16_UNSIGNED, CONV_ASCII_BIN16U}, {REC_BYTE_F_ASCII, REC_BIN32_SIGNED, CONV_ASCII_BIN32S}, @@ -1404,9 +1405,6 @@ conv_case_index ex_conv_clause::find_case_index(short sourceType, Lng32 sourceLe {REC_BYTE_F_ASCII, REC_FLOAT32, CONV_ASCII_FLOAT32}, {REC_BYTE_F_ASCII, REC_FLOAT64, CONV_ASCII_FLOAT64}, - {REC_BYTE_F_ASCII, REC_TDM_FLOAT32, CONV_ASCII_FLOAT32TDM}, - {REC_BYTE_F_ASCII, REC_TDM_FLOAT64, CONV_ASCII_FLOAT64TDM}, - {REC_BYTE_F_ASCII, REC_NUM_BIG_UNSIGNED, CONV_ASCII_BIGNUM}, {REC_BYTE_F_ASCII, REC_NUM_BIG_SIGNED, CONV_ASCII_BIGNUM}, {REC_BYTE_F_ASCII, REC_BYTE_F_ASCII, CONV_ASCII_F_F}, @@ -1474,6 +1472,8 @@ conv_case_index ex_conv_clause::find_case_index(short sourceType, Lng32 sourceLe {REC_BYTE_V_ASCII, REC_BPINT_UNSIGNED, CONV_ASCII_BIN16U}, + {REC_BYTE_V_ASCII, REC_BIN8_SIGNED, CONV_ASCII_BIN8S}, + {REC_BYTE_V_ASCII, REC_BIN8_UNSIGNED, CONV_ASCII_BIN8U}, {REC_BYTE_V_ASCII, REC_BIN16_SIGNED, CONV_ASCII_BIN16S}, {REC_BYTE_V_ASCII, REC_BIN16_UNSIGNED, CONV_ASCII_BIN16U}, {REC_BYTE_V_ASCII, REC_BIN32_SIGNED, CONV_ASCII_BIN32S},
