JIRA Trafodion-1645 SQL commands to retrieve region stats. Details in JIRA.
Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/51698645 Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/51698645 Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/51698645 Branch: refs/heads/master Commit: 51698645d910ee0eee1b9301caae3f743bbbba07 Parents: 1baeae6 Author: Cloud User <[email protected]> Authored: Wed Nov 25 20:28:24 2015 +0000 Committer: Cloud User <[email protected]> Committed: Wed Nov 25 20:28:24 2015 +0000 ---------------------------------------------------------------------- core/sqf/tools/sqtools.sh | 4 +- core/sql/comexe/ComTdb.h | 2 +- core/sql/comexe/ComTdbExeUtil.cpp | 27 + core/sql/comexe/ComTdbExeUtil.h | 117 +++ core/sql/executor/ExComTdb.cpp | 7 + core/sql/executor/ExExeUtil.h | 167 ++++ core/sql/executor/ExExeUtilCommon.cpp | 7 +- core/sql/executor/ExExeUtilGet.cpp | 798 ++++++++++++++++++- core/sql/executor/HBaseClient_JNI.cpp | 58 ++ core/sql/executor/HBaseClient_JNI.h | 2 + core/sql/exp/ExpHbaseInterface.cpp | 16 + core/sql/exp/ExpHbaseInterface.h | 3 + core/sql/generator/GenRelExeUtil.cpp | 119 +++ core/sql/optimizer/BindRelExpr.cpp | 5 + core/sql/optimizer/RelExeUtil.cpp | 128 ++- core/sql/optimizer/RelExeUtil.h | 60 ++ core/sql/parser/ParKeyWords.cpp | 2 + core/sql/parser/sqlparser.y | 102 ++- core/sql/regress/seabase/EXPECTED002 | 599 ++++++++++++++ core/sql/regress/seabase/FILTER002 | 29 + core/sql/regress/seabase/TEST002 | 105 +++ core/sql/sqlcomp/CmpDescribe.cpp | 19 +- .../java/org/trafodion/sql/HBaseClient.java | 57 +- .../java/org/trafodion/sql/TrafRegionStats.java | 144 ++++ 24 files changed, 2541 insertions(+), 36 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sqf/tools/sqtools.sh ---------------------------------------------------------------------- diff --git a/core/sqf/tools/sqtools.sh b/core/sqf/tools/sqtools.sh index 4832308..0c7767c 100644 --- a/core/sqf/tools/sqtools.sh +++ b/core/sqf/tools/sqtools.sh @@ -953,7 +953,9 @@ function cdt { function cdc { cd /local/cores/$UID } - +function cdj { + cd $MY_SQROOT/../sql/src/main/java/org/trafodion/sql +} # ls variants function lst { ls -lsrt $* http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sql/comexe/ComTdb.h ---------------------------------------------------------------------- diff --git a/core/sql/comexe/ComTdb.h b/core/sql/comexe/ComTdb.h index 93f3553..5846fd8 100644 --- a/core/sql/comexe/ComTdb.h +++ b/core/sql/comexe/ComTdb.h @@ -290,7 +290,7 @@ public: ex_GET_VERSION_INFO = 118, ex_SUSPEND_ACTIVATE = 121, ex_DISK_LABEL_STATISTICS = 122, - ex_GET_DISK_LABEL_STATS = 123, + ex_REGION_STATS = 123, ex_GET_FORMATTED_DISK_STATS = 124, ex_SHOW_SET = 125, ex_AQR = 126, http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sql/comexe/ComTdbExeUtil.cpp ---------------------------------------------------------------------- diff --git a/core/sql/comexe/ComTdbExeUtil.cpp b/core/sql/comexe/ComTdbExeUtil.cpp index 1463a07..631969f 100644 --- a/core/sql/comexe/ComTdbExeUtil.cpp +++ b/core/sql/comexe/ComTdbExeUtil.cpp @@ -2778,3 +2778,30 @@ void ComTdbExeUtilHBaseBulkUnLoad::displayContents(Space * space,ULng32 flag) } } +ComTdbExeUtilRegionStats::ComTdbExeUtilRegionStats +( + char * tableName, + ex_expr_base * input_expr, + ULng32 input_rowlen, + ex_cri_desc * work_cri_desc, + const unsigned short work_atp_index, + ex_cri_desc * given_cri_desc, + ex_cri_desc * returned_cri_desc, + queue_index down, + queue_index up, + Lng32 num_buffers, + ULng32 buffer_size) + : ComTdbExeUtil(ComTdbExeUtil::REGION_STATS_, + NULL, 0, (Int16)SQLCHARSETCODE_UNKNOWN, + tableName, strlen(tableName), + input_expr, input_rowlen, + NULL, 0, + NULL, + work_cri_desc, work_atp_index, + given_cri_desc, returned_cri_desc, + down, up, + num_buffers, buffer_size), + flags_(0) +{ + setNodeType(ComTdb::ex_REGION_STATS); +} http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sql/comexe/ComTdbExeUtil.h ---------------------------------------------------------------------- diff --git a/core/sql/comexe/ComTdbExeUtil.h b/core/sql/comexe/ComTdbExeUtil.h index 8389bcc..b33ab5b 100644 --- a/core/sql/comexe/ComTdbExeUtil.h +++ b/core/sql/comexe/ComTdbExeUtil.h @@ -69,6 +69,7 @@ public: GET_MAINTAIN_INFO_ = 9, GET_STATISTICS_ = 10, USER_LOAD_ = 11, + REGION_STATS_ = 12, LONG_RUNNING_ = 13, GET_METADATA_INFO_ = 14, GET_VERSION_INFO_ = 15, @@ -3452,6 +3453,122 @@ private: NABasicPtr snapshotSuffix_; // 30 - 37 char fillersExeUtilHbaseUnLoad_[16]; // 38 - 53 }; + +static const ComTdbVirtTableColumnInfo comTdbRegionStatsVirtTableColumnInfo[] = + { + { "CATALOG_NAME", 0, COM_USER_COLUMN, REC_BYTE_F_ASCII, 256, FALSE, SQLCHARSETCODE_UTF8 , 0, 0, 0, 0, 0, 0, 0, COM_NO_DEFAULT, "",NULL,NULL, COM_UNKNOWN_DIRECTION_LIT, 0 }, + { "SCHEMA_NAME", 1, COM_USER_COLUMN, REC_BYTE_F_ASCII, 256, FALSE, SQLCHARSETCODE_UTF8 , 0, 0, 0, 0, 0, 0, 0, COM_NO_DEFAULT, "",NULL,NULL, COM_UNKNOWN_DIRECTION_LIT, 0 }, + { "OBJECT_NAME", 2, COM_USER_COLUMN, REC_BYTE_F_ASCII, 256, FALSE, SQLCHARSETCODE_UTF8 , 0, 0, 0, 0, 0, 0, 0, COM_NO_DEFAULT, "",NULL,NULL, COM_UNKNOWN_DIRECTION_LIT, 0 }, + { "REGION_NUM", 3, COM_USER_COLUMN, REC_BIN64_SIGNED, 4, FALSE, SQLCHARSETCODE_UTF8 , 0, 0, 0, 0, 0, 0, 0, COM_NO_DEFAULT, "",NULL,NULL, COM_UNKNOWN_DIRECTION_LIT, 0 }, + { "REGION_NAME", 4, COM_USER_COLUMN, REC_BYTE_F_ASCII, 512, FALSE, SQLCHARSETCODE_UTF8 , 0, 0, 0, 0, 0, 0, 0, COM_NO_DEFAULT, "",NULL,NULL, COM_UNKNOWN_DIRECTION_LIT, 0 }, + { "NUM_STORES", 5, COM_USER_COLUMN, REC_BIN32_SIGNED, 8, FALSE, SQLCHARSETCODE_UTF8 , 0, 0, 0, 0, 0, 0, 0, COM_NO_DEFAULT, "",NULL,NULL, COM_UNKNOWN_DIRECTION_LIT, 0 }, + { "NUM_STORE_FILES", 6, COM_USER_COLUMN, REC_BIN32_SIGNED, 8, FALSE, SQLCHARSETCODE_UTF8 , 0, 0, 0, 0, 0, 0, 0, COM_NO_DEFAULT, "",NULL,NULL, COM_UNKNOWN_DIRECTION_LIT, 0 }, + { "STORE_FILE_UNCOMP_SIZE", 7, COM_USER_COLUMN, REC_BIN64_SIGNED, 8, FALSE, SQLCHARSETCODE_UTF8 , 0, 0, 0, 0, 0, 0, 0, COM_NO_DEFAULT, "",NULL,NULL, COM_UNKNOWN_DIRECTION_LIT, 0 }, + { "STORE_FILE_SIZE", 8, COM_USER_COLUMN, REC_BIN64_SIGNED, 8, FALSE, SQLCHARSETCODE_UTF8 , 0, 0, 0, 0, 0, 0, 0, COM_NO_DEFAULT, "",NULL,NULL, COM_UNKNOWN_DIRECTION_LIT, 0 }, + { "MEM_STORE_SIZE", 9, COM_USER_COLUMN, REC_BIN64_SIGNED, 8, FALSE, SQLCHARSETCODE_UTF8 , 0, 0, 0, 0, 0, 0, 0, COM_NO_DEFAULT, "",NULL,NULL, COM_UNKNOWN_DIRECTION_LIT, 0 }, + { "READ_REQUESTS_COUNT", 10, COM_USER_COLUMN, REC_BIN64_SIGNED, 8, FALSE, SQLCHARSETCODE_UTF8 , 0, 0, 0, 0, 0, 0, 0, COM_NO_DEFAULT, "",NULL,NULL, COM_UNKNOWN_DIRECTION_LIT, 0 }, + { "WRITE_REQUESTS_COUNT", 11, COM_USER_COLUMN, REC_BIN64_SIGNED, 8, FALSE, SQLCHARSETCODE_UTF8 , 0, 0, 0, 0, 0, 0, 0, COM_NO_DEFAULT, "",NULL,NULL, COM_UNKNOWN_DIRECTION_LIT, 0 } + }; + +struct ComTdbRegionStatsVirtTableColumnStruct +{ + char catalogName[256]; + char schemaName[256]; + char objectName[256]; + Int64 regionNum; + char regionName[512]; + Lng32 numStores; + Lng32 numStoreFiles; + Int64 storeFileUncompSize; + Int64 storeFileSize; + Int64 memStoreSize; + Int64 readRequestsCount; + Int64 writeRequestsCount; +}; + + +class ComTdbExeUtilRegionStats : public ComTdbExeUtil +{ + friend class ExExeUtilRegionStatsTcb; + friend class ExExeUtilRegionStatsPrivateState; + +public: + ComTdbExeUtilRegionStats() + : ComTdbExeUtil() + {} + + ComTdbExeUtilRegionStats( + char * tableName, + ex_expr_base * input_expr, + ULng32 input_rowlen, + ex_cri_desc * work_cri_desc, + const unsigned short work_atp_index, + ex_cri_desc * given_cri_desc, + ex_cri_desc * returned_cri_desc, + queue_index down, + queue_index up, + Lng32 num_buffers, + ULng32 buffer_size + ); + + // Long pack (void *); + // Lng32 unpack(void *, void * reallocator); + + void setIsIndex(NABoolean v) + {(v ? flags_ |= IS_INDEX : flags_ &= ~IS_INDEX); }; + NABoolean isIndex() { return (flags_ & IS_INDEX) != 0; }; + + void setDisplayFormat(NABoolean v) + {(v ? flags_ |= DISPLAY_FORMAT : flags_ &= ~DISPLAY_FORMAT); }; + NABoolean displayFormat() { return (flags_ & DISPLAY_FORMAT) != 0; }; + + void setSummaryOnly(NABoolean v) + {(v ? flags_ |= SUMMARY_ONLY : flags_ &= ~SUMMARY_ONLY); }; + NABoolean summaryOnly() { return (flags_ & SUMMARY_ONLY) != 0; }; + + // --------------------------------------------------------------------- + // Redefine virtual functions required for Versioning. + //---------------------------------------------------------------------- + virtual short getClassSize() {return (short)sizeof(ComTdbExeUtilRegionStats);} + + virtual const char *getNodeName() const + { + return "GET_REGION_STATS"; + }; + + static int getVirtTableNumCols() + { + return sizeof(comTdbRegionStatsVirtTableColumnInfo)/sizeof(ComTdbVirtTableColumnInfo); + } + + static ComTdbVirtTableColumnInfo * getVirtTableColumnInfo() + { + return (ComTdbVirtTableColumnInfo*)comTdbRegionStatsVirtTableColumnInfo; + } + + static int getVirtTableNumKeys() + { + return 0; + } + + static ComTdbVirtTableKeyInfo * getVirtTableKeyInfo() + { + return NULL; + } + +private: + enum + { + IS_INDEX = 0x0001, + DISPLAY_FORMAT = 0x0002, + SUMMARY_ONLY = 0x0004 + }; + + UInt32 flags_; // 00-03 + + char fillersComTdbExeUtilRegionStats_[76]; // 04-79 +}; + #endif http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sql/executor/ExComTdb.cpp ---------------------------------------------------------------------- diff --git a/core/sql/executor/ExComTdb.cpp b/core/sql/executor/ExComTdb.cpp index 00d35b0..54ce150 100644 --- a/core/sql/executor/ExComTdb.cpp +++ b/core/sql/executor/ExComTdb.cpp @@ -696,6 +696,13 @@ NA_EIDPROC char *ComTdb::findVTblPtrExe(short classID) break; } + case ex_REGION_STATS: + { + GetVTblPtr(vtblptr,ExExeUtilRegionStatsTdb); + + break; + } + #endif default: ex_assert(0, "findVTblPtrExe(): Cannot find entry of this ClassId"); // LCOV_EXCL_LINE http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sql/executor/ExExeUtil.h ---------------------------------------------------------------------- diff --git a/core/sql/executor/ExExeUtil.h b/core/sql/executor/ExExeUtil.h index 61fd4b9..5c8e0b6 100755 --- a/core/sql/executor/ExExeUtil.h +++ b/core/sql/executor/ExExeUtil.h @@ -3635,6 +3635,173 @@ class ExExeUtilHbaseUnLoadPrivateState : public ex_tcb_private_state protected: }; +////////////////////////////////////////////////////////////////////////// +// ----------------------------------------------------------------------- +// ExExeUtilRegionStatsTdb +// ----------------------------------------------------------------------- +class ExExeUtilRegionStatsTdb : public ComTdbExeUtilRegionStats +{ +public: + + // --------------------------------------------------------------------- + // Constructor is only called to instantiate an object used for + // retrieval of the virtual table function pointer of the class while + // unpacking. An empty constructor is enough. + // --------------------------------------------------------------------- + NA_EIDPROC ExExeUtilRegionStatsTdb() + {} + + NA_EIDPROC virtual ~ExExeUtilRegionStatsTdb() + {} + + // --------------------------------------------------------------------- + // Build a TCB for this TDB. Redefined in the Executor project. + // --------------------------------------------------------------------- + NA_EIDPROC virtual ex_tcb *build(ex_globals *globals); + +private: + // --------------------------------------------------------------------- + // !!!!!!! IMPORTANT -- NO DATA MEMBERS ALLOWED IN EXECUTOR TDB !!!!!!!! + // ********************************************************************* + // The Executor TDB's are only used for the sole purpose of providing a + // way to supplement the Compiler TDB's (in comexe) with methods whose + // implementation depends on Executor objects. This is done so as to + // decouple the Compiler from linking in Executor objects unnecessarily. + // + // When a Compiler generated TDB arrives at the Executor, the same data + // image is "cast" as an Executor TDB after unpacking. Therefore, it is + // a requirement that a Compiler TDB has the same object layout as its + // corresponding Executor TDB. As a result of this, all Executor TDB's + // must have absolutely NO data members, but only member functions. So, + // if you reach here with an intention to add data members to a TDB, ask + // yourself two questions: + // + // 1. Are those data members Compiler-generated? + // If yes, put them in the ComTdbDLL instead. + // If no, they should probably belong to someplace else (like TCB). + // + // 2. Are the classes those data members belong defined in the executor + // project? + // If your answer to both questions is yes, you might need to move + // the classes to the comexe project. + // --------------------------------------------------------------------- +}; + +////////////////////////////////////////////////////////////////////////// +// ----------------------------------------------------------------------- +// ExExeUtilRegionStatsTcb +// ----------------------------------------------------------------------- +class ExExeUtilRegionStatsTcb : public ExExeUtilTcb +{ + friend class ExExeUtilRegionStatsTdb; + friend class ExExeUtilPrivateState; + +public: + // Constructor + ExExeUtilRegionStatsTcb(const ComTdbExeUtilRegionStats & exe_util_tdb, + ex_globals * glob = 0); + + ~ExExeUtilRegionStatsTcb(); + + virtual short work(); + + ExExeUtilRegionStatsTdb & getDLStdb() const + { + return (ExExeUtilRegionStatsTdb &) tdb; + }; + +private: + enum Step + { + INITIAL_, + EVAL_INPUT_, + COLLECT_STATS_, + POPULATE_STATS_BUF_, + RETURN_STATS_BUF_, + HANDLE_ERROR_, + DONE_ + }; + Step step_; + +protected: + Int64 getEmbeddedNumValue(char* &sep, char endChar, + NABoolean adjustLen = TRUE); + + short collectStats(char * tableName); + short populateStats(Int32 currIndex, NABoolean nullTerminate = FALSE); + + char * hbaseRootdir_; + + char * tableName_; + + char * inputNameBuf_; + + char * statsBuf_; + Lng32 statsBufLen_; + ComTdbRegionStatsVirtTableColumnStruct* stats_; + + ExpHbaseInterface * ehi_; + ByteArrayList * regionInfoList_; + + Int32 currIndex_; + + char * catName_; + char * schName_; + char * objName_; + char * regionName_; +}; + +////////////////////////////////////////////////////////////////////////// +// ----------------------------------------------------------------------- +// ExExeUtilRegionStatsFormatTcb +// ----------------------------------------------------------------------- +class ExExeUtilRegionStatsFormatTcb : public ExExeUtilRegionStatsTcb +{ + friend class ExExeUtilRegionStatsTdb; + friend class ExExeUtilPrivateState; + +public: + // Constructor + ExExeUtilRegionStatsFormatTcb(const ComTdbExeUtilRegionStats & exe_util_tdb, + ex_globals * glob = 0); + + virtual short work(); + +private: + enum Step + { + INITIAL_, + COLLECT_STATS_, + EVAL_INPUT_, + COMPUTE_TOTALS_, + RETURN_SUMMARY_, + RETURN_DETAILS_, + POPULATE_STATS_BUF_, + RETURN_REGION_INFO_, + HANDLE_ERROR_, + DONE_ + }; + + Step step_; + + char * statsTotalsBuf_; + ComTdbRegionStatsVirtTableColumnStruct* statsTotals_; + + short initTotals(); + short computeTotals(); +}; + +//////////////////////////////////////////////////////////////////////////// +class ExExeUtilRegionStatsPrivateState : public ex_tcb_private_state +{ + friend class ExExeUtilRegionStatsTcb; + +public: + ExExeUtilRegionStatsPrivateState(); + ~ExExeUtilRegionStatsPrivateState(); // destructor +protected: +}; + #endif http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sql/executor/ExExeUtilCommon.cpp ---------------------------------------------------------------------- diff --git a/core/sql/executor/ExExeUtilCommon.cpp b/core/sql/executor/ExExeUtilCommon.cpp index 1552b75..51bac92 100644 --- a/core/sql/executor/ExExeUtilCommon.cpp +++ b/core/sql/executor/ExExeUtilCommon.cpp @@ -326,7 +326,7 @@ short ExExeUtilTcb::extractObjectParts( NABoolean ExExeUtilTcb::isUpQueueFull(short size) { - if ((qparent_.up->getSize() - qparent_.up->getLength()) < 5) + if ((qparent_.up->getSize() - qparent_.up->getLength()) < size) return TRUE; else return FALSE; @@ -335,8 +335,9 @@ NABoolean ExExeUtilTcb::isUpQueueFull(short size) short ExExeUtilTcb::moveRowToUpQueue(const char * row, Lng32 len, short * rc, NABoolean isVarchar) { - return ex_tcb::moveRowToUpQueue(&qparent_, exeUtilTdb().tuppIndex_, - row, len, rc, isVarchar); + short retcode = ex_tcb::moveRowToUpQueue(&qparent_, exeUtilTdb().tuppIndex_, + row, len, rc, isVarchar); + return retcode; } char * ExExeUtilTcb::getTimeAsString(Int64 elapsedTime, char * timeBuf) http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sql/executor/ExExeUtilGet.cpp ---------------------------------------------------------------------- diff --git a/core/sql/executor/ExExeUtilGet.cpp b/core/sql/executor/ExExeUtilGet.cpp index 55ff963..963a999 100644 --- a/core/sql/executor/ExExeUtilGet.cpp +++ b/core/sql/executor/ExExeUtilGet.cpp @@ -64,6 +64,7 @@ #include "PrivMgrCommands.h" #include "ExpHbaseInterface.h" +#include "sql_buffer_size.h" //****************************************************************************** // * @@ -221,7 +222,7 @@ static const QueryString getComponentPrivilegesForUser[] = static const QueryString getTrafTablesInSchemaQuery[] = { - {" select object_name from "}, + {" select %sobject_name%s from "}, {" %s.\"%s\".%s "}, {" where catalog_name = '%s' and "}, {" schema_name = '%s' and "}, @@ -243,6 +244,21 @@ static const QueryString getTrafIndexesInSchemaQuery[] = {" ; "} }; +static const QueryString getTrafIndexesOnTableQuery[] = +{ + {" select %sO2.object_name%s from "}, + {" %s.\"%s\".%s I, "}, + {" %s.\"%s\".%s O, "}, + {" %s.\"%s\".%s O2 "}, + {" where O.catalog_name = '%s' "}, + {" and O.schema_name = '%s' "}, + {" and O.object_name = '%s' "}, + {" and I.base_table_uid = O.object_uid "}, + {" and I.index_uid = O2.object_uid "}, + {" order by 1 "}, + {" ; "} +}; + static const QueryString getTrafProceduresInSchemaQuery[] = { {" select object_name from "}, @@ -1657,6 +1673,7 @@ short ExExeUtilGetMetadataInfoTcb::work() char sch[100]; char pmsch[100]; char tab[100]; + char indexes[100]; char view[100]; char view_usage[100]; char auths[100]; @@ -1675,6 +1692,7 @@ short ExExeUtilGetMetadataInfoTcb::work() strcpy(tab, SEABASE_OBJECTS); strcpy(view, SEABASE_VIEWS); strcpy(view_usage, SEABASE_VIEWS_USAGE); + strcpy(indexes, SEABASE_INDEXES); strcpy(auths, SEABASE_AUTHS); strcpy(role_usage, "ROLE_USAGE"); strcpy(components, "COMPONENTS"); @@ -1711,11 +1729,13 @@ short ExExeUtilGetMetadataInfoTcb::work() qs = getTrafTablesInSchemaQuery; sizeOfqs = sizeof(getTrafTablesInSchemaQuery); - param_[0] = cat; - param_[1] = sch; - param_[2] = tab; - param_[3] = getMItdb().cat_; - param_[4] = getMItdb().sch_; + param_[0] = catSchValue; + param_[1] = endQuote; + param_[2] = cat; + param_[3] = sch; + param_[4] = tab; + param_[5] = getMItdb().cat_; + param_[6] = getMItdb().sch_; } break; @@ -1785,6 +1805,29 @@ short ExExeUtilGetMetadataInfoTcb::work() } break; + case ComTdbExeUtilGetMetadataInfo::INDEXES_ON_TABLE_: + { + qs = getTrafIndexesOnTableQuery; + sizeOfqs = sizeof(getTrafIndexesOnTableQuery); + + param_[0] = catSchValue; + param_[1] = endQuote; + param_[2] = cat; + param_[3] = sch; + param_[4] = indexes; + param_[5] = cat; + param_[6] = sch; + param_[7] = tab; + param_[8] = cat; + param_[9] = sch; + param_[10] = tab; + param_[11] = getMItdb().cat_; + param_[12] = getMItdb().sch_; + param_[13] = getMItdb().obj_; + + } + break; + case ComTdbExeUtilGetMetadataInfo::VIEWS_ON_TABLE_: case ComTdbExeUtilGetMetadataInfo::VIEWS_ON_VIEW_: { @@ -3450,7 +3493,7 @@ short ExExeUtilGetMetadataInfoVersionTcb::work() // make sure there is enough space to move header if (isUpQueueFull(5)) { - return WORK_OK; // come back later + return WORK_CALL_AGAIN; // come back later } if (numOutputEntries_ == 2) @@ -5315,4 +5358,745 @@ ExExeUtilHiveMDaccessPrivateState::~ExExeUtilHiveMDaccessPrivateState() { }; +/////////////////////////////////////////////////////////////////// +ex_tcb * ExExeUtilRegionStatsTdb::build(ex_globals * glob) +{ + ExExeUtilRegionStatsTcb * exe_util_tcb; + + if (displayFormat()) + exe_util_tcb = new(glob->getSpace()) ExExeUtilRegionStatsFormatTcb(*this, glob); + else + exe_util_tcb = new(glob->getSpace()) ExExeUtilRegionStatsTcb(*this, glob); + + exe_util_tcb->registerSubtasks(); + + return (exe_util_tcb); +} + +//////////////////////////////////////////////////////////////// +// Constructor for class ExExeUtilRegionStatsTcb +/////////////////////////////////////////////////////////////// +ExExeUtilRegionStatsTcb::ExExeUtilRegionStatsTcb( + const ComTdbExeUtilRegionStats & exe_util_tdb, + ex_globals * glob) + : ExExeUtilTcb( exe_util_tdb, NULL, glob) +{ + statsBuf_ = new(glob->getDefaultHeap()) char[sizeof(ComTdbRegionStatsVirtTableColumnStruct)]; + statsBufLen_ = sizeof(ComTdbRegionStatsVirtTableColumnStruct); + + stats_ = (ComTdbRegionStatsVirtTableColumnStruct*)statsBuf_; + + inputNameBuf_ = NULL; + if (exe_util_tdb.inputExpr_) + { + inputNameBuf_ = new(glob->getDefaultHeap()) char[exe_util_tdb.inputRowlen_]; + } + + int jniDebugPort = 0; + int jniDebugTimeout = 0; + ehi_ = ExpHbaseInterface::newInstance(glob->getDefaultHeap(), + (char*)"", //exe_util_tdb.server(), + (char*)"", //exe_util_tdb.zkPort(), + jniDebugPort, + jniDebugTimeout); + + regionInfoList_ = NULL; + + tableName_ = new(glob->getDefaultHeap()) char[2000]; + + // get hbase rootdir location + hbaseRootdir_ = new(glob->getDefaultHeap()) char[1000]; + strcpy(hbaseRootdir_, "/hbase"); + + step_ = INITIAL_; +} + +ExExeUtilRegionStatsTcb::~ExExeUtilRegionStatsTcb() +{ + if (statsBuf_) + NADELETEBASIC(statsBuf_, getGlobals()->getDefaultHeap()); + + if (ehi_) + delete ehi_; + + statsBuf_ = NULL; +} + +////////////////////////////////////////////////////// +// work() for ExExeUtilRegionStatsTcb +////////////////////////////////////////////////////// +Int64 ExExeUtilRegionStatsTcb::getEmbeddedNumValue +(char* &sep, char endChar, NABoolean adjustLen) +{ + Int64 num = -1; + char * sepEnd = strchr(sep+1, endChar); + if (sepEnd) + { + char longBuf[30]; + + Lng32 len = sepEnd - sep - 1; + str_cpy_all(longBuf, (sep+1), len); + longBuf[len] = 0; + + num = str_atoi(longBuf, len); + + sep += len + 1; + + if ((adjustLen) && (num == 0)) + num = 1024; + } + + return num; +} + +short ExExeUtilRegionStatsTcb::collectStats(char * tableName) +{ + // populate catName_, schName_, objName_. + if (extractParts(tableName, + &catName_, &schName_, &objName_)) + { + return -1; + } + + // collect stats from ehi. + HbaseStr tblName; + + NAString extNameForHbase = + NAString(catName_) + "." + NAString(schName_) + "." + NAString(objName_); + tblName.val = (char*)extNameForHbase.data(); + tblName.len = extNameForHbase.length(); + + regionInfoList_ = ehi_->getRegionStats(tblName); + if (! regionInfoList_) + { + return -1; + } + + currIndex_ = 0; + + return 0; +} + +short ExExeUtilRegionStatsTcb::populateStats +(Int32 currIndex, NABoolean nullTerminate) +{ + str_pad(stats_->catalogName, sizeof(stats_->catalogName), ' '); + str_cpy_all(stats_->catalogName, catName_, strlen(catName_)); + if (nullTerminate) + stats_->catalogName[strlen(catName_)] = 0; + + str_pad(stats_->schemaName, sizeof(stats_->schemaName), ' '); + str_cpy_all(stats_->schemaName, schName_, strlen(schName_)); + if (nullTerminate) + stats_->schemaName[strlen(schName_)] = 0; + + str_pad(stats_->objectName, sizeof(stats_->objectName), ' '); + str_cpy_all(stats_->objectName, objName_, strlen(objName_)); + if (nullTerminate) + stats_->objectName[strlen(objName_)] = 0; + + str_pad(stats_->regionName, sizeof(stats_->regionName), ' '); + stats_->regionNum = currIndex_+1; + + char regionInfoBuf[5000]; + Int32 len = 0; + char * regionInfo = + regionInfoList_->getEntry + (currIndex, regionInfoBuf, 5000, len); + regionInfo[len] = 0; + + stats_->numStores = 0; + stats_->numStoreFiles = 0; + stats_->storeFileUncompSize = 0; + stats_->storeFileSize = 0; + stats_->memStoreSize = 0; + + char longBuf[30]; + char * sep1 = strchr(regionInfo, '|'); + if (sep1) + { + str_cpy_all(stats_->regionName, regionInfo, + (Lng32)(sep1 - regionInfo)); + + if (nullTerminate) + stats_->regionName[sep1 - regionInfo] = 0; + } + + char * sepStart = sep1; + stats_->numStores = getEmbeddedNumValue(sepStart, '|', FALSE); + stats_->numStoreFiles = getEmbeddedNumValue(sepStart, '|', FALSE); + stats_->storeFileUncompSize = getEmbeddedNumValue(sepStart, '|', FALSE); + stats_->storeFileSize = getEmbeddedNumValue(sepStart, '|', FALSE); + stats_->memStoreSize = getEmbeddedNumValue(sepStart, '|', FALSE); + stats_->readRequestsCount = getEmbeddedNumValue(sepStart, '|', FALSE); + stats_->writeRequestsCount = getEmbeddedNumValue(sepStart, '|', FALSE); + + return 0; +} + +short ExExeUtilRegionStatsTcb::work() +{ + short retcode = 0; + Lng32 cliRC = 0; + + // if no parent request, return + if (qparent_.down->isEmpty()) + return WORK_OK; + + // if no room in up queue, won't be able to return data/status. + // Come back later. + if (qparent_.up->isFull()) + return WORK_OK; + + ex_queue_entry * pentry_down = qparent_.down->getHeadEntry(); + ExExeUtilPrivateState & pstate = + *((ExExeUtilPrivateState*) pentry_down->pstate); + + // Get the globals stucture of the master executor. + ExExeStmtGlobals *exeGlob = getGlobals()->castToExExeStmtGlobals(); + ExMasterStmtGlobals *masterGlob = exeGlob->castToExMasterStmtGlobals(); + ContextCli * currContext = masterGlob->getCliGlobals()->currContext(); + + while (1) + { + switch (step_) + { + case INITIAL_: + { + if (ehi_ == NULL) + { + step_ = HANDLE_ERROR_; + break; + } + + if (getDLStdb().inputExpr()) + { + step_ = EVAL_INPUT_; + break; + } + + strcpy(tableName_, getDLStdb().getTableName()); + + step_ = COLLECT_STATS_; + } + break; + + case EVAL_INPUT_: + { + workAtp_->getTupp(getDLStdb().workAtpIndex()) + .setDataPointer(inputNameBuf_); + + ex_expr::exp_return_type exprRetCode = + getDLStdb().inputExpr()->eval(pentry_down->getAtp(), workAtp_); + if (exprRetCode == ex_expr::EXPR_ERROR) + { + step_ = HANDLE_ERROR_; + break; + } + + short len = *(short*)inputNameBuf_; + str_cpy_all(tableName_, &inputNameBuf_[2], len); + tableName_[len] = 0; + + step_ = COLLECT_STATS_; + } + break; + + case COLLECT_STATS_: + { + if (collectStats(tableName_)) + { + step_ = HANDLE_ERROR_; + break; + } + + currIndex_ = 0; + + step_ = POPULATE_STATS_BUF_; + } + break; + + case POPULATE_STATS_BUF_: + { + if (currIndex_ == regionInfoList_->getSize()) + { + step_ = DONE_; + break; + } + + if (populateStats(currIndex_)) + { + step_ = HANDLE_ERROR_; + break; + } + + step_ = RETURN_STATS_BUF_; + } + break; + + case RETURN_STATS_BUF_: + { + if (qparent_.up->isFull()) + return WORK_OK; + + short rc = 0; + if (moveRowToUpQueue((char*)stats_, statsBufLen_, &rc, FALSE)) + return rc; + + currIndex_++; + + step_ = POPULATE_STATS_BUF_; + } + break; + + case HANDLE_ERROR_: + { + retcode = handleError(); + if (retcode == 1) + return WORK_OK; + + step_ = DONE_; + } + break; + + case DONE_: + { + retcode = handleDone(); + if (retcode == 1) + return WORK_OK; + + step_ = INITIAL_; + + return WORK_CALL_AGAIN; + } + break; + + + } // switch + + } // while + + return WORK_OK; +} + +///////////////////////////////////////////////////////////////////////////// +// Constructor and destructor for ExeUtil_private_state +///////////////////////////////////////////////////////////////////////////// +ExExeUtilRegionStatsPrivateState::ExExeUtilRegionStatsPrivateState() +{ +} + +ExExeUtilRegionStatsPrivateState::~ExExeUtilRegionStatsPrivateState() +{ +}; + + +//////////////////////////////////////////////////////////////// +// Constructor for class ExExeUtilRegionStatsFormatTcb +/////////////////////////////////////////////////////////////// +ExExeUtilRegionStatsFormatTcb::ExExeUtilRegionStatsFormatTcb( + const ComTdbExeUtilRegionStats & exe_util_tdb, + ex_globals * glob) + : ExExeUtilRegionStatsTcb( exe_util_tdb, glob) +{ + statsTotalsBuf_ = new(glob->getDefaultHeap()) char[sizeof(ComTdbRegionStatsVirtTableColumnStruct)]; + + statsTotals_ = (ComTdbRegionStatsVirtTableColumnStruct*)statsTotalsBuf_; + + initTotals(); + + step_ = INITIAL_; +} + +short ExExeUtilRegionStatsFormatTcb::initTotals() +{ + statsTotals_->numStores = 0; + statsTotals_->numStoreFiles = 0; + statsTotals_->readRequestsCount = 0; + statsTotals_->writeRequestsCount = 0; + statsTotals_->storeFileUncompSize = 0; + statsTotals_->storeFileSize = 0; + statsTotals_->memStoreSize = 0; + + return 0; +} + +short ExExeUtilRegionStatsFormatTcb::computeTotals() +{ + str_pad(statsTotals_->catalogName, sizeof(statsTotals_->catalogName), ' '); + str_cpy_and_null(statsTotals_->catalogName, catName_, strlen(catName_), '\0', ' ', TRUE); + str_pad(statsTotals_->schemaName, sizeof(statsTotals_->schemaName), ' '); + str_cpy_and_null(statsTotals_->schemaName, schName_, strlen(schName_), '\0', ' ', TRUE); + str_pad(statsTotals_->objectName, sizeof(statsTotals_->objectName), ' '); + str_cpy_and_null(statsTotals_->objectName, objName_, strlen(objName_), '\0', ' ', TRUE); + str_pad(statsTotals_->regionName, sizeof(statsTotals_->regionName), ' '); + + for (Int32 currIndex = 0; currIndex < regionInfoList_->getSize(); currIndex++) + { + if (populateStats(currIndex)) + return -1; + + statsTotals_->numStores += stats_->numStores; + statsTotals_->numStoreFiles += stats_->numStoreFiles; + statsTotals_->storeFileUncompSize += stats_->storeFileUncompSize; + statsTotals_->storeFileSize += stats_->storeFileSize; + statsTotals_->memStoreSize += stats_->memStoreSize; + statsTotals_->readRequestsCount += stats_->readRequestsCount; + statsTotals_->writeRequestsCount += stats_->writeRequestsCount; + } + + return 0; +} + +short ExExeUtilRegionStatsFormatTcb::work() +{ + short retcode = 0; + Lng32 cliRC = 0; + + // if no parent request, return + if (qparent_.down->isEmpty()) + return WORK_OK; + + // if no room in up queue, won't be able to return data/status. + // Come back later. + if (qparent_.up->isFull()) + return WORK_OK; + + ex_queue_entry * pentry_down = qparent_.down->getHeadEntry(); + ExExeUtilPrivateState & pstate = + *((ExExeUtilPrivateState*) pentry_down->pstate); + + // Get the globals stucture of the master executor. + ExExeStmtGlobals *exeGlob = getGlobals()->castToExExeStmtGlobals(); + ExMasterStmtGlobals *masterGlob = exeGlob->castToExMasterStmtGlobals(); + ContextCli * currContext = masterGlob->getCliGlobals()->currContext(); + + while (1) + { + switch (step_) + { + case INITIAL_: + { + if (ehi_ == NULL) + { + step_ = HANDLE_ERROR_; + break; + } + + initTotals(); + + if (getDLStdb().inputExpr()) + { + step_ = EVAL_INPUT_; + break; + } + + strcpy(tableName_, getDLStdb().getTableName()); + + step_ = COLLECT_STATS_; + } + break; + + case EVAL_INPUT_: + { + workAtp_->getTupp(getDLStdb().workAtpIndex()) + .setDataPointer(inputNameBuf_); + + ex_expr::exp_return_type exprRetCode = + getDLStdb().inputExpr()->eval(pentry_down->getAtp(), workAtp_); + if (exprRetCode == ex_expr::EXPR_ERROR) + { + step_ = HANDLE_ERROR_; + break; + } + + short len = *(short*)inputNameBuf_; + str_cpy_all(tableName_, &inputNameBuf_[2], len); + tableName_[len] = 0; + + step_ = COLLECT_STATS_; + } + break; + + case COLLECT_STATS_: + { + if (collectStats(tableName_)) + { + step_ = HANDLE_ERROR_; + break; + } + + currIndex_ = 0; + + step_ = COMPUTE_TOTALS_; + } + break; + + case COMPUTE_TOTALS_: + { + if (computeTotals()) + { + step_ = HANDLE_ERROR_; + break; + } + + step_ = RETURN_SUMMARY_; + } + break; + + case RETURN_SUMMARY_: + { + // make sure there is enough space to move header + if (isUpQueueFull(14)) + { + return WORK_CALL_AGAIN; // come back later + } + + ULng32 neededSize = SqlBufferNeededSize(14, 250); + if (! pool_->get_free_buffer(neededSize)) + { + return WORK_CALL_AGAIN; + } + + char buf[1000]; + short rc = 0; + + str_sprintf(buf, " "); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, "Stats Summary"); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, "============="); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, " "); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + NAString objName = statsTotals_->catalogName; + objName += "."; + objName += statsTotals_->schemaName; + objName += "."; + objName += statsTotals_->objectName; + + str_sprintf(buf, " ObjectName: %s", objName.data()); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, " NumRegions: %d", regionInfoList_->getSize()); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, " RegionsLocation: %s/data/default", + hbaseRootdir_); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, " TotalNumStores: %d", statsTotals_->numStores); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, " TotalNumStoreFiles: %d", statsTotals_->numStoreFiles); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, " TotalUncompressedSize: %Ld", statsTotals_->storeFileUncompSize); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, " TotalStoreFileSize: %Ld", statsTotals_->storeFileSize); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, " TotalMemStoreSize: %Ld", statsTotals_->memStoreSize); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, " TotalReadRequestsCount: %Ld", statsTotals_->readRequestsCount); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, " TotalWriteRequestsCount: %Ld", statsTotals_->writeRequestsCount); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + step_ = RETURN_DETAILS_; + return WORK_RESCHEDULE_AND_RETURN; + } + break; + + case RETURN_DETAILS_: + { + + if ((getDLStdb().summaryOnly()) || + (regionInfoList_->getSize() == 0)) + { + step_ = DONE_; + break; + } + + // make sure there is enough space to move header + if (isUpQueueFull(4)) + { + return WORK_CALL_AGAIN; // come back later + } + + ULng32 neededSize = SqlBufferNeededSize(4, 250); + if (! pool_->get_free_buffer(neededSize)) + { + return WORK_CALL_AGAIN; + } + + char buf[1000]; + short rc = 0; + + str_sprintf(buf, " "); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, "Stats Details"); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, "============="); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, " "); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + currIndex_ = 0; + step_ = POPULATE_STATS_BUF_; + + return WORK_RESCHEDULE_AND_RETURN; + } + break; + + case POPULATE_STATS_BUF_: + { + if (currIndex_ == regionInfoList_->getSize()) + { + step_ = DONE_; + break; + } + + if (populateStats(currIndex_, TRUE)) + { + step_ = HANDLE_ERROR_; + break; + } + + step_ = RETURN_REGION_INFO_; + } + break; + + case RETURN_REGION_INFO_: + { + // make sure there is enough space to move header + if (isUpQueueFull(10)) + { + return WORK_CALL_AGAIN; // come back later + } + + ULng32 neededSize = SqlBufferNeededSize(4, 100); + if (! pool_->get_free_buffer(neededSize)) + { + return WORK_CALL_AGAIN; + } + + char buf[1000]; + short rc = 0; + + str_sprintf(buf, " RegionNum: %d", currIndex_+1); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, " RegionName: %s", stats_->regionName); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, " NumStores: %d", stats_->numStores); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, " NumStoreFiles: %d", stats_->numStoreFiles); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + if (stats_->storeFileUncompSize == 0) + str_sprintf(buf, " UncompressedSize: %Ld (less than 1MB)", stats_->storeFileUncompSize); + else + str_sprintf(buf, " UncompressedSize: %Ld Bytes", stats_->storeFileUncompSize); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + if (stats_->storeFileSize == 0) + str_sprintf(buf, " StoreFileSize: %Ld (less than 1MB)", stats_->storeFileSize); + else + str_sprintf(buf, " StoreFileSize: %Ld Bytes", stats_->storeFileSize); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + if (stats_->memStoreSize == 0) + str_sprintf(buf, " MemStoreSize: %Ld (less than 1MB)", stats_->memStoreSize); + else + str_sprintf(buf, " MemStoreSize: %Ld Bytes", stats_->memStoreSize); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, " ReadRequestsCount: %Ld", stats_->readRequestsCount); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, " WriteRequestsCount: %Ld", stats_->writeRequestsCount); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + str_sprintf(buf, " "); + if (moveRowToUpQueue(buf, strlen(buf), &rc)) + return rc; + + currIndex_++; + + step_ = POPULATE_STATS_BUF_; + + return WORK_RESCHEDULE_AND_RETURN; + } + break; + + case HANDLE_ERROR_: + { + retcode = handleError(); + if (retcode == 1) + return WORK_OK; + + step_ = DONE_; + } + break; + + case DONE_: + { + retcode = handleDone(); + if (retcode == 1) + return WORK_OK; + + step_ = INITIAL_; + + return WORK_CALL_AGAIN; + } + break; + + + } // switch + + } // while + + return WORK_OK; +} + //LCOV_EXCL_STOP http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sql/executor/HBaseClient_JNI.cpp ---------------------------------------------------------------------- diff --git a/core/sql/executor/HBaseClient_JNI.cpp b/core/sql/executor/HBaseClient_JNI.cpp index e0712b2..c728733 100644 --- a/core/sql/executor/HBaseClient_JNI.cpp +++ b/core/sql/executor/HBaseClient_JNI.cpp @@ -449,6 +449,8 @@ HBC_RetCode HBaseClient_JNI::init() JavaMethods_[JM_DROP_ALL ].jm_signature = "(Ljava/lang/String;)Z"; JavaMethods_[JM_LIST_ALL ].jm_name = "listAll"; JavaMethods_[JM_LIST_ALL ].jm_signature = "(Ljava/lang/String;)Lorg/trafodion/sql/ByteArrayList;"; + JavaMethods_[JM_GET_REGION_STATS ].jm_name = "getRegionStats"; + JavaMethods_[JM_GET_REGION_STATS ].jm_signature = "(Ljava/lang/String;)Lorg/trafodion/sql/ByteArrayList;"; JavaMethods_[JM_COPY ].jm_name = "copy"; JavaMethods_[JM_COPY ].jm_signature = "(Ljava/lang/String;Ljava/lang/String;)Z"; JavaMethods_[JM_EXISTS ].jm_name = "exists"; @@ -1465,6 +1467,62 @@ ByteArrayList* HBaseClient_JNI::listAll(const char* pattern) ////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////// +ByteArrayList* HBaseClient_JNI::getRegionStats(const char* tblName) +{ + QRLogger::log(CAT_SQL_HBASE, LL_DEBUG, "HBaseClient_JNI::getRegionStats(%s) called.", tblName); + + if (jenv_ == NULL) + if (initJVM() != JOI_OK) + return NULL; + + if (jenv_->PushLocalFrame(jniHandleCapacity_) != 0) { + getExceptionDetails(); + return NULL; + } + jstring js_tblName = jenv_->NewStringUTF(tblName); + if (js_tblName == NULL) + { + GetCliGlobals()->setJniErrorStr(getErrorText(HBC_ERROR_DROP_PARAM)); + jenv_->PopLocalFrame(NULL); + return NULL; + } + + tsRecentJMFromJNI = JavaMethods_[JM_GET_REGION_STATS].jm_full_name; + jobject jByteArrayList = + jenv_->CallObjectMethod(javaObj_, JavaMethods_[JM_GET_REGION_STATS].methodID, js_tblName); + + jenv_->DeleteLocalRef(js_tblName); + + if (jenv_->ExceptionCheck()) + { + getExceptionDetails(jenv_); + logError(CAT_SQL_HBASE, __FILE__, __LINE__); + logError(CAT_SQL_HBASE, "HBaseClient_JNI::getRegionStats()", getLastError()); + jenv_->PopLocalFrame(NULL); + return NULL; + } + + if (jByteArrayList == NULL) { + jenv_->PopLocalFrame(NULL); + return NULL; + } + + ByteArrayList* regionInfo = new (heap_) ByteArrayList(heap_, jByteArrayList); + jenv_->DeleteLocalRef(jByteArrayList); + if (regionInfo->init() != BAL_OK) + { + NADELETE(regionInfo, ByteArrayList, heap_); + jenv_->PopLocalFrame(NULL); + return NULL; + } + + jenv_->PopLocalFrame(NULL); + return regionInfo; +} + +////////////////////////////////////////////////////////////////////////////// +// +////////////////////////////////////////////////////////////////////////////// HBC_RetCode HBaseClient_JNI::copy(const char* currTblName, const char* oldTblName) { QRLogger::log(CAT_SQL_HBASE, LL_DEBUG, "HBaseClient_JNI::copy(%s,%s) called.", currTblName, oldTblName); http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sql/executor/HBaseClient_JNI.h ---------------------------------------------------------------------- diff --git a/core/sql/executor/HBaseClient_JNI.h b/core/sql/executor/HBaseClient_JNI.h index e4129d1..b7edd01 100644 --- a/core/sql/executor/HBaseClient_JNI.h +++ b/core/sql/executor/HBaseClient_JNI.h @@ -513,6 +513,7 @@ public: HBC_RetCode dropAll(const char* pattern, bool async); HBC_RetCode copy(const char* currTblName, const char* oldTblName); ByteArrayList* listAll(const char* pattern); + ByteArrayList* getRegionStats(const char* tblName); static HBC_RetCode flushAllTablesStatic(); HBC_RetCode flushAllTables(); HBC_RetCode exists(const char* fileName); @@ -597,6 +598,7 @@ private: ,JM_DROP ,JM_DROP_ALL ,JM_LIST_ALL + ,JM_GET_REGION_STATS ,JM_COPY ,JM_EXISTS ,JM_FLUSHALL http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sql/exp/ExpHbaseInterface.cpp ---------------------------------------------------------------------- diff --git a/core/sql/exp/ExpHbaseInterface.cpp b/core/sql/exp/ExpHbaseInterface.cpp index 90a79dc..8a43330 100644 --- a/core/sql/exp/ExpHbaseInterface.cpp +++ b/core/sql/exp/ExpHbaseInterface.cpp @@ -1568,3 +1568,19 @@ Lng32 ExpHbaseInterface_JNI::getBlockCacheFraction(float& frac) retCode_ = client_->getBlockCacheFraction(frac); return retCode_; } + +ByteArrayList * ExpHbaseInterface_JNI::getRegionStats(const HbaseStr& tblName) +{ + if (client_ == NULL) + { + if (init(hbs_) != HBASE_ACCESS_SUCCESS) + return NULL; + } + + ByteArrayList* regionStats = client_->getRegionStats(tblName.val); + if (regionStats == NULL) + return NULL; + + return regionStats; +} + http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sql/exp/ExpHbaseInterface.h ---------------------------------------------------------------------- diff --git a/core/sql/exp/ExpHbaseInterface.h b/core/sql/exp/ExpHbaseInterface.h index 8647806..1bf50b5 100644 --- a/core/sql/exp/ExpHbaseInterface.h +++ b/core/sql/exp/ExpHbaseInterface.h @@ -380,6 +380,8 @@ class ExpHbaseInterface : public NABasicObject Int32 partns, ARRAY(const char *)& nodeNames) = 0; + // get regions and size + virtual ByteArrayList* getRegionStats(const HbaseStr& tblName) = 0; protected: enum @@ -679,6 +681,7 @@ virtual Lng32 initHFileParams(HbaseStr &tblName, Int32 partns, ARRAY(const char *)& nodeNames) ; + virtual ByteArrayList* getRegionStats(const HbaseStr& tblName); private: bool useTRex_; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sql/generator/GenRelExeUtil.cpp ---------------------------------------------------------------------- diff --git a/core/sql/generator/GenRelExeUtil.cpp b/core/sql/generator/GenRelExeUtil.cpp index ba307b2..fe4c757 100644 --- a/core/sql/generator/GenRelExeUtil.cpp +++ b/core/sql/generator/GenRelExeUtil.cpp @@ -3275,6 +3275,125 @@ short ExeUtilFastDelete::codeGen(Generator * generator) return 0; } +//////////////////////////////////////////////////////////////////// +// class ExeUtilRegionStats +//////////////////////////////////////////////////////////////////// +const char * ExeUtilRegionStats::getVirtualTableName() +{ return ("EXE_UTIL_REGION_STATS__"); } + +desc_struct *ExeUtilRegionStats::createVirtualTableDesc() +{ + desc_struct * table_desc = NULL; + if (displayFormat_) + table_desc = ExeUtilExpr::createVirtualTableDesc(); + else + table_desc = Generator::createVirtualTableDesc( + getVirtualTableName(), + ComTdbExeUtilRegionStats::getVirtTableNumCols(), + ComTdbExeUtilRegionStats::getVirtTableColumnInfo(), + ComTdbExeUtilRegionStats::getVirtTableNumKeys(), + ComTdbExeUtilRegionStats::getVirtTableKeyInfo()); + return table_desc; +} + +short ExeUtilRegionStats::codeGen(Generator * generator) +{ + ExpGenerator * expGen = generator->getExpGenerator(); + Space * space = generator->getSpace(); + + // allocate a map table for the retrieved columns + generator->appendAtEnd(); + + ex_cri_desc * givenDesc + = generator->getCriDesc(Generator::DOWN); + + ex_cri_desc * returnedDesc + = new(space) ex_cri_desc(givenDesc->noTuples() + 1, space); + + ex_cri_desc * workCriDesc = new(space) ex_cri_desc(4, space); + const int work_atp = 1; + const int exe_util_row_atp_index = 2; + + short rc = processOutputRow(generator, work_atp, exe_util_row_atp_index, + returnedDesc); + if (rc) + { + return -1; + } + + ex_expr * input_expr = 0; + ULng32 inputRowLen = 0; + + if (inputColList_) + { + ValueIdList inputVIDList; + ItemExpr * inputExpr = new(generator->wHeap()) + Cast(inputColList_, + new (generator->wHeap()) + SQLVarChar(inputColList_->getValueId().getType().getNominalSize(), + inputColList_->getValueId().getType().supportsSQLnull())); + + inputExpr->bindNode(generator->getBindWA()); + inputVIDList.insert(inputExpr->getValueId()); + + expGen-> + processValIdList(inputVIDList, + ExpTupleDesc::SQLARK_EXPLODED_FORMAT, + inputRowLen, + work_atp, + exe_util_row_atp_index + ); + + expGen-> + generateContiguousMoveExpr(inputVIDList, + 0, // don't add conv nodes + work_atp, + exe_util_row_atp_index, + ExpTupleDesc::SQLARK_EXPLODED_FORMAT, + inputRowLen, + &input_expr); + } + + char * tableName = space->AllocateAndCopyToAlignedSpace + (generator->genGetNameAsAnsiNAString(getTableName()), 0); + + ComTdbExeUtilRegionStats * exe_util_tdb = new(space) + ComTdbExeUtilRegionStats( + tableName, + input_expr, + inputRowLen, + workCriDesc, + exe_util_row_atp_index, + givenDesc, + returnedDesc, + (queue_index)64, + (queue_index)64, + 4, + 64000); + generator->initTdbFields(exe_util_tdb); + + exe_util_tdb->setIsIndex(isIndex_); + + exe_util_tdb->setDisplayFormat(displayFormat_); + + exe_util_tdb->setSummaryOnly(summaryOnly_); + + if(!generator->explainDisabled()) { + generator->setExplainTuple( + addExplainInfo(exe_util_tdb, 0, 0, generator)); + } + + generator->setCriDesc(givenDesc, Generator::DOWN); + generator->setCriDesc(returnedDesc, Generator::UP); + generator->setGenObj(this, exe_util_tdb); + + // users should not start a transaction. + generator->setTransactionFlag(0); + + return 0; +} + + // See ControlRunningQuery ///////////////////////////////////////////////////////// http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sql/optimizer/BindRelExpr.cpp ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/BindRelExpr.cpp b/core/sql/optimizer/BindRelExpr.cpp index 5832abe..963b609 100644 --- a/core/sql/optimizer/BindRelExpr.cpp +++ b/core/sql/optimizer/BindRelExpr.cpp @@ -1302,6 +1302,11 @@ desc_struct *generateSpecialDesc(const CorrName& corrName) StatisticsFunc sf; desc = sf.createVirtualTableDesc(); } + else if (corrName.getQualifiedNameObj().getObjectName() == ExeUtilRegionStats::getVirtualTableNameStr()) + { + ExeUtilRegionStats eudss; + desc = eudss.createVirtualTableDesc(); + } } return desc; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sql/optimizer/RelExeUtil.cpp ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/RelExeUtil.cpp b/core/sql/optimizer/RelExeUtil.cpp index 55a5210..6095050 100644 --- a/core/sql/optimizer/RelExeUtil.cpp +++ b/core/sql/optimizer/RelExeUtil.cpp @@ -410,6 +410,10 @@ const NAString ExeUtilExpr::getText() const result = "GET_QID"; break; + case REGION_STATS_: + result = "REGION_STATS"; + break; + default: result = "ADD_TO_EXEUTILEXPR::GETTEXT()"; @@ -3089,7 +3093,129 @@ RelExpr * ExeUtilAQR::copyTopNode(RelExpr *derivedNode, CollHeap* outHeap) return ExeUtilExpr::copyTopNode(result, outHeap); } -// See ControlRunningQuery +// ----------------------------------------------------------------------- +// Member functions for class ExeUtilRegionStats +// ----------------------------------------------------------------------- +ExeUtilRegionStats::ExeUtilRegionStats +(const CorrName &objectName, + NABoolean summaryOnly, + NABoolean isIndex, + NABoolean forDisplay, + RelExpr * child, + CollHeap *oHeap) + : ExeUtilExpr(REGION_STATS_, objectName, + NULL, child, NULL, CharInfo::UnknownCharSet, oHeap), + summaryOnly_(summaryOnly), + isIndex_(isIndex), + displayFormat_(forDisplay), + errorInParams_(FALSE), + inputColList_(NULL) +{ +} + +RelExpr * ExeUtilRegionStats::copyTopNode(RelExpr *derivedNode, CollHeap* outHeap) +{ + ExeUtilRegionStats *result; + + if (derivedNode == NULL) + result = new (outHeap) ExeUtilRegionStats(getTableName(), + summaryOnly_, isIndex_, + displayFormat_, + NULL, + outHeap); + else + result = (ExeUtilRegionStats *) derivedNode; + + result->errorInParams_ = errorInParams_; + + return ExeUtilExpr::copyTopNode(result, outHeap); +} + +// ----------------------------------------------------------------------- +// member functions for class ExeUtilRegionStats +// ----------------------------------------------------------------------- +RelExpr * ExeUtilRegionStats::bindNode(BindWA *bindWA) +{ + if (errorInParams_) + { + *CmpCommon::diags() << DgSqlCode(-4218) << DgString0("GET "); + + bindWA->setErrStatus(); + return this; + } + + if (nodeIsBound()) { + bindWA->getCurrentScope()->setRETDesc(getRETDesc()); + return this; + } + + if (getTableName().getQualifiedNameObj().getObjectName().isNull()) + { + *CmpCommon::diags() << DgSqlCode(-4218) << DgString0("REGION STATS"); + + bindWA->setErrStatus(); + return this; + } + + if (! child(0)) + { + NATable * naTable = bindWA->getNATable(getTableName()); + if ((!naTable) || (bindWA->errStatus())) + return this; + } + + RelExpr * childExpr = NULL; + + if (getArity() > 0) + { + childExpr = child(0)->bindNode(bindWA); + if (bindWA->errStatus()) + return NULL; + + if ((childExpr->getRETDesc() == NULL) || + (childExpr->getRETDesc()->getDegree() > 1) || + (childExpr->getRETDesc()->getType(0).getTypeQualifier() != NA_CHARACTER_TYPE)) + { + *CmpCommon::diags() << DgSqlCode(-4218) << DgString0("REGION STATS "); + + bindWA->setErrStatus(); + return this; + } + + inputColList_ = childExpr->getRETDesc()->getValueId(0).getItemExpr(); + + setChild(0, NULL); + } + + RelExpr * boundExpr = ExeUtilExpr::bindNode(bindWA); + if (bindWA->errStatus()) + return NULL; + + if (childExpr) + { + RelExpr * re = new(PARSERHEAP()) Join + (childExpr, boundExpr, REL_TSJ_FLOW, NULL); + ((Join*)re)->doNotTransformToTSJ(); + ((Join*)re)->setTSJForWrite(TRUE); + + boundExpr = re->bindNode(bindWA); + if (bindWA->errStatus()) + return NULL; + } + + return boundExpr; +} + +void ExeUtilRegionStats::recomputeOuterReferences() +{ + if (inputColList_) + { + ValueIdSet outerRefs = getGroupAttr()->getCharacteristicInputs(); + outerRefs += inputColList_->getValueId(); + + getGroupAttr()->setCharacteristicInputs(outerRefs); + } +} // ExeUtilRegionStats::recomputeOuterReferences() // ----------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sql/optimizer/RelExeUtil.h ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/RelExeUtil.h b/core/sql/optimizer/RelExeUtil.h index 7a3e976..404797b 100644 --- a/core/sql/optimizer/RelExeUtil.h +++ b/core/sql/optimizer/RelExeUtil.h @@ -87,6 +87,10 @@ public: stmtText_ = NULL; }; + GenericUtilExpr(OperatorTypeEnum otype) + : RelExpr(otype, NULL, NULL, NULL) + {}; + virtual RelExpr * bindNode(BindWA *bindWAPtr); // method to do code generation @@ -491,6 +495,7 @@ public: GET_METADATA_INFO_ = 12, GET_VERSION_INFO_ = 13, SUSPEND_ACTIVATE_ = 14, + REGION_STATS_ = 15, SHOWSET_DEFAULTS_ = 18, AQR_ = 19, DISPLAY_EXPLAIN_COMPLEX_ = 20, @@ -527,6 +532,9 @@ public: { }; + ExeUtilExpr() + : GenericUtilExpr(REL_EXE_UTIL) {}; + virtual RelExpr * copyTopNode(RelExpr *derivedNode = NULL, CollHeap* outHeap = 0); virtual const NAString getText() const; @@ -1656,6 +1664,58 @@ private: AQRTask task_; }; +class ExeUtilRegionStats : public ExeUtilExpr +{ +public: + + ExeUtilRegionStats(const CorrName &objectName, + NABoolean summaryOnly, + NABoolean isIndex, + NABoolean forDisplay, + RelExpr * child = NULL, + CollHeap *oHeap = CmpCommon::statementHeap()); + + ExeUtilRegionStats(): + summaryOnly_(FALSE), + isIndex_(FALSE), + displayFormat_(FALSE) + {} + + virtual RelExpr * bindNode(BindWA *bindWAPtr); + + // a method used for recomputing the outer references (external dataflow + // input values) that are needed by this operator. + virtual void recomputeOuterReferences(); + + virtual RelExpr * copyTopNode(RelExpr *derivedNode = NULL, + CollHeap* outHeap = 0); + + // method to do code generation + virtual short codeGen(Generator*); + + virtual const char *getVirtualTableName(); + static const char * getVirtualTableNameStr() + { return "EXE_UTIL_REGION_STATS__";} + virtual desc_struct *createVirtualTableDesc(); + + virtual NABoolean producesOutput() { return TRUE; } + + virtual int getArity() const { return ((child(0) == NULL) ? 0 : 1); } + + virtual NABoolean aqrSupported() { return TRUE; } + +private: + ItemExpr * inputColList_; + + NABoolean summaryOnly_; + + NABoolean isIndex_; + + NABoolean displayFormat_; + + NABoolean errorInParams_; +}; + class ExeUtilLongRunning : public ExeUtilExpr { public: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sql/parser/ParKeyWords.cpp ---------------------------------------------------------------------- diff --git a/core/sql/parser/ParKeyWords.cpp b/core/sql/parser/ParKeyWords.cpp index 9824f70..8c467ed 100644 --- a/core/sql/parser/ParKeyWords.cpp +++ b/core/sql/parser/ParKeyWords.cpp @@ -858,6 +858,7 @@ ParKeyWord ParKeyWords::keyWords_[] = { ParKeyWord("REFERENCES", TOK_REFERENCES, ANS_|RESWORD_), ParKeyWord("REFERENCING", TOK_REFERENCING, ANS_|RESWORD_|NONRESTOKEN_), ParKeyWord("REFRESH", TOK_REFRESH, FLAGSNONE_), + ParKeyWord("REGION", TOK_REGION, NONRESTOKEN_), ParKeyWord("REGISTER", TOK_REGISTER, NONRESTOKEN_), ParKeyWord("REINITIALIZE", TOK_REINITIALIZE, FIRST_|NONRESTOKEN_), ParKeyWord("RELATED", TOK_RELATED, NONRESTOKEN_), @@ -1030,6 +1031,7 @@ ParKeyWord ParKeyWords::keyWords_[] = { ParKeyWord("STATEMENT", TOK_STATEMENT, NONRESTOKEN_), ParKeyWord("STATIC", TOK_STATIC, NONRESTOKEN_), ParKeyWord("STATISTICS", TOK_STATISTICS, SECOND_|NONRESTOKEN_), + ParKeyWord("STATS", TOK_STATS, NONRESTOKEN_), ParKeyWord("STATUS", TOK_STATUS, NONRESTOKEN_), ParKeyWord("STDDEV", TOK_STDDEV, NONRESTOKEN_), ParKeyWord("STOP", TOK_STOP, NONRESTOKEN_), http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/51698645/core/sql/parser/sqlparser.y ---------------------------------------------------------------------- diff --git a/core/sql/parser/sqlparser.y b/core/sql/parser/sqlparser.y index e7166cf..671d0c1 100755 --- a/core/sql/parser/sqlparser.y +++ b/core/sql/parser/sqlparser.y @@ -1353,6 +1353,7 @@ static void enableMakeQuotedStringISO88591Mechanism() %token <tokval> TOK_RANGELOG /* MV */ %token <tokval> TOK_REBUILD %token <tokval> TOK_REFERENCES +%token <tokval> TOK_REGION %token <tokval> TOK_REGISTER /* Tandem extension */ %token <tokval> TOK_UNREGISTER /* Tandem extension */ %token <tokval> TOK_RENAME /* Tandem extension */ @@ -1368,6 +1369,7 @@ static void enableMakeQuotedStringISO88591Mechanism() %token <tokval> TOK_STORE /* Tandem extension */ %token <tokval> TOK_STORAGE %token <tokval> TOK_STATISTICS /* Tandem extension non-reserved word */ +%token <tokval> TOK_STATS %token <tokval> TOK_UNBOUNDED /* Tandem extension */ %token <tokval> TOK_VIEW %token <tokval> TOK_VIEWS @@ -2780,6 +2782,7 @@ static void enableMakeQuotedStringISO88591Mechanism() %type <relx> exe_util_maintain_object %type <relx> exe_util_cleanup_volatile_tables %type <relx> exe_util_aqr +%type <relx> exe_util_get_region_access_stats %type <aqrOptionsList> aqr_options_list %type <aqrOption> aqr_option %type <uint> aqr_task @@ -5942,7 +5945,9 @@ TOK_TABLE '(' TOK_INTERNALSP '(' character_string_literal ')' ')' , $5 , REL_INTERNALSP , PARSERHEAP() - , RelInternalSP::executeInSameArkcmp | RelInternalSP::suppressDefaultSchema | RelInternalSP::requiresTMFTransaction); + , RelInternalSP::executeInSameArkcmp | + RelInternalSP::suppressDefaultSchema | + RelInternalSP::requiresTMFTransaction); } | TOK_TABLE '(' TOK_RELATEDNESS '(' value_expression_list ')' ')' { @@ -5950,7 +5955,9 @@ TOK_TABLE '(' TOK_INTERNALSP '(' character_string_literal ')' ')' , $5 , REL_INTERNALSP , PARSERHEAP() - , RelInternalSP::executeInSameArkcmp | RelInternalSP::suppressDefaultSchema | RelInternalSP::requiresTMFTransaction); + , RelInternalSP::executeInSameArkcmp | + RelInternalSP::suppressDefaultSchema | + RelInternalSP::requiresTMFTransaction); } | TOK_TABLE '(' TOK_FEATURE_VERSION_INFO '(' value_expression_list ')' ')' { @@ -5958,7 +5965,9 @@ TOK_TABLE '(' TOK_INTERNALSP '(' character_string_literal ')' ')' , $5 , REL_INTERNALSP , PARSERHEAP() - , RelInternalSP::executeInSameArkcmp | RelInternalSP::suppressDefaultSchema | RelInternalSP::requiresTMFTransaction); + , RelInternalSP::executeInSameArkcmp | + RelInternalSP::suppressDefaultSchema | + RelInternalSP::requiresTMFTransaction); } | sp_proxy_stmt_prefix '(' proxy_columns ')' ')' { @@ -5996,8 +6005,30 @@ TOK_TABLE '(' TOK_INTERNALSP '(' character_string_literal ')' ')' (handle, ExeUtilLobExtract::TO_STRING_, NULL, NULL, 0, 0); - } + $$ = lle; + } +| TOK_TABLE '(' TOK_REGION TOK_STATS '(' ')' ')' + { + $$ = new (PARSERHEAP()) + ExeUtilRegionStats(CorrName(""), FALSE, FALSE, FALSE, NULL, PARSERHEAP()); + } +| TOK_TABLE '(' TOK_REGION TOK_STATS '(' table_name ')' ')' + { + $$ = new (PARSERHEAP()) + ExeUtilRegionStats(*$6, FALSE, FALSE, FALSE, NULL, PARSERHEAP()); + } +| TOK_TABLE '(' TOK_REGION TOK_STATS '(' TOK_INDEX table_name ')' ')' + { + $7->setSpecialType(ExtendedQualName::INDEX_TABLE); + $$ = new (PARSERHEAP()) + ExeUtilRegionStats(*$7, FALSE, TRUE, FALSE, NULL, PARSERHEAP()); + } +| TOK_TABLE '(' TOK_REGION TOK_STATS '(' TOK_USING rel_subquery ')' ')' + { + $$ = new (PARSERHEAP()) + ExeUtilRegionStats(CorrName("DUMMY"), FALSE, FALSE, FALSE, $7, PARSERHEAP()); + } hivemd_identifier : TOK_ALIAS { $$ = new (PARSERHEAP()) NAString("ALIAS"); } @@ -14503,6 +14534,11 @@ interactive_query_expression: { $$ = finalize($1); } + | exe_util_get_region_access_stats + { + $$ = finalize($1); + } + | TOK_SELECT TOK_UUID '(' ')' { NAString * v = new (PARSERHEAP()) NAString("1"); @@ -16174,6 +16210,43 @@ exe_util_init_hbase : TOK_INITIALIZE TOK_TRAFODION $$ = de; } +/* type relx */ +exe_util_get_region_access_stats : TOK_GET TOK_REGION TOK_STATS TOK_FOR TOK_TABLE table_name + { + $$ = new (PARSERHEAP()) + ExeUtilRegionStats(*$6, FALSE, FALSE, TRUE, NULL, PARSERHEAP()); + } + | TOK_GET TOK_REGION TOK_STATS TOK_FOR TOK_INDEX table_name + { + $6->setSpecialType(ExtendedQualName::INDEX_TABLE); + + $$ = new (PARSERHEAP()) + ExeUtilRegionStats(*$6, FALSE, TRUE, TRUE, NULL, PARSERHEAP()); + } + | TOK_GET TOK_REGION TOK_STATS TOK_FOR rel_subquery + { + $$ = new (PARSERHEAP()) + ExeUtilRegionStats( + CorrName("DUMMY"), FALSE, TRUE, TRUE, $5, PARSERHEAP()); + } + | TOK_GET TOK_REGION TOK_STATS TOK_FOR TOK_TABLE table_name ',' TOK_SUMMARY + { + $$ = new (PARSERHEAP()) + ExeUtilRegionStats(*$6, TRUE, FALSE, TRUE, NULL, PARSERHEAP()); + } + | TOK_GET TOK_REGION TOK_STATS TOK_FOR TOK_INDEX table_name ',' TOK_SUMMARY + { + $6->setSpecialType(ExtendedQualName::INDEX_TABLE); + + $$ = new (PARSERHEAP()) + ExeUtilRegionStats(*$6, TRUE, TRUE, TRUE, NULL, PARSERHEAP()); + } + | TOK_GET TOK_REGION TOK_STATS TOK_FOR rel_subquery ',' TOK_SUMMARY + { + $$ = new (PARSERHEAP()) + ExeUtilRegionStats( + CorrName("DUMMY"), TRUE, TRUE, TRUE, $5, PARSERHEAP()); + } /* * The purpose of dummy_token_lookahead is to force the lexer to look @@ -22155,19 +22228,26 @@ show_statement: $2->getOperatorType() == REL_EXE_UTIL || $2->getOperatorType() == REL_SCAN) { - if ($2->getOperatorType() != REL_SCAN) - { + if ($2->getOperatorType() == REL_EXE_UTIL) + { c = new(PARSERHEAP()) - CorrName(((TableValuedFunction *)$2)-> + CorrName(((ExeUtilExpr *)$2)-> getVirtualTableName()); - c->setSpecialType(ExtendedQualName::VIRTUAL_TABLE); - } - else + c->setSpecialType(ExtendedQualName::VIRTUAL_TABLE); + } + else if ($2->getOperatorType() == REL_SCAN) { Scan* ha = (Scan*)$2; c = new(PARSERHEAP()) CorrName(ha->getTableName()); } + else + { + c = new(PARSERHEAP()) + CorrName(((TableValuedFunction *)$2)-> + getVirtualTableName()); + c->setSpecialType(ExtendedQualName::VIRTUAL_TABLE); + } $$ = new (PARSERHEAP()) RelRoot(new (PARSERHEAP()) @@ -32853,6 +32933,7 @@ nonreserved_word : TOK_ABORT | TOK_RECOVER | TOK_RECOVERY | TOK_REFRESH // MV + | TOK_REGION | TOK_REGISTER | TOK_REINITIALIZE | TOK_RELATED @@ -32922,6 +33003,7 @@ nonreserved_word : TOK_ABORT | TOK_STATEMENT | TOK_STATIC | TOK_STATISTICS + | TOK_STATS | TOK_STATUS | TOK_STORAGE | TOK_STORE
