You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by sa...@apache.org on 2015/12/03 20:51:35 UTC

[2/9] incubator-trafodion git commit: JIRA Trafodion-1645 SQL commands to retrieve region stats.

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 <ce...@ansharma-1.novalocal>
Authored: Wed Nov 25 20:28:24 2015 +0000
Committer: Cloud User <ce...@ansharma-1.novalocal>
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