Various fixes (details below) -- ddl_transactions cqd is now on by default. All ddl, where allowed and supported, will run within one transaction
-- drop schema has been disabled to run within one transaction. When jira 1948 is fixed, it will be enabled. -- hdfs scan handles hive col values > 32K -- pcode handles varchar with len > 32K -- errors (gaps, unsorted order) for cqd values in nadefaults are detected without crashing arkcmp. -- volatile and regular schema drop returns the reason if an error occured (for ex: name of objects that could not be dropped) -- dateformat displays european format correctly with a blank seperator between date and time values -- dateformat timestamp in usa format displayes time with AM/PM -- dateformat inside a cast function returns correct values. Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/1c52a1b4 Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/1c52a1b4 Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/1c52a1b4 Branch: refs/heads/master Commit: 1c52a1b4ef645c8c8be87b8dab132ae07bc621b6 Parents: b7a6e54 Author: Anoop Sharma <[email protected]> Authored: Thu Apr 21 22:21:59 2016 +0000 Committer: Anoop Sharma <[email protected]> Committed: Thu Apr 21 22:21:59 2016 +0000 ---------------------------------------------------------------------- core/sql/bin/SqlciErrors.txt | 2 +- core/sql/common/CharType.cpp | 19 ++-- core/sql/common/CharType.h | 5 +- core/sql/executor/ExExeUtil.h | 4 +- core/sql/executor/ExExeUtilVolTab.cpp | 21 +++- core/sql/executor/ExHdfsScan.cpp | 12 ++- core/sql/exp/exp_clause.cpp | 12 +++ core/sql/exp/exp_datetime.cpp | 28 ++++-- core/sql/exp/exp_datetime.h | 3 +- core/sql/exp/exp_eval.cpp | 2 +- core/sql/exp/exp_function.h | 2 + core/sql/generator/GenPreCode.cpp | 1 + core/sql/generator/GenRelScan.cpp | 75 ++++++++------ core/sql/optimizer/BindItemExpr.cpp | 6 +- core/sql/optimizer/RelScan.h | 5 +- core/sql/regress/compGeneral/TEST004 | 9 +- core/sql/regress/executor/EXPECTED140 | 3 - core/sql/regress/seabase/EXPECTED030 | 18 +++- core/sql/regress/seabase/TEST030 | 2 + core/sql/sqlcomp/CmpSeabaseDDLschema.cpp | 134 +++++++++++++++++++------- 20 files changed, 260 insertions(+), 103 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/bin/SqlciErrors.txt ---------------------------------------------------------------------- diff --git a/core/sql/bin/SqlciErrors.txt b/core/sql/bin/SqlciErrors.txt index ad65ac9..3798754 100644 --- a/core/sql/bin/SqlciErrors.txt +++ b/core/sql/bin/SqlciErrors.txt @@ -68,7 +68,7 @@ 1066 ZZZZZ 99999 BEGINNER MAJOR DBADMIN Creating index $0~TableName in metadata schema is not allowed. 1067 ZZZZZ 99999 BEGINNER MAJOR DBADMIN Creating module $0~String0 in metadata schema is not allowed. 1068 ZZZZZ 99999 ADVANCED MAJOR DIALOUT An internal error was encountered: cannot create lock $0~TableName in metadata schema. -1069 ZZZZZ 99999 BEGINNER MAJOR DBADMIN Schema $0~SchemaName could not be dropped. +1069 ZZZZZ 99999 BEGINNER MAJOR DBADMIN Schema $0~SchemaName could not be dropped. $0~String0 1070 ZZZZZ 99999 BEGINNER MAJOR DBADMIN Object $0~TableName could not be created. File error: $1~Int0. 1071 ZZZZZ 99999 BEGINNER MAJOR DBADMIN Object $0~TableName could not be accessed. 1072 ZZZZZ 99999 BEGINNER MAJOR DBADMIN Unique constraint $0~String0 is disabled, so foreign key constraint $1~ConstraintName could not be created. http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/common/CharType.cpp ---------------------------------------------------------------------- diff --git a/core/sql/common/CharType.cpp b/core/sql/common/CharType.cpp index 6f9e8a3..dc08028 100644 --- a/core/sql/common/CharType.cpp +++ b/core/sql/common/CharType.cpp @@ -69,7 +69,7 @@ CharType::CharType( const NAString& adtName, CharInfo::Collation co, CharInfo::Coercibility ce, CharInfo::CharSet encoding, - Int32 iCharLen // default is 0 + Int32 vcIndLen // default is 0 ) : NAType( adtName , NA_CHARACTER_TYPE @@ -77,11 +77,13 @@ CharType::CharType( const NAString& adtName, , allowSQLnull , allowSQLnull ? SQL_NULL_HDR_SIZE : 0 , varLenFlag - , (varLenFlag ? (((maxLenInBytesOrNAWchars*CharInfo::minBytesPerChar(cs)) & 0xFFFF8000) - ? SQL_VARCHAR_HDR_SIZE_4 - : SQL_VARCHAR_HDR_SIZE) - : 0) // computes length of VarCharLen field (0 or 2 or 4 bytes) - // see also ../sqludr/sqludr.cpp, method TypeInfo::TypeInfo + // computes length of VarCharLen field (0 or 2 or 4 bytes) + // if not passed in + , (varLenFlag ? ((vcIndLen > 0) ? vcIndLen : + (((maxLenInBytesOrNAWchars*CharInfo::minBytesPerChar(cs)) & 0xFFFF8000) + ? SQL_VARCHAR_HDR_SIZE_4 + : SQL_VARCHAR_HDR_SIZE)) + : 0) , CharInfo::minBytesPerChar(cs) ), qualifier_ (CHARACTER_STRING_TYPE), @@ -932,13 +934,14 @@ SQLVarChar::SQLVarChar(Lng32 maxLen, CharInfo::CharSet cs, CharInfo::Collation co, CharInfo::Coercibility ce, - CharInfo::CharSet encoding + CharInfo::CharSet encoding, + Lng32 vcIndLen ) : CharType(LiteralVARCHAR, maxLen, CharInfo::maxBytesPerChar(cs), FALSE, allowSQLnull, isUpShifted, isCaseInsensitive, TRUE, cs, co, ce, - encoding), + encoding, vcIndLen), clientDataType_(collHeap()) // Get heap from NABasicObject. Can't allocate on stack. {} #pragma warn(1506) // warning elimination http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/common/CharType.h ---------------------------------------------------------------------- diff --git a/core/sql/common/CharType.h b/core/sql/common/CharType.h index 7d0c383..11369b6 100644 --- a/core/sql/common/CharType.h +++ b/core/sql/common/CharType.h @@ -125,7 +125,7 @@ CharType (const NAString& adtName, CharInfo::Collation co = CharInfo::DefaultCollation, CharInfo::Coercibility ce = CharInfo::COERCIBLE, CharInfo::CharSet encoding = CharInfo::UnknownCharSet, - Int32 iCharLen = 0 + Lng32 vcIndLen = 0 // not passed in, need to be computed ); CharType (const NAString& adtName, const CharLenInfo & maxLenInfo, @@ -500,7 +500,8 @@ public: CharInfo::CharSet = CharInfo::DefaultCharSet, CharInfo::Collation = CharInfo::DefaultCollation, CharInfo::Coercibility = CharInfo::COERCIBLE, - CharInfo::CharSet encoding = CharInfo::UnknownCharSet + CharInfo::CharSet encoding = CharInfo::UnknownCharSet, + Lng32 vcIndLen = 0 ); SQLVarChar(const CharLenInfo & maxLenInfo, NABoolean allowSQLnull = TRUE, http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/executor/ExExeUtil.h ---------------------------------------------------------------------- diff --git a/core/sql/executor/ExExeUtil.h b/core/sql/executor/ExExeUtil.h index d726a1f..78a1e9d 100755 --- a/core/sql/executor/ExExeUtil.h +++ b/core/sql/executor/ExExeUtil.h @@ -1008,7 +1008,8 @@ class ExExeUtilCleanupVolatileTablesTcb : public ExExeUtilVolatileTablesTcb static short dropVolatileSchema(ContextCli * currContext, char * schemaName, CollHeap * heap, - ex_globals *globals = NULL); + ex_globals *globals = NULL, + ComDiagsArea * diagsArea = NULL); static short dropVolatileTables(ContextCli * currContext, CollHeap * heap); private: @@ -1031,6 +1032,7 @@ class ExExeUtilCleanupVolatileTablesTcb : public ExExeUtilVolatileTablesTcb Queue * schemaNamesList_; NABoolean someSchemasCouldNotBeDropped_; + char errorSchemas_[1010]; char * schemaQuery_; }; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/executor/ExExeUtilVolTab.cpp ---------------------------------------------------------------------- diff --git a/core/sql/executor/ExExeUtilVolTab.cpp b/core/sql/executor/ExExeUtilVolTab.cpp index 053e6e0..278d1e3 100644 --- a/core/sql/executor/ExExeUtilVolTab.cpp +++ b/core/sql/executor/ExExeUtilVolTab.cpp @@ -437,6 +437,8 @@ short ExExeUtilCleanupVolatileTablesTcb::work() case INITIAL_: { step_ = FETCH_SCHEMA_NAMES_; + errorSchemas_[0] = 0; + } break; @@ -537,15 +539,23 @@ short ExExeUtilCleanupVolatileTablesTcb::work() char * schemaName = vi->get(0); retcode = dropVolatileSchema(masterGlob->getStatement()->getContext(), - schemaName, getHeap(), getGlobals()); + schemaName, getHeap(), getGlobals(), + getDiagsArea()); if (retcode < 0) { + // changes errors to warnings and move on to next schema. + if (getDiagsArea()) + getDiagsArea()->negateAllErrors(); + // clear diags and move on to next schema. // Remember that an error was returned, we will // return a warning at the end. SQL_EXEC_ClearDiagnostics(NULL); retcode = 0; + if ((strlen(errorSchemas_) + strlen(schemaName)) < 1000) + strcat(errorSchemas_, schemaName); + someSchemasCouldNotBeDropped_ = TRUE; } @@ -561,7 +571,8 @@ short ExExeUtilCleanupVolatileTablesTcb::work() // add a warning to indicate that some schemas were not // dropped. ComDiagsArea * diags = getDiagsArea(); - *diags << DgSqlCode(1069); + *diags << DgSqlCode(1069) + << DgSchemaName(errorSchemas_); } step_ = DONE_; } @@ -600,7 +611,8 @@ short ExExeUtilCleanupVolatileTablesTcb::dropVolatileSchema (ContextCli * currContext, char * schemaName, CollHeap * heap, - ex_globals *glob) + ex_globals *glob, + ComDiagsArea *diagsArea) { const char *parentQid = NULL; if (glob) @@ -643,7 +655,8 @@ short ExExeUtilCleanupVolatileTablesTcb::dropVolatileSchema // issue the drop schema command Lng32 cliRC = cliInterface.executeImmediate(dropSchema); - + cliInterface.retrieveSQLDiagnostics(diagsArea); + // reset volatile schema bit // currContext->resetSqlParserFlags(0x8000); // ALLOW_VOLATILE_SCHEMA_CREATION http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/executor/ExHdfsScan.cpp ---------------------------------------------------------------------- diff --git a/core/sql/executor/ExHdfsScan.cpp b/core/sql/executor/ExHdfsScan.cpp index 1593899..1278c3a 100644 --- a/core/sql/executor/ExHdfsScan.cpp +++ b/core/sql/executor/ExHdfsScan.cpp @@ -1440,8 +1440,8 @@ char * ExHdfsScanTcb::extractAndTransformAsciiSourceToSqlRow(int &err, else return sourceRowEnd+1; } - short len = 0; - len = sourceColEnd - sourceData ; + Int32 len = 0; + len = (Int64)sourceColEnd - (Int64)sourceData; if (rdSeen) { sourceRowEnd = sourceColEnd + changedLen; hdfsLoggingRowEnd_ = sourceRowEnd; @@ -1456,7 +1456,13 @@ char * ExHdfsScanTcb::extractAndTransformAsciiSourceToSqlRow(int &err, if (attr) // this is a needed column. We need to convert { - *(short*)&hdfsAsciiSourceData_[attr->getVCLenIndOffset()] = len; + if (attr->getVCIndicatorLength() == sizeof(short)) + *(short*)&hdfsAsciiSourceData_[attr->getVCLenIndOffset()] + = (short)len; + else + *(Int32*)&hdfsAsciiSourceData_[attr->getVCLenIndOffset()] + = len; + if (attr->getNullFlag()) { if (len == 0) http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/exp/exp_clause.cpp ---------------------------------------------------------------------- diff --git a/core/sql/exp/exp_clause.cpp b/core/sql/exp/exp_clause.cpp index 1b5400e..da951d8 100644 --- a/core/sql/exp/exp_clause.cpp +++ b/core/sql/exp/exp_clause.cpp @@ -2005,6 +2005,18 @@ void ExFunctionHbaseVersion::displayContents(Space * space, const char * /*displ ex_clause::displayContents(space, (const char *)NULL, clauseNum, constsArea); } +void ex_function_dateformat::displayContents(Space * space, const char * /*displayStr*/, Int32 clauseNum, char * constsArea) +{ + char buf[100]; + str_sprintf(buf, " Clause #%d: ex_function_dateformat", clauseNum); + space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short)); + + str_sprintf(buf, " dateformat_ = %d", dateformat_); + space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sizeof(short)); + + ex_clause::displayContents(space, (const char *)NULL, clauseNum, constsArea); +} + // Function to compare two strings. NA_EIDPROC Int32 charStringCompareWithPad(char* in_s1, Int32 length1, char* in_s2, Int32 length2, http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/exp/exp_datetime.cpp ---------------------------------------------------------------------- diff --git a/core/sql/exp/exp_datetime.cpp b/core/sql/exp/exp_datetime.cpp index deb8300..962c6ee 100644 --- a/core/sql/exp/exp_datetime.cpp +++ b/core/sql/exp/exp_datetime.cpp @@ -130,6 +130,7 @@ const ExpDatetime::DatetimeFormatInfo ExpDatetime::datetimeFormat[] = {ExpDatetime::DATETIME_FORMAT_TS7, "MM/DD/YYYY HH24:MI:SS", 19, 19}, {ExpDatetime::DATETIME_FORMAT_TS8, "DD-MON-YYYY HH:MI:SS", 20, 20}, {ExpDatetime::DATETIME_FORMAT_TS9, "MONTH DD, YYYY, HH:MI", 19, 25}, + {ExpDatetime::DATETIME_FORMAT_TS10, "DD.MM.YYYY HH24:MI:SS", 19, 19}, {ExpDatetime::DATETIME_FORMAT_NUM1, "99:99:99:99", 11, 11}, {ExpDatetime::DATETIME_FORMAT_NUM2, "-99:99:99:99", 12, 12} @@ -2835,7 +2836,8 @@ ExpDatetime::convAsciiToDate(char *srcData, }; break; - case DATETIME_FORMAT_TS2: // DD.MM.YYYY:HH24:MI:SS + case DATETIME_FORMAT_TS2: // DD.MM.YYYY:HH24:MI:SS + case DATETIME_FORMAT_TS10: // DD.MM.YYYY:HH24:MI:SS { // the day if (convSrcDataToDst(2, srcData, 1, &dstData[3], ".", heap, diagsArea)) @@ -2846,9 +2848,17 @@ ExpDatetime::convAsciiToDate(char *srcData, return -1; // the year - if (convSrcDataToDst(4, srcData, 2, dstData, ":", heap, diagsArea)) - return -1; - + if (srcFormat == DATETIME_FORMAT_TS2) + { + if (convSrcDataToDst(4, srcData, 2, dstData, ":", heap, diagsArea)) + return -1; + } + else + { + if (convSrcDataToDst(4, srcData, 2, dstData, " ", heap, diagsArea)) + return -1; + } + // the hour if (convSrcDataToDst(2, srcData, 1, &dstData[4], ":", heap, diagsArea)) return -1; @@ -3278,11 +3288,13 @@ ExpDatetime::convDatetimeToASCII(char *srcData, case DATETIME_FORMAT_EUROPEAN4: case DATETIME_FORMAT_TS2: case DATETIME_FORMAT_TS8: + case DATETIME_FORMAT_TS10: if (day) { convertToAscii(day, dstDataPtr, 2); if (startField < REC_DATE_DAY) { if ((format == DATETIME_FORMAT_EUROPEAN) || - (format == DATETIME_FORMAT_TS2)) + (format == DATETIME_FORMAT_TS2) || + (format == DATETIME_FORMAT_TS10)) *dstDataPtr++ = '.'; else if (format != DATETIME_FORMAT_EUROPEAN4) *dstDataPtr++ = '-'; @@ -3297,7 +3309,8 @@ ExpDatetime::convDatetimeToASCII(char *srcData, convertToAscii(month, dstDataPtr, 2); if (startField < REC_DATE_MONTH) { if ((format == DATETIME_FORMAT_EUROPEAN) || - (format == DATETIME_FORMAT_TS2)) + (format == DATETIME_FORMAT_TS2) || + (format == DATETIME_FORMAT_TS10)) *dstDataPtr++ = '.'; else if (format != DATETIME_FORMAT_EUROPEAN4) *dstDataPtr++ = '-'; @@ -3366,7 +3379,8 @@ ExpDatetime::convDatetimeToASCII(char *srcData, // USA format uses AM|PM format. // - if (format == DATETIME_FORMAT_USA) { + if ((format == DATETIME_FORMAT_USA) || + (format == DATETIME_FORMAT_TS7)) { if (hour < 1) hour += 12; else if (hour > 12) http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/exp/exp_datetime.h ---------------------------------------------------------------------- diff --git a/core/sql/exp/exp_datetime.h b/core/sql/exp/exp_datetime.h index 8f6fa1b..17123b8 100644 --- a/core/sql/exp/exp_datetime.h +++ b/core/sql/exp/exp_datetime.h @@ -84,7 +84,8 @@ public: DATETIME_FORMAT_TS7, // MM/DD/YYYY HH24:MI:SS DATETIME_FORMAT_TS8, // DD-MON-YYYY HH:MI:SS DATETIME_FORMAT_TS9, // MONTH DD, YYYY, HH:MI AM|PM - DATETIME_FORMAT_MAX_TS = DATETIME_FORMAT_TS9, + DATETIME_FORMAT_TS10, // DD.MM.YYYY HH24:MI:SS + DATETIME_FORMAT_MAX_TS = DATETIME_FORMAT_TS10, DATETIME_FORMAT_MAX = DATETIME_FORMAT_MAX_TS, http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/exp/exp_eval.cpp ---------------------------------------------------------------------- diff --git a/core/sql/exp/exp_eval.cpp b/core/sql/exp/exp_eval.cpp index c0a4a10..d841463 100644 --- a/core/sql/exp/exp_eval.cpp +++ b/core/sql/exp/exp_eval.cpp @@ -4210,7 +4210,7 @@ ex_expr::exp_return_type ex_expr::evalPCode(PCodeBinary* pCode32, Int16 attrVCIndLen = (Int16)comboPtr1[1]; DEF_ASSIGN(Int16, alignment, 6); - DEF_ASSIGN(Int16, rowLength, 7); + DEF_ASSIGN(Int32, rowLength, 7); UInt32 copyLength = 0; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/exp/exp_function.h ---------------------------------------------------------------------- diff --git a/core/sql/exp/exp_function.h b/core/sql/exp/exp_function.h index 1c183f6..589975e 100644 --- a/core/sql/exp/exp_function.h +++ b/core/sql/exp/exp_function.h @@ -2377,6 +2377,8 @@ public: Space * space, Int32 dateformat); NA_EIDPROC ex_function_dateformat(); + void displayContents(Space * space, const char * displayStr, + Int32 clauseNum, char * constsArea); NA_EIDPROC inline Int32 getDateFormat() const { return dateformat_; } NA_EIDPROC ex_expr::exp_return_type eval(char *op_data[], CollHeap*, http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/generator/GenPreCode.cpp ---------------------------------------------------------------------- diff --git a/core/sql/generator/GenPreCode.cpp b/core/sql/generator/GenPreCode.cpp index 66ae65f..daf5d1c 100644 --- a/core/sql/generator/GenPreCode.cpp +++ b/core/sql/generator/GenPreCode.cpp @@ -2855,6 +2855,7 @@ short DDLExpr::ddlXnsInfo(NABoolean &isDDLxn, NABoolean &xnCanBeStarted) if ((ddlNode && ddlNode->castToStmtDDLNode() && ddlNode->castToStmtDDLNode()->ddlXns()) && ((ddlNode->getOperatorType() == DDL_CLEANUP_OBJECTS) || + (ddlNode->getOperatorType() == DDL_DROP_SCHEMA) || (ddlNode->getOperatorType() == DDL_ALTER_TABLE_DROP_COLUMN) || (ddlNode->getOperatorType() == DDL_ALTER_TABLE_ALTER_COLUMN_DATATYPE))) { http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/generator/GenRelScan.cpp ---------------------------------------------------------------------- diff --git a/core/sql/generator/GenRelScan.cpp b/core/sql/generator/GenRelScan.cpp index 0f2d40c..2783e83 100644 --- a/core/sql/generator/GenRelScan.cpp +++ b/core/sql/generator/GenRelScan.cpp @@ -194,9 +194,10 @@ short FileScan::codeGen(Generator * generator) } int HbaseAccess::createAsciiColAndCastExpr(Generator * generator, - const NAType &givenType, - ItemExpr *&asciiValue, - ItemExpr *&castValue) + const NAType &givenType, + ItemExpr *&asciiValue, + ItemExpr *&castValue, + NABoolean srcIsInt32Varchar) { int result = 0; asciiValue = NULL; @@ -216,41 +217,56 @@ int HbaseAccess::createAsciiColAndCastExpr(Generator * generator, } if (newGivenType->getTypeQualifier() == NA_CHARACTER_TYPE && - (CmpCommon::getDefaultString(HIVE_FILE_CHARSET) == "GBK" || CmpCommon::getDefaultString(HIVE_FILE_CHARSET) == "gbk") && CmpCommon::getDefaultString(HIVE_DEFAULT_CHARSET) == "UTF8" ) - needTranslate = TRUE; - + (CmpCommon::getDefaultString(HIVE_FILE_CHARSET) == "GBK" || + CmpCommon::getDefaultString(HIVE_FILE_CHARSET) == "gbk") + && CmpCommon::getDefaultString(HIVE_DEFAULT_CHARSET) == "UTF8" ) + needTranslate = TRUE; + // source ascii row is a varchar where the data is a pointer to the source data // in the hdfs buffer. NAType *asciiType = NULL; if (DFS2REC::isDoubleCharacter(newGivenType->getFSDatatype())) - { - asciiType = new (h) SQLVarChar(sizeof(Int64)/2, newGivenType->supportsSQLnull(), - FALSE, FALSE, newGivenType->getCharSet()); - } + { + asciiType = + new (h) SQLVarChar(sizeof(Int64)/2, newGivenType->supportsSQLnull(), + FALSE, FALSE, newGivenType->getCharSet(), + CharInfo::DefaultCollation, + CharInfo::COERCIBLE, + CharInfo::UnknownCharSet, + (srcIsInt32Varchar ? sizeof(Int32) : 0)); + } // set the source charset to GBK if HIVE_FILE_CHARSET is set // HIVE_FILE_CHARSET can only be empty or GBK else if ( needTranslate == TRUE ) - { - asciiType = new (h) SQLVarChar(sizeof(Int64), newGivenType->supportsSQLnull(), - FALSE, FALSE, CharInfo::GBK); - } + { + asciiType = + new (h) SQLVarChar(sizeof(Int64), newGivenType->supportsSQLnull(), + FALSE, FALSE, CharInfo::GBK, + CharInfo::DefaultCollation, + CharInfo::COERCIBLE, + CharInfo::UnknownCharSet, + (srcIsInt32Varchar ? sizeof(Int32) : 0)); + } else - asciiType = new (h) SQLVarChar(sizeof(Int64), newGivenType->supportsSQLnull()); - if (asciiType) { - asciiValue = new (h) NATypeToItem(asciiType->newCopy(h)); - castValue = new(h) Cast(asciiValue, newGivenType); - if (castValue) - { - ((Cast*)castValue)->setSrcIsVarcharPtr(TRUE); - - if (newGivenType->getTypeQualifier() == NA_INTERVAL_TYPE) - ((Cast*)castValue)->setAllowSignInInterval(TRUE); - } - + asciiType = + new (h) SQLVarChar(sizeof(Int64), newGivenType->supportsSQLnull(), + FALSE, FALSE, + CharInfo::DefaultCharSet, + CharInfo::DefaultCollation, + CharInfo::COERCIBLE, + CharInfo::UnknownCharSet, + (srcIsInt32Varchar ? sizeof(Int32) : 0)); } + asciiValue = new (h) NATypeToItem(asciiType->newCopy(h)); + castValue = new(h) Cast(asciiValue, newGivenType); + ((Cast*)castValue)->setSrcIsVarcharPtr(TRUE); + + if (newGivenType->getTypeQualifier() == NA_INTERVAL_TYPE) + ((Cast*)castValue)->setAllowSignInInterval(TRUE); + if (castValue && asciiValue) result = 1; @@ -839,9 +855,10 @@ short FileScan::codeGenForHive(Generator * generator) res = HbaseAccess::createAsciiColAndCastExpr( generator, // for heap - givenType, // [IN] Actual type of HDFS column - asciiValue, // [OUT] Returned expression for ascii rep. - castValue // [OUT] Returned expression for binary rep. + givenType, // [IN] Actual type of HDFS column + asciiValue, // [OUT] Returned expression for ascii rep. + castValue, // [OUT] Returned expression for binary rep. + TRUE // max src data len is sizeof(Int32) ); GenAssert(res == 1 && asciiValue != NULL && castValue != NULL, http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/optimizer/BindItemExpr.cpp ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/BindItemExpr.cpp b/core/sql/optimizer/BindItemExpr.cpp index f348896..2e4d8e0 100644 --- a/core/sql/optimizer/BindItemExpr.cpp +++ b/core/sql/optimizer/BindItemExpr.cpp @@ -4181,9 +4181,9 @@ ItemExpr * DateFormat::bindNode(BindWA * bindWA) if (frmt_ == ExpDatetime::DATETIME_FORMAT_DEFAULT) frmt_ = ExpDatetime::DATETIME_FORMAT_TS3;// YYYY-MM-DD HH24:MI:SS else if (frmt_ == ExpDatetime::DATETIME_FORMAT_USA) - frmt_ = ExpDatetime::DATETIME_FORMAT_TS7;// MM/DD/YYYY HH24:MI:SS - else - frmt_ = ExpDatetime::DATETIME_FORMAT_TS2;// DD.MM.YYYY:HH24:MI:SS + frmt_ = ExpDatetime::DATETIME_FORMAT_TS7;// MM/DD/YYYY HH24:MI:SS AM|PM + else if (frmt_ == ExpDatetime::DATETIME_FORMAT_EUROPEAN) + frmt_ = ExpDatetime::DATETIME_FORMAT_TS10;// DD.MM.YYYY HH24:MI:SS } } http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/optimizer/RelScan.h ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/RelScan.h b/core/sql/optimizer/RelScan.h index cc69a69..6c02456 100644 --- a/core/sql/optimizer/RelScan.h +++ b/core/sql/optimizer/RelScan.h @@ -1350,9 +1350,10 @@ public: static int createAsciiColAndCastExpr(Generator * generator, const NAType &givenType, ItemExpr *&asciiValue, - ItemExpr *&castValue); + ItemExpr *&castValue, + NABoolean srcIsInt32Varchar = FALSE); - static int createAsciiColAndCastExpr2(Generator * generator, + static int createAsciiColAndCastExpr2(Generator * generator, ItemExpr * colNode, const NAType &givenType, ItemExpr *&asciiValue, http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/regress/compGeneral/TEST004 ---------------------------------------------------------------------- diff --git a/core/sql/regress/compGeneral/TEST004 b/core/sql/regress/compGeneral/TEST004 index d3e465a..caf0794 100644 --- a/core/sql/regress/compGeneral/TEST004 +++ b/core/sql/regress/compGeneral/TEST004 @@ -31,7 +31,6 @@ #ifndef SEABASE_REGRESS set schema $$TEST_CATALOG$$.sch; #else -cqd call_embedded_arkcmp 'OFF'; cqd seabase_volatile_tables 'ON'; set schema $$TEST_CATALOG$$.sch; #endif @@ -57,7 +56,8 @@ drop table "t4tab"; drop table "SCH.T4TAB"; drop table t4tab; drop table t4ttt cascade; -drop schema "t4sch"; + +drop schema "t4sch" cascade; drop table compgeneral.v_t1; drop table compgeneral.v_t2; @@ -857,3 +857,8 @@ explain options 'f' st1; log; obey test004(clean_up); +--set parserflags 131072; +--select object_name from "_MD_".objects where schema_name like 'VOLATILE_SCHEMA%'; +--drop implicit volatile schema cleanup cascade; + + http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/regress/executor/EXPECTED140 ---------------------------------------------------------------------- diff --git a/core/sql/regress/executor/EXPECTED140 b/core/sql/regress/executor/EXPECTED140 index d31cd57..ae9f0ae 100644 --- a/core/sql/regress/executor/EXPECTED140 +++ b/core/sql/regress/executor/EXPECTED140 @@ -985,7 +985,6 @@ DESCRIPTION HBASE_FILTER_PREDS ..... 2 TRAF_ALIGNED_ROW_FORMAT OFF TRAF_INDEX_CREATE_OPT ON - DDL_TRANSACTIONS ....... ON SCHEMA ................. TRAFODION.SCH HBASE_SMALL_SCANNER .... OFF PARALLEL_NUM_ESPS ...... 1 @@ -1100,7 +1099,6 @@ DESCRIPTION HBASE_FILTER_PREDS ..... 2 TRAF_ALIGNED_ROW_FORMAT OFF TRAF_INDEX_CREATE_OPT ON - DDL_TRANSACTIONS ....... ON SCHEMA ................. TRAFODION.SCH HBASE_SMALL_SCANNER .... OFF PARALLEL_NUM_ESPS ...... 1 @@ -1223,7 +1221,6 @@ DESCRIPTION HBASE_FILTER_PREDS ..... 2 TRAF_ALIGNED_ROW_FORMAT OFF TRAF_INDEX_CREATE_OPT ON - DDL_TRANSACTIONS ....... ON SCHEMA ................. TRAFODION.SCH GENERATE_EXPLAIN ....... ON ObjectUIDs ............. 2948826545036618945 http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/regress/seabase/EXPECTED030 ---------------------------------------------------------------------- diff --git a/core/sql/regress/seabase/EXPECTED030 b/core/sql/regress/seabase/EXPECTED030 index 94b6790..ebdc227 100644 --- a/core/sql/regress/seabase/EXPECTED030 +++ b/core/sql/regress/seabase/EXPECTED030 @@ -463,7 +463,7 @@ March 01, 2016, 10:11:12 (EXPR) ----------------------- -01.03.2016:10:11:12.123 +01.03.2016 10:11:12.123 --- 1 row(s) selected. >>select dateformat(timestamp '2016-03-01 10:11:12.12', usa) from (values(1)) >>x(a); @@ -474,6 +474,22 @@ March 01, 2016, 10:11:12 03/01/2016 10:11:12.12 AM --- 1 row(s) selected. +>>select dateformat(timestamp '2016-03-01 20:11:12.12', usa) from (values(1)) x(a); + +(EXPR) +------------------------- + +03/01/2016 08:11:12.12 PM + +--- 1 row(s) selected. +>>select cast(DATEFORMAT (TIMESTAMP '1990-06-11 07:00:09.00', USA) as char(30)) from (values (1)) x(a); + +(EXPR) +------------------------------ + +06/11/1990 07:00:09.00 AM + +--- 1 row(s) selected. >> >>drop table if exists t030t1; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/regress/seabase/TEST030 ---------------------------------------------------------------------- diff --git a/core/sql/regress/seabase/TEST030 b/core/sql/regress/seabase/TEST030 index aff9c7c..abe663a 100644 --- a/core/sql/regress/seabase/TEST030 +++ b/core/sql/regress/seabase/TEST030 @@ -86,6 +86,8 @@ select dateformat(timestamp '2016-03-01 10:11:12.1', default) from (values(1)) x select dateformat(timestamp '2016-03-01 10:11:12', usa) from (values(1)) x(a); select dateformat(timestamp '2016-03-01 10:11:12.123', european) from (values(1)) x(a); select dateformat(timestamp '2016-03-01 10:11:12.12', usa) from (values(1)) x(a); +select dateformat(timestamp '2016-03-01 20:11:12.12', usa) from (values(1)) x(a); +select cast(DATEFORMAT (TIMESTAMP '1990-06-11 07:00:09.00', USA) as char(30)) from (values (1)) x(a); drop table if exists t030t1; create table t030t1 (a date, b char(30), c varchar(30)); http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/1c52a1b4/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp ---------------------------------------------------------------------- diff --git a/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp b/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp index d37306b..967b534 100644 --- a/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp +++ b/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp @@ -444,11 +444,14 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * dropSchemaNode) int32_t length = 0; int32_t rowCount = 0; bool someObjectsCouldNotBeDropped = false; + char errorObjs[1000]; Queue * objectsQueue = NULL; Queue * otherObjectsQueue = NULL; NABoolean dirtiedMetadata = FALSE; + errorObjs[0] = 0; + Int64 schemaUID = getObjectTypeandOwner(&cliInterface,catName.data(),schName.data(), SEABASE_SCHEMA_OBJECTNAME,objectType,schemaOwnerID); @@ -540,25 +543,6 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * dropSchemaNode) } } -#ifdef __ignore - // Drop histogram tables first - objectsQueue->position(); - for (size_t i = 0; i < objectsQueue->numEntries(); i++) - { - OutputInfo * vi = (OutputInfo*)objectsQueue->getNext(); - NAString objName = vi->get(0); - - if (isHistogramTable(objName)) - { - dirtiedMetadata = TRUE; - if (dropOneTable(cliInterface,(char*)catName.data(), - (char*)schName.data(),(char*)objName.data(), - isVolatile , FALSE,dropSchemaNode->ddlXns())) - someObjectsCouldNotBeDropped = true; - } - } -#endif - // Drop procedures (SPJs), UDFs (functions), and views objectsQueue->position(); for (int idx = 0; idx < objectsQueue->numEntries(); idx++) @@ -632,7 +616,11 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * dropSchemaNode) cliRC = cliInterface.executeImmediate(buf); if (cliRC < 0 && cliRC != -CAT_OBJECT_DOES_NOT_EXIST_IN_TRAFODION) - someObjectsCouldNotBeDropped = true; + { + strcat(errorObjs, objectTypeString.data()); + strcat(errorObjs, " "); + someObjectsCouldNotBeDropped = true; + } } // Drop libraries in the schema @@ -654,7 +642,12 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * dropSchemaNode) cliRC = cliInterface.executeImmediate(buf); if (cliRC < 0 && cliRC != -CAT_OBJECT_DOES_NOT_EXIST_IN_TRAFODION) - someObjectsCouldNotBeDropped = true; + { + strcat(errorObjs, objName); + strcat(errorObjs, " "); + + someObjectsCouldNotBeDropped = true; + } } } @@ -680,7 +673,12 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * dropSchemaNode) if (dropOneTable(cliInterface,(char*)catName.data(), (char*)schName.data(),(char*)objName.data(), isVolatile, FALSE,dropSchemaNode->ddlXns())) - someObjectsCouldNotBeDropped = true; + { + strcat(errorObjs, objName.data()); + strcat(errorObjs, " "); + + someObjectsCouldNotBeDropped = true; + } } } } @@ -710,7 +708,12 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * dropSchemaNode) if (dropOneTable(cliInterface,(char*)catName.data(), (char*)schName.data(),(char*)objName.data(), isVolatile,TRUE, dropSchemaNode->ddlXns())) - someObjectsCouldNotBeDropped = true; + { + strcat(errorObjs, objName.data()); + strcat(errorObjs, " "); + + someObjectsCouldNotBeDropped = true; + } } } } @@ -750,7 +753,12 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * dropSchemaNode) cliRC = cliInterface.executeImmediate(buf); if (cliRC < 0 && cliRC != -CAT_OBJECT_DOES_NOT_EXIST_IN_TRAFODION) - someObjectsCouldNotBeDropped = true; + { + strcat(errorObjs, objName); + strcat(errorObjs, " "); + + someObjectsCouldNotBeDropped = true; + } } } @@ -790,7 +798,12 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * dropSchemaNode) cliRC = cliInterface.executeImmediate(buf); if (cliRC < 0 && cliRC != -CAT_OBJECT_DOES_NOT_EXIST_IN_TRAFODION) - someObjectsCouldNotBeDropped = true; + { + strcat(errorObjs, objName); + strcat(errorObjs, " "); + + someObjectsCouldNotBeDropped = true; + } } } @@ -807,16 +820,33 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * dropSchemaNode) if (dropOneTable(cliInterface,(char*)catName.data(), (char*)schName.data(),(char*)objName.data(), isVolatile, FALSE, dropSchemaNode->ddlXns())) - someObjectsCouldNotBeDropped = true; + { + strcat(errorObjs, objName.data()); + strcat(errorObjs, " "); + + someObjectsCouldNotBeDropped = true; + } } } + if (someObjectsCouldNotBeDropped) + { + NAString reason; + reason = "Reason: Some objects could not be dropped in schema " + + schName + ". ObjectsInSchema: " + + errorObjs; + *CmpCommon::diags() << DgSqlCode(-CAT_UNABLE_TO_DROP_SCHEMA) + << DgSchemaName(catName + "." + schName) + << DgString0(reason); + goto label_error; + } + // For volatile schemas, sometimes only the objects get dropped. // If the dropObjectsOnly flag is set, just exit now, we are done. if (dropSchemaNode->dropObjectsOnly()) return; - // Verify all objects in the schema have been dropped. + // Verify all objects in the schema have been dropped. str_sprintf(query,"SELECT COUNT(*) " "FROM %s.\"%s\".%s " "WHERE catalog_name = '%s' AND schema_name = '%s' AND " @@ -834,13 +864,43 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * dropSchemaNode) } if (rowCount > 0) - { - CmpCommon::diags()->clear(); - - *CmpCommon::diags() << DgSqlCode(-CAT_UNABLE_TO_DROP_SCHEMA) - << DgSchemaName(catName + "." + schName); - goto label_error; - } + { + CmpCommon::diags()->clear(); + + str_sprintf(query,"SELECT TRIM(object_name) " + "FROM %s.\"%s\".%s " + "WHERE catalog_name = '%s' AND schema_name = '%s' AND " + "object_name <> '"SEABASE_SCHEMA_OBJECTNAME"' AND " + "object_type <> 'PK' " + "FOR READ COMMITTED ACCESS", + getSystemCatalog(),SEABASE_MD_SCHEMA,SEABASE_OBJECTS, + (char*)catName.data(),(char*)schName.data()); + + cliRC = cliInterface.fetchAllRows(objectsQueue, query, 0, FALSE, FALSE, TRUE); + if (cliRC < 0) + { + cliInterface.retrieveSQLDiagnostics(CmpCommon::diags()); + goto label_error; + } + + for (int i = 0; i < objectsQueue->numEntries(); i++) + { + OutputInfo * vi = (OutputInfo*)objectsQueue->getNext(); + NAString objName = vi->get(0); + + strcat(errorObjs, objName.data()); + strcat(errorObjs, " "); + } + + NAString reason; + reason = "Reason: schema " + + schName + " is not empty. ObjectsInSchema: " + + errorObjs; + *CmpCommon::diags() << DgSqlCode(-CAT_UNABLE_TO_DROP_SCHEMA) + << DgSchemaName(catName + "." + schName) + << DgString0(reason); + goto label_error; + } // After all objects in the schema have been dropped, drop the schema object itself. @@ -855,8 +915,12 @@ void CmpSeabaseDDL::dropSeabaseSchema(StmtDDLDropSchema * dropSchemaNode) cliRC = cliInterface.executeImmediate(buf); if (cliRC < 0 && cliRC != -CAT_OBJECT_DOES_NOT_EXIST_IN_TRAFODION) { + NAString reason; + reason = "Reason: Delete of object " + + NAString(SEABASE_SCHEMA_OBJECTNAME) + " failed."; *CmpCommon::diags() << DgSqlCode(-CAT_UNABLE_TO_DROP_SCHEMA) - << DgSchemaName(catName + "." + schName); + << DgSchemaName(catName + "." + schName) + << DgString0(reason); goto label_error; }
