You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by db...@apache.org on 2016/10/19 21:45:01 UTC

[2/3] incubator-trafodion git commit: [TRAFODION-2282][TRAFODION-882] New scheme to invalidate histogram cache

[TRAFODION-2282][TRAFODION-882] New scheme to invalidate histogram cache


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/9a3cf2e5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/9a3cf2e5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/9a3cf2e5

Branch: refs/heads/master
Commit: 9a3cf2e53af6d9df7c8ec03665f5da5a0ebf8ab0
Parents: 196e6f4
Author: Dave Birdsall <db...@apache.org>
Authored: Wed Oct 19 16:49:51 2016 +0000
Committer: Dave Birdsall <db...@apache.org>
Committed: Wed Oct 19 16:49:51 2016 +0000

----------------------------------------------------------------------
 core/sql/common/ComDistribution.cpp         |   3 +-
 core/sql/common/ComSecurityKey.cpp          |   4 +-
 core/sql/common/ComSecurityKey.h            |   2 +-
 core/sql/common/ComSmallDefs.h              |   2 +
 core/sql/optimizer/NATable.cpp              | 230 ++++++------------
 core/sql/optimizer/NATable.h                | 175 +++++++-------
 core/sql/optimizer/opt.cpp                  |  21 +-
 core/sql/optimizer/opt.h                    |  16 +-
 core/sql/regress/compGeneral/EXPECTED011.SB |   8 +-
 core/sql/regress/compGeneral/EXPECTED015.SB | 292 ++++++++++++-----------
 core/sql/regress/compGeneral/EXPECTED042    |  83 +++++--
 core/sql/regress/core/EXPECTED005.SB        |   4 +-
 core/sql/regress/hive/EXPECTED018           | 228 ++++++++++--------
 core/sql/regress/seabase/EXPECTED011        |  20 +-
 core/sql/regress/seabase/EXPECTED013        | 144 +++++------
 core/sql/runtimestats/SqlStats.cpp          |   5 +-
 core/sql/runtimestats/sscpipc.cpp           |   7 +-
 core/sql/runtimestats/ssmpipc.cpp           |   3 +
 core/sql/sqlcomp/CmpMain.cpp                |   9 +
 core/sql/sqlcomp/CmpMain.h                  |   2 +
 core/sql/sqlcomp/CmpSeabaseDDL.h            |   2 +
 core/sql/sqlcomp/CmpSeabaseDDLtable.cpp     |   9 +
 core/sql/sqlcomp/DefaultConstants.h         |   7 -
 core/sql/sqlcomp/QCache.cpp                 |  24 +-
 core/sql/sqlcomp/nadefaults.cpp             |  18 --
 core/sql/ustat/hs_globals.cpp               |   6 +
 core/sql/ustat/hs_read.cpp                  |  44 ----
 core/sql/ustat/hs_read.h                    |  32 ---
 28 files changed, 671 insertions(+), 729 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/9a3cf2e5/core/sql/common/ComDistribution.cpp
----------------------------------------------------------------------
diff --git a/core/sql/common/ComDistribution.cpp b/core/sql/common/ComDistribution.cpp
index 82fdb83..1fec747 100644
--- a/core/sql/common/ComDistribution.cpp
+++ b/core/sql/common/ComDistribution.cpp
@@ -314,8 +314,9 @@ const literalAndEnumStruct qiTypeConversionTable [] =
   {COM_QI_SCHEMA_REFERENCES, COM_QI_SCHEMA_REFERENCES_LIT},
   {COM_QI_OBJECT_EXECUTE, COM_QI_OBJECT_EXECUTE_LIT},
   {COM_QI_SCHEMA_EXECUTE, COM_QI_SCHEMA_EXECUTE_LIT},
+  {COM_QI_USER_GRANT_SPECIAL_ROLE, COM_QI_USER_GRANT_SPECIAL_ROLE_LIT},
   {COM_QI_OBJECT_REDEF, COM_QI_OBJECT_REDEF_LIT},
-  {COM_QI_USER_GRANT_SPECIAL_ROLE, COM_QI_USER_GRANT_SPECIAL_ROLE_LIT}
+  {COM_QI_STATS_UPDATED, COM_QI_STATS_UPDATED_LIT}
 };
 
 //----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/9a3cf2e5/core/sql/common/ComSecurityKey.cpp
----------------------------------------------------------------------
diff --git a/core/sql/common/ComSecurityKey.cpp b/core/sql/common/ComSecurityKey.cpp
index 978a257..ae43920 100644
--- a/core/sql/common/ComSecurityKey.cpp
+++ b/core/sql/common/ComSecurityKey.cpp
@@ -49,7 +49,7 @@
 NABoolean qiCheckForInvalidObject (const Int32 numInvalidationKeys,
                                    const SQL_QIKEY* invalidationKeys,
                                    const Int64 objectUID,
-                                   const ComSecurityKeySet objectKeys)
+                                   const ComSecurityKeySet & objectKeys)
 {
   NABoolean found = FALSE;
   ComQIActionType invalidationKeyType = COM_QI_INVALID_ACTIONTYPE;
@@ -65,6 +65,8 @@ NABoolean qiCheckForInvalidObject (const Int32 numInvalidationKeys,
     {
       // Indicates that the DDL of the object has changed. 
       case COM_QI_OBJECT_REDEF:
+      // Indicates that the histogram statistics of the object has changed.
+      case COM_QI_STATS_UPDATED:
       {
         if (invalidationKeys[i].ddlObjectUID == objectUID)
           found = TRUE;

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/9a3cf2e5/core/sql/common/ComSecurityKey.h
----------------------------------------------------------------------
diff --git a/core/sql/common/ComSecurityKey.h b/core/sql/common/ComSecurityKey.h
index fbf60f3..42a5d01 100644
--- a/core/sql/common/ComSecurityKey.h
+++ b/core/sql/common/ComSecurityKey.h
@@ -40,7 +40,7 @@ typedef NASet<ComSecurityKey>  ComSecurityKeySet;
 NABoolean qiCheckForInvalidObject (const Int32 numInvalidationKeys, 
                                    const SQL_QIKEY* invalidationKeys, 
                                    const Int64 objectUID,
-                                   const ComSecurityKeySet objectKeys);
+                                   const ComSecurityKeySet & objectKeys);
 
 bool buildSecurityKeys( const int32_t granteeID,
                         const int32_t roleID,

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/9a3cf2e5/core/sql/common/ComSmallDefs.h
----------------------------------------------------------------------
diff --git a/core/sql/common/ComSmallDefs.h b/core/sql/common/ComSmallDefs.h
index 66420eb..981ee5e 100644
--- a/core/sql/common/ComSmallDefs.h
+++ b/core/sql/common/ComSmallDefs.h
@@ -1267,6 +1267,7 @@ enum ComQIActionType { COM_QI_INVALID_ACTIONTYPE = 0
                      , COM_QI_SCHEMA_EXECUTE
                      , COM_QI_USER_GRANT_SPECIAL_ROLE
                      , COM_QI_OBJECT_REDEF
+                     , COM_QI_STATS_UPDATED
                      } ;
 
 #define COM_QI_INVALID_ACTIONTYPE_LIT  "  "
@@ -1288,6 +1289,7 @@ enum ComQIActionType { COM_QI_INVALID_ACTIONTYPE = 0
 #define COM_QI_SCHEMA_EXECUTE_LIT      "SE"
 #define COM_QI_USER_GRANT_SPECIAL_ROLE_LIT     "UZ"
 #define COM_QI_OBJECT_REDEF_LIT        "OR"
+#define COM_QI_STATS_UPDATED_LIT       "US"
 
 
 

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/9a3cf2e5/core/sql/optimizer/NATable.cpp
----------------------------------------------------------------------
diff --git a/core/sql/optimizer/NATable.cpp b/core/sql/optimizer/NATable.cpp
index 67ebadd..c03b4ae 100644
--- a/core/sql/optimizer/NATable.cpp
+++ b/core/sql/optimizer/NATable.cpp
@@ -197,6 +197,7 @@ ULng32 qualNameHashFunc(const QualifiedName& qualName)
 //-------------------------------------------------------------------------
 HistogramCache::HistogramCache(NAMemory * heap,Lng32 initSize)
 : heap_(heap),
+  lastTouchTime_(getCurrentTime()),
   hits_(0),
   lookups_(0),
   memoryLimit_(33554432),
@@ -231,6 +232,7 @@ void HistogramCache::invalidateCache()
   }
   histogramsCache_->clearAndDestroy();
   lruQ_.clear();
+  lastTouchTime_ = getCurrentTime();
 }
 
 //--------------------------------------------------------------------------
@@ -250,6 +252,15 @@ void HistogramCache::getHistograms(NATable& table)
   StatsList& colStatsList = *(table.getColStats());
   const Int64& redefTime = table.getRedefTime();
   Int64& statsTime = const_cast<Int64&>(table.getStatsTime());
+  Int64 tableUID = table.objectUid().castToInt64();
+  Int64 siKeyGCinterval = CURRSTMT_OPTDEFAULTS->siKeyGCinterval();
+
+  // Fail safe logic: Make sure that we haven't been idle longer than
+  // the RMS security invalidation garbage collection logic. If we have,
+  // it is possible that an invalidation key for stats has been missed.
+  // So to be safe, we invalidate the whole cache.
+  if (getCurrentTime() > lastTouchTime_ + siKeyGCinterval)
+    invalidateCache();
 
   //1//
   //This 'flag' is set to NULL if FetchHistogram has to be called to
@@ -260,10 +271,6 @@ void HistogramCache::getHistograms(NATable& table)
   //Pointer to cache entry for histograms on this table
   HistogramsCacheEntry * cachedHistograms = NULL;
 
-  // skip reading the histograms if they have not been changed in last
-  // CACHE_HISTOGRAMS_REFRESH_INTERVAL hours
-  NABoolean skipRead = FALSE;
-
   //Do we need to use the cache
   //Depends on :
   //1. If histogram caching is ON
@@ -275,75 +282,28 @@ void HistogramCache::getHistograms(NATable& table)
     // look up the cache and get a reference to statistics for this table
     cachedHistograms = lookUp(table);
 
-    // first thing to check is, if the table to which the histograms are cached
-    // has been updated
+    // (Possibly useless) sanity tests
+
+    // Check to see if the redefinition timestamp has changed. This seems
+    // to be always stubbed to zero today on Trafodion, so this check
+    // seems to never fail.
 
     if (cachedHistograms && (cachedHistograms->getRedefTime() != redefTime))
     {
       deCache(&cachedHistograms);
     }
-    // If the histograms exist in the cache, then we want to avoid reading
-    // timestamps, if the histograms have not been updated in last default
-    // refresh time (CACHE_HISTOGRAMS_REFRESH_INTERVAL) or if the histograms in the cache
-    // are less than CACHE_HISTOGRAMS_REFRESH_INTERVAL old.
 
-    Int64 lastRefTimeDef, lastFakeRefTimeDef, currentTime;
-    if (cachedHistograms)
-    {
-      lastRefTimeDef = uint32ToInt64(CURRSTMT_OPTDEFAULTS->defRefTime());
-      lastFakeRefTimeDef = uint32ToInt64(CURRSTMT_OPTDEFAULTS->defFakeRefTime());
+    // Check to see if the table's objectUID has changed (indicating that
+    // it has been dropped and recreated). This test shouldn't fail, because
+    // a drop should have caused the NATable object to be invalidated via
+    // the query invalidation infrastructure which should have already caused
+    // the histograms to be decached.
 
-      currentTime = getCurrentTime();
-
-      Int64 histLastRefreshedTime = cachedHistograms->getRefreshTime();
-
-      if (currentTime && cachedHistograms->isAllStatsFake())
-      {
-        // Check if it has been more than 'lastFakeRefTimeDef' secs 
-        // (equal to CQD HIST_NO_STATS_REFRESH_INTERVAL) since histograms have
-        // been checked OR if update statistics automation is ON and it has
-        // been more than 'lastFakeRefTimeDef'/360 (should = 10 by default).
-        Int64 timeSinceLastHistRefresh = currentTime - histLastRefreshedTime;
-        if(!CURRSTMT_OPTDEFAULTS->ustatAutomation() && timeSinceLastHistRefresh > lastFakeRefTimeDef ||
-            CURRSTMT_OPTDEFAULTS->ustatAutomation() && timeSinceLastHistRefresh > lastFakeRefTimeDef/360)
-        {
-          //the histograms are in the cache but we need to re-read them because
-          //their default values might have been re-estimated
-          deCache(&cachedHistograms);
-        }
-      }
-
-      // Histograms are not fake. Check to see if we need to do anymore timestamp checks
-
-      if (currentTime && cachedHistograms && lastRefTimeDef > 0)
-      {
-        Int64 lastUpdateStatsTime = HistogramsCacheEntry::getLastUpdateStatsTime();
-
-        if ((lastUpdateStatsTime != -1) && 
-            ((currentTime - lastUpdateStatsTime) < lastRefTimeDef))
-        {
-          // Last known update stats time for this table occurred less than
-          // CACHE_HISTOGRAMS_REFRESH_INTERVAL secs ago.
-          if (lastUpdateStatsTime < histLastRefreshedTime)
-          {
-            // Last time the histograms cache was refreshed for this table is newer
-            // than last known update stats time.  Skip read of hists.
-            skipRead = TRUE;
-          }
-        }
-        else
-          // No update stats time recorded OR last known update stats time occurred
-          // more than CACHE_HISTOGRAMS_REFRESH_INTERVAL secs ago.
-          if ((currentTime - histLastRefreshedTime) < lastRefTimeDef)
-            // Histograms were refreshed less than CACHE_REFRESH_HISTOGRAMS_INTERVAL
-            // secs ago.  Skip read of hists.
-            skipRead = TRUE;
-      }
+    if (cachedHistograms && (cachedHistograms->getTableUID() != tableUID))
+    {
+      deCache(&cachedHistograms);
     }
 
-    //assumption:
-    //if tempHist is not NULL then it should have a pointer to full Histograms
-
     //check if histogram preFetching is on
     if(CURRSTMT_OPTDEFAULTS->preFetchHistograms() && cachedHistograms)
     { //3//
@@ -354,77 +314,28 @@ void HistogramCache::getHistograms(NATable& table)
         //were not preFetched so delete them and
         //re-Read them
         deCache(&cachedHistograms);
-      } //4//
+     } //4//
     } //3//
+  } //2//
 
-    //Check if there is a timestamp mis-match
-    if(cachedHistograms AND cachedHistograms->getRedefTime() != redefTime)
-    { //5//
-       //the histograms are in the cache but we need to re-read them because of
-       //a time stamp mismatch
-       deCache(&cachedHistograms);
-    } //5//
-    else if (!skipRead)
-      { //6//
-        //Do some more timestamp calculations and set re-Read flag if
-        //there is a mis-match
-        if(cachedHistograms)
-        { //9 //
-          // Check when the histogram table was last modified.  If this time doesn't equal
-          // the modification time of the cached histograms, OR this time is more than
-          // lastRefTimeDef secs old, call FetchStatsTime to read STATS_TIME field of
-          // the actual histogram.  The last condition here is used to force a call of
-          // FetchStatsTime() after awhile.  This is for update stats automation:
-          // FetchStatsTime() will update the READ_TIME field of the histogram.
-          Int64 modifTime;
-          Int64 currentJulianTime = NA_JulianTimestamp();
-          GetHSModifyTime(qualifiedName, type, modifTime, FALSE);
-          Int64 readCntInterval = (Int64)CmpCommon::getDefaultLong(USTAT_AUTO_READTIME_UPDATE_INTERVAL);
-          if (modifTime != 0)
-            // If the HISTOGRAMS table was modified since the last time FetchStatsTime()
-            // called and the time is not the same as the cached histograms OR
-            // if it was modified more than READTIME_UPDATE_INTERVAL secs ago and
-            // ustat automation is ON:
-            if (cachedHistograms->getModifTime() != modifTime ||
-                (currentJulianTime - modifTime > readCntInterval*1000000 &&
-                 CmpCommon::getDefaultLong(USTAT_AUTOMATION_INTERVAL) > 0))
-          { //10//
-            FetchStatsTime(qualifiedName,type,colArray,statsTime,FALSE);
-            cachedHistograms->updateRefreshTime();
-            // If ustat automation is on, FetchStatsTime will modify the HISTOGRAMS table.
-            // So, the new modification time of the HISTOGRAMS table must be saved to the
-            // cached histograms when automation is on, so that only changes to HISTOGRAMS 
-            // by update stats cause the above 'if' to be TRUE.
-            if (CmpCommon::getDefaultLong(USTAT_AUTOMATION_INTERVAL) > 0)
-            {
-              GetHSModifyTime(qualifiedName, type, modifTime, FALSE);
-              cachedHistograms->setModifTime(modifTime);
-            }
+  if( cachedHistograms )
+  {
+    hits_++;
+  }
+  else
+  {
+    lookups_++;
+  }
 
-            if (cachedHistograms->getStatsTime() != statsTime)
-            { //11//
-              deCache(&cachedHistograms);
-            } //11//
-          } //10//
-        } //9//
-      } //6//
-    } //2//
+  //retrieve the statistics for the table in colStatsList
+  createColStatsList(table, cachedHistograms);
 
-    if( cachedHistograms )
-    {
-      hits_++;
-    }
-    else
-    {
-      lookups_++;
-    }
+  //if not using histogram cache, then invalidate cache
+  if(!CURRSTMT_OPTDEFAULTS->cacheHistograms())
+    invalidateCache();
 
-    //retrieve the statistics for the table in colStatsList
-    createColStatsList(table, cachedHistograms);
+  lastTouchTime_ = getCurrentTime();
 
-    //if not using histogram cache, then invalidate cache
-    if(!CURRSTMT_OPTDEFAULTS->cacheHistograms())
-      invalidateCache();
 } //1//
 #pragma warn(770)  // warning elimination
   
@@ -523,8 +434,6 @@ void HistogramCache::createColStatsList
       (colStatsList, colArray, cachedHistograms, singleColsFound);
    }
 
-  Int64 modifTime = 0;
-
   // set to TRUE if all columns in the table have default statistics
   NABoolean allFakeStats = TRUE;
 
@@ -586,7 +495,6 @@ void HistogramCache::createColStatsList
                     (*statsListForFetch),
                      FALSE,
                     CmpCommon::statementHeap(),
-                    modifTime,
                     statsTime,
                     allFakeStats,//set to TRUE if all columns have default stats
                     preFetch,
@@ -635,7 +543,8 @@ void HistogramCache::createColStatsList
   
         // put the re-read histograms into cache
         putStatsListIntoCache((*statsListForFetch), colArray, qualifiedName,
-                             modifTime, statsTime, redefTime, allFakeStats);
+                             table.objectUid().castToInt64(),
+                             statsTime, redefTime, allFakeStats);
   
         // look up the cache and get a reference to statistics for this table
         cachedHistograms = lookUp(table);
@@ -775,7 +684,7 @@ Int32 HistogramCache::getStatsListFromCache
 void HistogramCache::putStatsListIntoCache(StatsList & colStatsList,
                                           const NAColumnArray& colArray,
                                           const QualifiedName & qualifiedName,
-                                          Int64 modifTime,
+                                          Int64 tableUID,
                                           Int64 statsTime,
                                           const Int64 & redefTime,
 					  NABoolean allFakeStats)
@@ -783,8 +692,8 @@ void HistogramCache::putStatsListIntoCache(StatsList & colStatsList,
   ULng32 histCacheHeapSize = heap_->getAllocSize();
   // create memory efficient representation of colStatsList
   HistogramsCacheEntry * histogramsForCache = new (heap_) 
-    HistogramsCacheEntry(colStatsList, qualifiedName, 
-                         modifTime, statsTime, redefTime, heap_);
+    HistogramsCacheEntry(colStatsList, qualifiedName, tableUID,
+                         statsTime, redefTime, heap_);
   ULng32 cacheEntrySize = heap_->getAllocSize() - histCacheHeapSize;
 
   if(CmpCommon::getDefault(CACHE_HISTOGRAMS_CHECK_FOR_LEAKS) == DF_ON)
@@ -793,19 +702,12 @@ void HistogramCache::putStatsListIntoCache(StatsList & colStatsList,
     ULng32 histCacheHeapSize2 = heap_->getAllocSize();
     CMPASSERT( histCacheHeapSize == histCacheHeapSize2);
     histogramsForCache = new (heap_) 
-      HistogramsCacheEntry(colStatsList, qualifiedName, 
-                           modifTime, statsTime, redefTime, heap_);
+      HistogramsCacheEntry(colStatsList, qualifiedName, tableUID, 
+                           statsTime, redefTime, heap_);
     cacheEntrySize = heap_->getAllocSize() - histCacheHeapSize2;
   }
   histogramsForCache->setSize(cacheEntrySize);
 
-  if(FALSE)
-  {
-    delete histogramsForCache;
-    histogramsForCache = new (heap_) 
-    HistogramsCacheEntry(colStatsList, qualifiedName, 
-                         modifTime, statsTime, redefTime, heap_);
-  }
   // add it to the cache 
   QualifiedName* key = const_cast<QualifiedName*>
     (histogramsForCache->getName());
@@ -971,22 +873,44 @@ void HistogramCache::monitor() const
   }
 }
 
+void HistogramCache::freeInvalidEntries(Int32 numKeys,
+                                        SQL_QIKEY * qiKeyArray)
+{
+  // an empty set for qiCheckForInvalidObject call
+  ComSecurityKeySet dummy(CmpCommon::statementHeap());
+  // create an iterator that will iterate over the whole cache
+  NAHashDictionaryIterator<QualifiedName, HistogramsCacheEntry> it(*histogramsCache_);
+  QualifiedName * qn = NULL;
+  HistogramsCacheEntry * entry = NULL;
+  
+  for (int i = 0; i < it.entries(); i++)
+  {
+    it.getNext(qn,entry);
+    if (qiCheckForInvalidObject(numKeys, qiKeyArray,
+                                entry->getTableUID(),
+                                dummy))
+      deCache(&entry);
+  }
+
+  lastTouchTime_ = getCurrentTime();
+}
+
+
 // constructor for memory efficient representation of colStats.
 // colStats has both single-column & multi-column histograms.
 HistogramsCacheEntry::HistogramsCacheEntry
 (const StatsList & colStats,
  const QualifiedName & qualifiedName,
-				                     const Int64 & modifTime,
-                                     const Int64 & statsTime,
-                                     const Int64 & redefTime,
+ Int64 tableUID,
+ const Int64 & statsTime,
+ const Int64 & redefTime,
  NAMemory * heap) 
   : full_(NULL), multiColumn_(NULL), name_(NULL), heap_(heap)
-  , refreshTime_(0), singleColumnPositions_(heap)
+  , refreshTime_(0), singleColumnPositions_(heap), tableUID_(tableUID)
   , accessedInCurrentStatement_(TRUE)
   , size_(0)
 {
-	modifTime_ = modifTime;
-    statsTime_ = statsTime;
+  statsTime_ = statsTime;
   updateRefreshTime();
   redefTime_ = redefTime;
   preFetched_ = CURRSTMT_OPTDEFAULTS->preFetchHistograms();
@@ -1304,8 +1228,6 @@ void HistogramsCacheEntry::print
   fprintf(ofd,"allFakeStats_:%d ", allFakeStats_);
   fprintf(ofd,"preFetched_:%d \n", preFetched_);
   char time[30];
-  convertInt64ToAscii(modifTime_, time);
-  fprintf(ofd,"modifTime_:%s ", time);
   convertInt64ToAscii(redefTime_, time);
   fprintf(ofd,"redefTime_:%s ", time);
   convertInt64ToAscii(refreshTime_, time);
@@ -1314,6 +1236,8 @@ void HistogramsCacheEntry::print
   fprintf(ofd,"statsTime_:%s ", time);
   convertInt64ToAscii(getLastUpdateStatsTime(), time);
   fprintf(ofd,"lastUpdateStatsTime:%s \n", time);
+  convertInt64ToAscii(tableUID_, time);
+  fprintf(ofd,"tableUID_:%s \n", time);
   fprintf(ofd,"single-column histograms:%d ", singleColumnCount());
   singleColumnPositions_.printColsFromTable(ofd,NULL);
   if (full_)

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/9a3cf2e5/core/sql/optimizer/NATable.h
----------------------------------------------------------------------
diff --git a/core/sql/optimizer/NATable.h b/core/sql/optimizer/NATable.h
index afe3f6d..5f8991b 100644
--- a/core/sql/optimizer/NATable.h
+++ b/core/sql/optimizer/NATable.h
@@ -89,139 +89,138 @@ class HistogramsCacheEntry : public NABasicObject
 {
   friend class HistogramCache;
   
- public:
-  // constructor for creating memory efficient representation of colStats
-  HistogramsCacheEntry
+  public:
+    // constructor for creating memory efficient representation of colStats
+    HistogramsCacheEntry
     (const StatsList & colStats,
      const QualifiedName & qualifiedName,
-		              const Int64 & modifTime,
-                      const Int64 & statsTime,
-                      const Int64 & redefTime,
+     Int64 tableUID,
+     const Int64 & statsTime,
+     const Int64 & redefTime,
      NAMemory * heap);
 
-	//destructor
-	virtual ~HistogramsCacheEntry();
+    //destructor
+    virtual ~HistogramsCacheEntry();
 
-	//setter methods
-	//should be called to indicate that histograms for a given table
-	//have been pre-fetched
-	void setPreFetched(NABoolean preFetched = TRUE){preFetched_ = preFetched;};
+    //setter methods
+    //should be called to indicate that histograms for a given table
+    //have been pre-fetched
+    void setPreFetched(NABoolean preFetched = TRUE){preFetched_ = preFetched;};
 
-  const ColStatsSharedPtr getStatsAt(CollIndex x) const;
+    const ColStatsSharedPtr getStatsAt(CollIndex x) const;
 
-  const MultiColumnHistogram* getMultiColumnAt(CollIndex x) const;
+    const MultiColumnHistogram* getMultiColumnAt(CollIndex x) const;
 
-  NABoolean contains(CollIndex colPos) const 
+    NABoolean contains(CollIndex colPos) const 
     { return singleColumnPositions_.contains(colPos); }
 
-  // insert all multicolumns referencing col into list
-  // use singleColsFound to avoid duplicates
-  void getMCStatsForColFromCacheIntoList
+    // insert all multicolumns referencing col into list
+    // use singleColsFound to avoid duplicates
+    void getMCStatsForColFromCacheIntoList
     (StatsList& list, NAColumn& col, ColumnSet& singleColsFound);
 
-  // adds histograms to this cache entry
-  void addToCachedEntry(NAColumnArray & columns, StatsList & list);
+    // adds histograms to this cache entry
+    void addToCachedEntry(NAColumnArray & columns, StatsList & list);
 
-  // add multi-column histogram to this cache entry
-  void addMultiColumnHistogram(const ColStats& mcStat,
-                               ColumnSet* singleColPositions=NULL);
+    // add multi-column histogram to this cache entry
+    void addMultiColumnHistogram(const ColStats& mcStat,
+                                 ColumnSet* singleColPositions=NULL);
 
-	//accessor methods
-  ColStatsSharedPtr const
-    getHistForCol (NAColumn& col) const;
+    //accessor methods
+    ColStatsSharedPtr const getHistForCol (NAColumn& col) const;
 
-  CollIndex singleColumnCount() const 
+    CollIndex singleColumnCount() const 
     { return full_ ? full_->entries() : 0; }
 
-  CollIndex multiColumnCount() const 
+    CollIndex multiColumnCount() const 
     { return multiColumn_ ? multiColumn_->entries() : 0; }
 
-	NABoolean           preFetched() const {return preFetched_;};
-  const QualifiedName* getName() const;
+    NABoolean           preFetched() const {return preFetched_;};
+    const QualifiedName* getName() const;
 
-  NABoolean accessedInCurrentStatement() const 
+    NABoolean accessedInCurrentStatement() const 
     { return accessedInCurrentStatement_; }
 
-  void resetAfterStatement() 
+    void resetAfterStatement() 
     { accessedInCurrentStatement_ = FALSE; }
 
-	//overloaded operator to satisfy hashdictionary
-	inline NABoolean operator==(const HistogramsCacheEntry & other)
+    //overloaded operator to satisfy hashdictionary
+    inline NABoolean operator==(const HistogramsCacheEntry & other)
 	{return (this == &other);};
 
-	Int64 getRefreshTime() const            { return refreshTime_; };
+    Int64 getRefreshTime() const          { return refreshTime_; };
 
-	void setRefreshTime(Int64 refreshTime)
-	{ refreshTime_ = refreshTime ; };
+    void setRefreshTime(Int64 refreshTime) { refreshTime_ = refreshTime ; };
 
-	void updateRefreshTime();
+    void updateRefreshTime();
 
-  void setModifTime(Int64 modifTime) { modifTime_ = modifTime; };
-  void setStatsTime(Int64 statsTime) { statsTime_ = statsTime; };
-  void setRedefTime(Int64 redefTime) { redefTime_ = redefTime; };
+    void setRedefTime(Int64 redefTime) { redefTime_ = redefTime; };
 
-	Int64 getRedefTime() const            { return redefTime_; };
-  Int64 getModifTime() const            { return modifTime_; };
-  Int64 getStatsTime() const            { return statsTime_; };
+    Int64 getRedefTime() const            { return redefTime_; };
 
-	static Int64 getLastUpdateStatsTime();
+    Int64 getStatsTime() const            { return statsTime_; };
 
-	static void setUpdateStatsTime(Int64 updateTime);
+    static Int64 getLastUpdateStatsTime();
 
-	inline NABoolean isAllStatsFake() { return allFakeStats_; };
+    static void setUpdateStatsTime(Int64 updateTime);
 
-	inline void allStatsFake(NABoolean allFakeStats) { allFakeStats_ = allFakeStats; }
+    inline NABoolean isAllStatsFake() { return allFakeStats_; };
 
-  inline ULng32 getSize() {return size_;}
+    inline void allStatsFake(NABoolean allFakeStats) { allFakeStats_ = allFakeStats; }
+
+    inline ULng32 getSize() {return size_;}
+
+    Int64 getTableUID() const { return tableUID_; };
   
-  void display() const;
-  void print( FILE* ofd = stdout,
-	      const char* indent = DEFAULT_INDENT,
-              const char* title = "HistogramsCacheEntry") const;
-  void monitor(FILE* ofd) const;
+    void display() const;
+    void print( FILE* ofd = stdout,
+                const char* indent = DEFAULT_INDENT,
+                const char* title = "HistogramsCacheEntry") const;
+    void monitor(FILE* ofd) const;
 
   private:
   
-  inline void setSize(ULng32 newSize){ size_ = newSize;}
+    inline void setSize(ULng32 newSize){ size_ = newSize;}
 
-	NAMemory * heap_;
+    NAMemory * heap_;
 
-	NABoolean preFetched_;
+    NABoolean preFetched_;
 
-	// ---------------------------------------------------------------------
-	// The time histograms for this table were last refreshed
-	// ---------------------------------------------------------------------
-	Int64 refreshTime_;
+    // ---------------------------------------------------------------------
+    // The time histograms for this table were last refreshed
+    // ---------------------------------------------------------------------
+    Int64 refreshTime_;
 
-	// ---------------------------------------------------------------------
-	// The time this table was last altered
-	// ---------------------------------------------------------------------
-	Int64 redefTime_;
-  Int64 modifTime_;
-  Int64 statsTime_;
+    // ---------------------------------------------------------------------
+    // The time this table was last altered
+    // ---------------------------------------------------------------------
+    Int64 redefTime_;
 
-	// ----------------------------------------------------------------
-	// Do all columns of this table consis of default statistics
-	// ----------------------------------------------------------------
-	NABoolean allFakeStats_;
+    Int64 statsTime_;  // STATS_TIME value from SB_HISTOGRAMS table
 
-	//The full histograms
-  NAList<ColStatsSharedPtr> *full_; 
-  // is the memory-efficient contextheap representation 
-  // of a table's single-column histograms only 
+    // ----------------------------------------------------------------
+    // Do all columns of this table consis of default statistics
+    // ----------------------------------------------------------------
+    NABoolean allFakeStats_;
 
-  ColumnSet singleColumnPositions_; 
-  // tracks single-column histograms that are in cache
+    //The full histograms
+    NAList<ColStatsSharedPtr> *full_; 
+    // is the memory-efficient contextheap representation 
+    // of a table's single-column histograms only 
 
-  // multicolum histograms
-  MultiColumnHistogramList *multiColumn_; 
-  // is the memory-efficient contextheap representation 
-  // of a table's multi-column histograms only
+    ColumnSet singleColumnPositions_; 
+    // tracks single-column histograms that are in cache
 
-	//pointer to qualified name of the table
-	QualifiedName * name_;
-  NABoolean       accessedInCurrentStatement_; 
-  ULng32 size_;
+    // multicolum histograms
+    MultiColumnHistogramList *multiColumn_; 
+    // is the memory-efficient contextheap representation 
+    // of a table's multi-column histograms only
+
+    //pointer to qualified name of the table
+    QualifiedName * name_;
+    Int64 tableUID_;
+    NABoolean       accessedInCurrentStatement_; 
+    ULng32 size_;
 };// class HistogramsCacheEntry
 
 /****************************************************************************
@@ -276,6 +275,9 @@ public:
   void traceTablesFinalize() const;
   void monitor() const;
 
+  void freeInvalidEntries(Int32 returnedNumQiKeys,
+                          SQL_QIKEY * qiKeyArray);
+
  private:
   DISALLOW_COPY_AND_ASSIGN(HistogramCache);
 
@@ -300,7 +302,7 @@ public:
 	void putStatsListIntoCache(StatsList & colStatsList,
                               const NAColumnArray& colArray,
                               const QualifiedName & qualifiedName,
-                              Int64 modifTime,
+                              Int64 tableUID,
                               Int64 statsTime,
                               const Int64 & redefTime,
 			      NABoolean allFakeStats);
@@ -335,6 +337,7 @@ public:
   //The Cache
   NAHashDictionary <QualifiedName, HistogramsCacheEntry> * histogramsCache_;
         
+  Int64 lastTouchTime_;    // last time cache was touched
   ULng32 hits_;            // cache hit counter
   ULng32 lookups_;         // entries lookup counter 
   ULng32 size_;

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/9a3cf2e5/core/sql/optimizer/opt.cpp
----------------------------------------------------------------------
diff --git a/core/sql/optimizer/opt.cpp b/core/sql/optimizer/opt.cpp
index a417d63..02e7dc1 100644
--- a/core/sql/optimizer/opt.cpp
+++ b/core/sql/optimizer/opt.cpp
@@ -3893,6 +3893,7 @@ OptDefaults::OptDefaults(CollHeap* h) : heap_(h)
    joinCardLowBound_ = 0.5;
    ustatAutomation_ = FALSE;
    preFetchHistograms_ = TRUE;
+   siKeyGCinterval_ = (Int64)24 * 60 * 60; // 24 hours
    histMCStatsNeeded_ = TRUE;
    histSkipMCUecForNonKeyCols_ = TRUE;
    histMissingStatsWarningLevel_ = 4;
@@ -3907,9 +3908,6 @@ OptDefaults::OptDefaults(CollHeap* h) : heap_(h)
    histTupleFreqValListThreshold_ = 40;
    histNumOfAddDaysToExtrapolate_ = 4;
 
-   defRefTime_ = 3600;
-   defFakeRefTime_ = 3600;
-
    defNoStatsUec_ = 2;
    defNoStatsRowCount_ = 100;
 
@@ -4996,9 +4994,6 @@ void OptDefaults::initialize(RelExpr* rootExpr)
   joinCardLowBound_			= (defs_->getAsDouble(HIST_JOIN_CARD_LOWBOUND));
   ustatAutomation_		        = (defs_->getAsLong(USTAT_AUTOMATION_INTERVAL) > 0);
 
-  defRefTime_				= defs_->getAsLong(CACHE_HISTOGRAMS_REFRESH_INTERVAL);
-  defFakeRefTime_			= defs_->getAsLong(HIST_NO_STATS_REFRESH_INTERVAL);
-
   defNoStatsUec_      			= defs_->getAsDouble(HIST_NO_STATS_UEC);
   defNoStatsRowCount_                   = defs_->getAsDouble(HIST_NO_STATS_ROWCOUNT);
 
@@ -5034,6 +5029,20 @@ void OptDefaults::initialize(RelExpr* rootExpr)
 	  preFetchHistograms_           = FALSE;
   }
 
+  // Find out what the RMS security key invalidation garbage collection
+  // interval is (this mirrors the logic in runtimestats/ssmpipc.cpp), so
+  // we can fail-safe the histogram cache.
+
+  char *sct = getenv("RMS_SIK_GC_INTERVAL_SECONDS");  // in seconds
+  if (sct)
+    {
+      siKeyGCinterval_ = ((Int64) str_atoi(sct, str_len(sct)));
+      if (siKeyGCinterval_ < 10)
+        siKeyGCinterval_ = 10;
+    }
+  else
+    siKeyGCinterval_ = (Int64)24 * 60 * 60; // 24 hours
+
   // -----------------------------------------------------------------------
   // Initialize recalibration constants:
   // -----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/9a3cf2e5/core/sql/optimizer/opt.h
----------------------------------------------------------------------
diff --git a/core/sql/optimizer/opt.h b/core/sql/optimizer/opt.h
index 3af2541..0675d2f 100644
--- a/core/sql/optimizer/opt.h
+++ b/core/sql/optimizer/opt.h
@@ -659,6 +659,10 @@ public:
   {
    	return preFetchHistograms_;
   };
+  inline Int64 siKeyGCinterval()
+  {
+    return siKeyGCinterval_;
+  };
 
   static NABoolean cacheHistograms();
 
@@ -728,15 +732,6 @@ public:
     histUseSampleForCardEst_ = v;
   }
 
-  inline Lng32 defRefTime()
-  {
-    return defRefTime_;
-  };
-  inline Lng32 defFakeRefTime()
-  {
-    return defFakeRefTime_;
-  };
-
   inline Lng32 partitioningSchemeSharing()
   {
     return partitioningSchemeSharing_;
@@ -1097,11 +1092,10 @@ private:
   NABoolean reduceBaseHistograms_;
   NABoolean reduceIntermediateHistograms_;
   NABoolean preFetchHistograms_;
+  Int64 siKeyGCinterval_;  // query/security invalidation key garbage collection interval, in seconds
 
   NABoolean ustatAutomation_;
   double histDefaultSampleSize_;
-  Lng32 defRefTime_;
-  Lng32 defFakeRefTime_;
   double baseHistogramReductionFF_;
   double intermediateHistogramReductionFF_;
   double histogramReductionConstantAlpha_;

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/9a3cf2e5/core/sql/regress/compGeneral/EXPECTED011.SB
----------------------------------------------------------------------
diff --git a/core/sql/regress/compGeneral/EXPECTED011.SB b/core/sql/regress/compGeneral/EXPECTED011.SB
index 77c9d8a..9b78022 100644
--- a/core/sql/regress/compGeneral/EXPECTED011.SB
+++ b/core/sql/regress/compGeneral/EXPECTED011.SB
@@ -1570,6 +1570,8 @@ A
 
 *** WARNING[2997]  (Attempting to unnest Subquery)
 
+*** WARNING[6007] Multi-column statistics for columns (C, D) from table TRAFODION.SCH.T40 were not available. The columns were being used by GroupBy operator. As a result, the access path chosen might not be the best possible.
+
 --- SQL command prepared.
 >>
 >>execute explainIt;
@@ -1693,6 +1695,8 @@ A
 
 *** WARNING[2997]  (Attempting to unnest Subquery)
 
+*** WARNING[6007] Multi-column statistics for columns (C, D) from table TRAFODION.SCH.T40 were not available. The columns were being used by GroupBy operator. As a result, the access path chosen might not be the best possible.
+
 --- SQL command prepared.
 >>
 >>execute explainIt;
@@ -1838,8 +1842,8 @@ ss          ?
 A           (EXPR)    
 ----------  ----------
 
-ss          ?         
 xx          ?         
+ss          ?         
 xx          ?         
 
 --- 3 row(s) selected.
@@ -1853,9 +1857,9 @@ xx          ?
 A           (EXPR)    
 ----------  ----------
 
-xx          ?         
 ss          ?         
 xx          ?         
+xx          ?         
 
 --- 3 row(s) selected.
 >>

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/9a3cf2e5/core/sql/regress/compGeneral/EXPECTED015.SB
----------------------------------------------------------------------
diff --git a/core/sql/regress/compGeneral/EXPECTED015.SB b/core/sql/regress/compGeneral/EXPECTED015.SB
index 5065fd0..b5e11d4 100755
--- a/core/sql/regress/compGeneral/EXPECTED015.SB
+++ b/core/sql/regress/compGeneral/EXPECTED015.SB
@@ -465,8 +465,8 @@ z     y             25
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          1.000E+002   100 fragment   
-TRAFODION_SCAN    T0          1.000E+002   100 fragment   
+ROOT                          1.000E+001   10 fragment_   
+TRAFODION_SCAN    T0          1.000E+001   10 fragment_   
 
 --- 2 row(s) selected.
 >>
@@ -493,8 +493,8 @@ TRAFODION_SCAN    T6          1.000E+002   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          1.000E+002   100 fragment   
-TRAFODION_SCAN    T8          1.000E+002   100 fragment   
+ROOT                          1.000E+003   1000 fragmen   
+TRAFODION_SCAN    T8          1.000E+003   1000 fragmen   
 
 --- 2 row(s) selected.
 >>
@@ -507,8 +507,8 @@ TRAFODION_SCAN    T8          1.000E+002   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          1.000E+002   100 fragment   
-TRAFODION_SCAN    T9          1.000E+002   100 fragment   
+ROOT                          1.000E+004   10000 fragme   
+TRAFODION_SCAN    T9          1.000E+004   10000 fragme   
 
 --- 2 row(s) selected.
 >>
@@ -521,8 +521,8 @@ TRAFODION_SCAN    T9          1.000E+002   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          1.000E+002   100 fragment   
-TRAFODION_SCAN    T10         1.000E+002   100 fragment   
+ROOT                          1.000E+005   100000 fragm   
+TRAFODION_SCAN    T10         1.000E+005   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -535,8 +535,8 @@ TRAFODION_SCAN    T10         1.000E+002   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          1.300E+001   100 fragment   
-TRAFODION_SCAN    T10         1.300E+001   100 fragment   
+ROOT                          1.250E+004   100000 fragm   
+TRAFODION_SCAN    T10         1.250E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>select count(*) from (SELECT * FROM t10 WHERE d like 'one%') as t;
@@ -557,8 +557,8 @@ TRAFODION_SCAN    T10         1.300E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          8.900E+001   100 fragment   
-TRAFODION_SCAN    T10         8.900E+001   100 fragment   
+ROOT                          8.750E+004   100000 fragm   
+TRAFODION_SCAN    T10         8.750E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>select count(*) from (SELECT * FROM t10 WHERE d not like 'one%') as t;
@@ -618,8 +618,8 @@ TRAFODION_SCAN    T10         1.000E+000   1 fragment_i
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          1.000E+001   99 fragment_   
-TRAFODION_SCAN    T10         1.000E+001   99 fragment_   
+ROOT                          1.000E+004   10000 fragme   
+TRAFODION_SCAN    T10         1.000E+004   10000 fragme   
 
 --- 2 row(s) selected.
 >>select count(*) from (SELECT * FROM t10 WHERE d = 'one') as t;
@@ -641,8 +641,8 @@ TRAFODION_SCAN    T10         1.000E+001   99 fragment_
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          5.000E+001   50 fragment_   
-TRAFODION_SCAN    T10         5.000E+001   50 fragment_   
+ROOT                          1.000E+004   10000 fragme   
+TRAFODION_SCAN    T10         1.000E+004   10000 fragme   
 
 --- 2 row(s) selected.
 >>
@@ -656,8 +656,8 @@ TRAFODION_SCAN    T10         5.000E+001   50 fragment_
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   50 fragment_   
-TRAFODION_SCAN    T10         3.300E+001   50 fragment_   
+ROOT                          9.999E+004   99999 fragme   
+TRAFODION_SCAN    T10         9.999E+004   99999 fragme   
 
 --- 2 row(s) selected.
 >>
@@ -670,8 +670,8 @@ TRAFODION_SCAN    T10         3.300E+001   50 fragment_
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.400E+001   50 fragment_   
-TRAFODION_SCAN    T10         3.300E+001   50 fragment_   
+ROOT                          9.999E+004   99999 fragme   
+TRAFODION_SCAN    T10         9.999E+004   99999 fragme   
 
 --- 2 row(s) selected.
 >>
@@ -684,8 +684,8 @@ TRAFODION_SCAN    T10         3.300E+001   50 fragment_
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   50 fragment_   
-TRAFODION_SCAN    T10         3.300E+001   50 fragment_   
+ROOT                          1.000E+000   1 fragment_i   
+TRAFODION_SCAN    T10         1.000E+000   1 fragment_i   
 
 --- 2 row(s) selected.
 >>
@@ -698,8 +698,8 @@ TRAFODION_SCAN    T10         3.300E+001   50 fragment_
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   51 fragment_   
-TRAFODION_SCAN    T10         3.300E+001   51 fragment_   
+ROOT                          2.000E+000   2 fragment_i   
+TRAFODION_SCAN    T10         2.000E+000   2 fragment_i   
 
 --- 2 row(s) selected.
 >>
@@ -712,8 +712,8 @@ TRAFODION_SCAN    T10         3.300E+001   51 fragment_
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          6.700E+001   100 fragment   
-TRAFODION_SCAN    T10         6.700E+001   100 fragment   
+ROOT                          1.000E+005   100000 fragm   
+TRAFODION_SCAN    T10         1.000E+005   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -727,8 +727,8 @@ TRAFODION_SCAN    T10         6.700E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   56 fragment_   
-TRAFODION_SCAN    T10         3.300E+001   56 fragment_   
+ROOT                          5.000E+004   50000 fragme   
+TRAFODION_SCAN    T10         5.000E+004   50000 fragme   
 
 --- 2 row(s) selected.
 >>
@@ -741,8 +741,8 @@ TRAFODION_SCAN    T10         3.300E+001   56 fragment_
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   78 fragment_   
-TRAFODION_SCAN    T10         3.300E+001   78 fragment_   
+ROOT                          6.000E+004   60000 fragme   
+TRAFODION_SCAN    T10         6.000E+004   60000 fragme   
 
 --- 2 row(s) selected.
 >>
@@ -755,8 +755,8 @@ TRAFODION_SCAN    T10         3.300E+001   78 fragment_
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   44 fragment_   
-TRAFODION_SCAN    T10         3.300E+001   44 fragment_   
+ROOT                          4.000E+004   40000 fragme   
+TRAFODION_SCAN    T10         4.000E+004   40000 fragme   
 
 --- 2 row(s) selected.
 >>
@@ -769,8 +769,8 @@ TRAFODION_SCAN    T10         3.300E+001   44 fragment_
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   72 fragment_   
-TRAFODION_SCAN    T10         3.300E+001   72 fragment_   
+ROOT                          5.000E+004   50000 fragme   
+TRAFODION_SCAN    T10         5.000E+004   50000 fragme   
 
 --- 2 row(s) selected.
 >>
@@ -783,8 +783,8 @@ TRAFODION_SCAN    T10         3.300E+001   72 fragment_
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          6.700E+001   100 fragment   
-TRAFODION_SCAN    T10         6.700E+001   100 fragment   
+ROOT                          9.000E+004   90000 fragme   
+TRAFODION_SCAN    T10         9.000E+004   90000 fragme   
 
 --- 2 row(s) selected.
 >>
@@ -797,8 +797,8 @@ TRAFODION_SCAN    T10         6.700E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   100 fragment   
-TRAFODION_SCAN    T10         3.300E+001   100 fragment   
+ROOT                          3.333E+004   100000 fragm   
+TRAFODION_SCAN    T10         3.333E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -811,8 +811,8 @@ TRAFODION_SCAN    T10         3.300E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   100 fragment   
-TRAFODION_SCAN    T10         3.300E+001   100 fragment   
+ROOT                          3.333E+004   100000 fragm   
+TRAFODION_SCAN    T10         3.333E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -825,8 +825,8 @@ TRAFODION_SCAN    T10         3.300E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   100 fragment   
-TRAFODION_SCAN    T10         3.300E+001   100 fragment   
+ROOT                          3.333E+004   100000 fragm   
+TRAFODION_SCAN    T10         3.333E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -839,8 +839,8 @@ TRAFODION_SCAN    T10         3.300E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   100 fragment   
-TRAFODION_SCAN    T10         3.300E+001   100 fragment   
+ROOT                          3.333E+004   100000 fragm   
+TRAFODION_SCAN    T10         3.333E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -853,8 +853,8 @@ TRAFODION_SCAN    T10         3.300E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          5.000E+001   100 fragment   
-TRAFODION_SCAN    T10         5.000E+001   100 fragment   
+ROOT                          9.999E+004   100000 fragm   
+TRAFODION_SCAN    T10         9.999E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -867,8 +867,8 @@ TRAFODION_SCAN    T10         5.000E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   100 fragment   
-TRAFODION_SCAN    T10         3.300E+001   100 fragment   
+ROOT                          3.333E+004   100000 fragm   
+TRAFODION_SCAN    T10         3.333E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -881,8 +881,8 @@ TRAFODION_SCAN    T10         3.300E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   100 fragment   
-TRAFODION_SCAN    T10         3.300E+001   100 fragment   
+ROOT                          3.333E+004   100000 fragm   
+TRAFODION_SCAN    T10         3.333E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -895,8 +895,8 @@ TRAFODION_SCAN    T10         3.300E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   100 fragment   
-TRAFODION_SCAN    T10         3.300E+001   100 fragment   
+ROOT                          3.333E+004   100000 fragm   
+TRAFODION_SCAN    T10         3.333E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -909,8 +909,8 @@ TRAFODION_SCAN    T10         3.300E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   100 fragment   
-TRAFODION_SCAN    T10         3.300E+001   100 fragment   
+ROOT                          3.333E+004   100000 fragm   
+TRAFODION_SCAN    T10         3.333E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -923,8 +923,8 @@ TRAFODION_SCAN    T10         3.300E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          5.000E+001   100 fragment   
-TRAFODION_SCAN    T10         5.000E+001   100 fragment   
+ROOT                          9.000E+004   100000 fragm   
+TRAFODION_SCAN    T10         9.000E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -951,8 +951,8 @@ TRAFODION_SCAN    T10         1.000E+000   1 fragment_i
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          1.000E+002   100 fragment   
-TRAFODION_SCAN    T10         1.000E+002   100 fragment   
+ROOT                          1.000E+005   100000 fragm   
+TRAFODION_SCAN    T10         1.000E+005   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -979,8 +979,8 @@ TRAFODION_SCAN    T10         1.000E+000   1 fragment_i
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          9.900E+001   100 fragment   
-TRAFODION_SCAN    T10         9.900E+001   100 fragment   
+ROOT                          1.000E+005   100000 fragm   
+TRAFODION_SCAN    T10         1.000E+005   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -993,8 +993,8 @@ TRAFODION_SCAN    T10         9.900E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          5.000E+001   100 fragment   
-TRAFODION_SCAN    T10         5.000E+001   100 fragment   
+ROOT                          5.000E+004   100000 fragm   
+TRAFODION_SCAN    T10         5.000E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -1007,8 +1007,8 @@ TRAFODION_SCAN    T10         5.000E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   100 fragment   
-TRAFODION_SCAN    T10         3.300E+001   100 fragment   
+ROOT                          3.333E+004   100000 fragm   
+TRAFODION_SCAN    T10         3.333E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -1021,8 +1021,8 @@ TRAFODION_SCAN    T10         3.300E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   100 fragment   
-TRAFODION_SCAN    T10         3.300E+001   100 fragment   
+ROOT                          3.333E+004   100000 fragm   
+TRAFODION_SCAN    T10         3.333E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -1035,8 +1035,8 @@ TRAFODION_SCAN    T10         3.300E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   100 fragment   
-TRAFODION_SCAN    T10         3.300E+001   100 fragment   
+ROOT                          3.333E+004   100000 fragm   
+TRAFODION_SCAN    T10         3.333E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -1049,8 +1049,8 @@ TRAFODION_SCAN    T10         3.300E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.300E+001   100 fragment   
-TRAFODION_SCAN    T10         3.300E+001   100 fragment   
+ROOT                          3.333E+004   100000 fragm   
+TRAFODION_SCAN    T10         3.333E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -1063,8 +1063,8 @@ TRAFODION_SCAN    T10         3.300E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          5.000E+001   100 fragment   
-TRAFODION_SCAN    T10         5.000E+001   100 fragment   
+ROOT                          5.000E+004   100000 fragm   
+TRAFODION_SCAN    T10         5.000E+004   100000 fragm   
 
 --- 2 row(s) selected.
 >>
@@ -1077,8 +1077,8 @@ TRAFODION_SCAN    T10         5.000E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          1.500E+001   15 fragment_   
-TRAFODION_SCAN    T10         1.100E+001   11 fragment_   
+ROOT                          3.000E+000   3 fragment_i   
+TRAFODION_SCAN    T10         3.000E+000   3 fragment_i   
 
 --- 2 row(s) selected.
 >>
@@ -1091,8 +1091,8 @@ TRAFODION_SCAN    T10         1.100E+001   11 fragment_
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          1.100E+001   78 fragment_   
-TRAFODION_SCAN    T10         1.100E+001   78 fragment_   
+ROOT                          5.000E+004   50000 fragme   
+TRAFODION_SCAN    T10         5.000E+004   50000 fragme   
 
 --- 2 row(s) selected.
 >>
@@ -1133,8 +1133,8 @@ TRAFODION_SCAN    T10         1.000E+000   1 fragment_i
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          1.100E+001   51 fragment_   
-TRAFODION_SCAN    T10         1.100E+001   51 fragment_   
+ROOT                          1.000E+004   10001 fragme   
+TRAFODION_SCAN    T10         1.000E+004   10001 fragme   
 
 --- 2 row(s) selected.
 >>
@@ -1147,8 +1147,8 @@ TRAFODION_SCAN    T10         1.100E+001   51 fragment_
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          7.500E+001   100 fragment   
-TRAFODION_SCAN    T10         7.500E+001   100 fragment   
+ROOT                          1.000E+004   10001 fragme   
+TRAFODION_SCAN    T10         1.000E+004   10001 fragme   
 
 --- 2 row(s) selected.
 >>
@@ -1174,8 +1174,8 @@ TRAFODION_SCAN    T10         1.000E+000   1 fragment_i
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          1.300E+001   50 fragment_   
-TRAFODION_SCAN    T10         1.300E+001   50 fragment_   
+ROOT                          1.250E+004   12500 fragme   
+TRAFODION_SCAN    T10         1.250E+004   12500 fragme   
 
 --- 2 row(s) selected.
 >> -- min(1e5, 1e4) should = 1e4
@@ -1202,8 +1202,8 @@ TRAFODION_SCAN    T10         1.000E+000   1 fragment_i
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          1.000E+001   99 fragment_   
-TRAFODION_SCAN    T10         1.000E+001   99 fragment_   
+ROOT                          1.000E+000   10000 fragme   
+TRAFODION_SCAN    T10         1.000E+000   10000 fragme   
 
 --- 2 row(s) selected.
 >> -- min(1e4, 1e5) should = 1e4
@@ -1220,8 +1220,8 @@ TRAFODION_SCAN    T10         1.000E+001   99 fragment_
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          2.000E+001   100 fragment   
-TRAFODION_SCAN    T10         2.000E+001   100 fragment   
+ROOT                          2.000E+002   200 fragment   
+TRAFODION_SCAN    T10         2.000E+002   200 fragment   
 
 --- 2 row(s) selected.
 >>-- maxSel("b in (1,2)") is min(maxSel("b=1")+maxSel("b=2"),1.)
@@ -1234,8 +1234,8 @@ TRAFODION_SCAN    T10         2.000E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          3.000E+000   3 fragment_i   
-TRAFODION_SCAN    T10         2.000E+000   2 fragment_i   
+ROOT                          2.000E+000   3 fragment_i   
+TRAFODION_SCAN    T10         2.000E+000   3 fragment_i   
 
 --- 2 row(s) selected.
 >> -- maxSel(p1 and p2) is min(maxSel(p1), maxSel(p2))
@@ -1248,8 +1248,8 @@ TRAFODION_SCAN    T10         2.000E+000   2 fragment_i
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          2.700E+001   100 fragment   
-TRAFODION_SCAN    T10         2.700E+001   100 fragment   
+ROOT                          2.030E+002   203 fragment   
+TRAFODION_SCAN    T10         2.030E+002   203 fragment   
 
 --- 2 row(s) selected.
 >> -- maxSel(p1 or p2) is min(maxSel(p1)+maxSel(p2),1)
@@ -1265,10 +1265,10 @@ TRAFODION_SCAN    T10         2.700E+001   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-HYBRID_HASH_JOIN              1.000E+002   100 fragment   
-ROOT                          1.000E+002   100 fragment   
-TRAFODION_SCAN    T1          1.000E+002   100 fragment   
-TRAFODION_SCAN    T10         1.000E+002   100 fragment   
+NESTED_JOIN                   1.000E+001   10 fragment_   
+ROOT                          1.000E+001   10 fragment_   
+TRAFODION_SCAN    T1          1.000E+001   10 fragment_   
+TRAFODION_VSBB_S  T10         1.000E+000   10 fragment_   
 
 --- 4 row(s) selected.
 >>
@@ -1281,10 +1281,10 @@ TRAFODION_SCAN    T10         1.000E+002   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-HYBRID_HASH_JOIN              1.000E+002   100 fragment   
-ROOT                          1.000E+002   100 fragment   
-TRAFODION_SCAN    T1          1.000E+002   100 fragment   
-TRAFODION_SCAN    T10         1.000E+002   100 fragment   
+HYBRID_HASH_JOIN              1.000E+003   1000 fragmen   
+ROOT                          1.000E+003   1000 fragmen   
+TRAFODION_SCAN    T1          1.000E+001   10 fragment_   
+TRAFODION_SCAN    T10         1.000E+005   100000 fragm   
 
 --- 4 row(s) selected.
 >>
@@ -1297,12 +1297,13 @@ TRAFODION_SCAN    T10         1.000E+002   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-HYBRID_HASH_JOIN              1.000E+002   100 fragment   
-ROOT                          1.000E+002   100 fragment   
-TRAFODION_SCAN    T1          1.000E+002   100 fragment   
-TRAFODION_SCAN    T10         1.000E+002   100 fragment   
+NESTED_JOIN                   1.000E+001   10 fragment_   
+PROBE_CACHE                   1.000E+000   10 fragment_   
+ROOT                          1.000E+001   10 fragment_   
+TRAFODION_SCAN    T1          1.000E+001   10 fragment_   
+TRAFODION_VSBB_S  T10         1.000E+000   10 fragment_   
 
---- 4 row(s) selected.
+--- 5 row(s) selected.
 >>
 >>-- test max cardinality for equi-joins where one side is complex
 >>prepare xx from
@@ -1314,12 +1315,13 @@ TRAFODION_SCAN    T10         1.000E+002   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-HYBRID_HASH_JOIN              1.000E+002   100 fragment   
-ROOT                          1.000E+002   100 fragment   
-TRAFODION_SCAN    T10         1.000E+002   100 fragment   
-TRAFODION_SCAN    T8          1.000E+002   100 fragment   
+NESTED_JOIN                   1.000E+003   1000 fragmen   
+PROBE_CACHE                   1.000E+000   1000 fragmen   
+ROOT                          1.000E+003   1000 fragmen   
+TRAFODION_SCAN    T8          1.000E+003   1000 fragmen   
+TRAFODION_VSBB_S  T10         1.000E+000   1000 fragmen   
 
---- 4 row(s) selected.
+--- 5 row(s) selected.
 >>
 >>prepare xx from
 +>SELECT * FROM t9, t10 WHERE t9.a = t10.b-1;
@@ -1330,10 +1332,10 @@ TRAFODION_SCAN    T8          1.000E+002   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-HYBRID_HASH_JOIN              1.000E+002   100 fragment   
-ROOT                          1.000E+002   100 fragment   
-TRAFODION_SCAN    T10         1.000E+002   100 fragment   
-TRAFODION_SCAN    T9          1.000E+002   100 fragment   
+HYBRID_HASH_JOIN              1.000E+005   100000 fragm   
+ROOT                          1.000E+005   100000 fragm   
+TRAFODION_SCAN    T10         1.000E+005   100000 fragm   
+TRAFODION_SCAN    T9          1.000E+004   10000 fragme   
 
 --- 4 row(s) selected.
 >>
@@ -1346,10 +1348,10 @@ TRAFODION_SCAN    T9          1.000E+002   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-HYBRID_HASH_JOIN              5.000E+003   5000 fragmen   
-ROOT                          5.000E+003   5000 fragmen   
-TRAFODION_SCAN    T10         1.000E+002   100 fragment   
-TRAFODION_SCAN    T9          1.000E+002   100 fragment   
+HYBRID_HASH_JOIN              1.000E+006   1e+06 fragme   
+ROOT                          1.000E+006   1e+06 fragme   
+TRAFODION_SCAN    T10         1.000E+005   100000 fragm   
+TRAFODION_SCAN    T9          1.000E+004   10000 fragme   
 
 --- 4 row(s) selected.
 >>
@@ -1367,8 +1369,8 @@ TRAFODION_SCAN    T9          1.000E+002   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-ROOT                          1.000E+002   100 fragment   
-TRAFODION_SCAN    T10         1.000E+002   100 fragment   
+ROOT                          1.000E+005   100000 fragm   
+TRAFODION_SCAN    T10         1.000E+005   100000 fragm   
 
 --- 2 row(s) selected.
 >>select count(*) from (SELECT a,b,c,d FROM t10 GROUP BY a,b,c,d) as t;
@@ -1389,9 +1391,9 @@ TRAFODION_SCAN    T10         1.000E+002   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-HASH_GROUPBY                  8.000E+000   8 fragment_i   
-ROOT                          8.000E+000   8 fragment_i   
-TRAFODION_SCAN    T10         1.000E+002   100 fragment   
+HASH_GROUPBY                  1.000E+005   100000 fragm   
+ROOT                          1.000E+005   100000 fragm   
+TRAFODION_SCAN    T10         1.000E+005   100000 fragm   
 
 --- 3 row(s) selected.
 >>select count(*) from (SELECT b,c,d FROM t10 GROUP BY b,c,d) as t;
@@ -1412,9 +1414,9 @@ TRAFODION_SCAN    T10         1.000E+002   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-HASH_GROUPBY                  4.000E+000   4 fragment_i   
-ROOT                          4.000E+000   4 fragment_i   
-TRAFODION_SCAN    T10         1.000E+002   100 fragment   
+HASH_GROUPBY                  1.000E+002   100 fragment   
+ROOT                          1.000E+002   100 fragment   
+TRAFODION_SCAN    T10         1.000E+005   100000 fragm   
 
 --- 3 row(s) selected.
 >>select count(*) from (SELECT c,d FROM t10 GROUP BY c,d) as t;
@@ -1435,9 +1437,9 @@ TRAFODION_SCAN    T10         1.000E+002   100 fragment
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-HASH_GROUPBY                  2.000E+000   2 fragment_i   
-ROOT                          2.000E+000   2 fragment_i   
-TRAFODION_SCAN    T10         1.000E+002   100 fragment   
+HASH_GROUPBY                  1.000E+001   10 fragment_   
+ROOT                          1.000E+001   10 fragment_   
+TRAFODION_SCAN    T10         1.000E+005   100000 fragm   
 
 --- 3 row(s) selected.
 >>select count(*) from (SELECT d FROM t10 GROUP BY d) as t;
@@ -1462,7 +1464,7 @@ OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 
 ROOT                          1.000E+000   1 fragment_i   
 SORT_SCALAR_AGGR              1.000E+000   1 fragment_i   
-TRAFODION_SCAN    T10         1.000E+001   99 fragment_   
+TRAFODION_SCAN    T10         1.000E+002   100 fragment   
 
 --- 3 row(s) selected.
 >>prepare xx from SELECT count(*) FROM t10 where c = 1;
@@ -1475,7 +1477,7 @@ OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 
 ROOT                          1.000E+000   1 fragment_i   
 SORT_SCALAR_AGGR              1.000E+000   1 fragment_i   
-TRAFODION_SCAN    T10         1.000E+001   99 fragment_   
+TRAFODION_SCAN    T10         1.000E+003   1000 fragmen   
 
 --- 3 row(s) selected.
 >>prepare xx from SELECT count(*) FROM t10 where b = 1 and c = 1;
@@ -1488,7 +1490,7 @@ OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 
 ROOT                          1.000E+000   1 fragment_i   
 SORT_SCALAR_AGGR              1.000E+000   1 fragment_i   
-TRAFODION_SCAN    T10         1.000E+000   99 fragment_   
+TRAFODION_SCAN    T10         1.000E+000   100 fragment   
 
 --- 3 row(s) selected.
 >>
@@ -1504,7 +1506,7 @@ OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 
 ROOT                          1.000E+000   1 fragment_i   
 SORT_SCALAR_AGGR              1.000E+000   1 fragment_i   
-TRAFODION_SCAN    T10         3.300E+001   50 fragment_   
+TRAFODION_SCAN    T10         1.000E+003   1000 fragmen   
 
 --- 3 row(s) selected.
 >>execute xx;
@@ -1526,7 +1528,7 @@ OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 
 ROOT                          1.000E+000   1 fragment_i   
 SORT_SCALAR_AGGR              1.000E+000   1 fragment_i   
-TRAFODION_SCAN    T10         3.300E+001   50 fragment_   
+TRAFODION_SCAN    T10         1.000E+003   1000 fragmen   
 
 --- 3 row(s) selected.
 >>execute xx;
@@ -1582,11 +1584,11 @@ TRAFODION_SCAN    T10         3.300E+001   50 fragment_
 OPERATOR          TAB_NAME    CARDINALITY  MAX_CARDINALITY
 ----------------  ----------  -----------  ---------------
 
-HYBRID_HASH_JOIN              1.000E+002   100 fragment   
+HYBRID_HASH_JOIN              1.000E+004   10000 fragme   
 ROOT                          1.000E+000   1 fragment_i   
 SORT_SCALAR_AGGR              1.000E+000   1 fragment_i   
-TRAFODION_SCAN    T10         1.000E+002   100 fragment   
-TRAFODION_SCAN    T9          1.000E+002   100 fragment   
+TRAFODION_SCAN    T10         1.000E+005   100000 fragm   
+TRAFODION_SCAN    T9          1.000E+004   10000 fragme   
 
 --- 5 row(s) selected.
 >>execute xx;
@@ -2255,7 +2257,7 @@ OPERATOR
 ----------------
 
 ROOT            
-HYBRID_HASH_JOIN
+NESTED_JOIN     
 
 --- 2 row(s) selected.
 >>
@@ -2268,7 +2270,7 @@ OPERATOR
 ----------------
 
 ROOT            
-HYBRID_HASH_JOIN
+NESTED_JOIN     
 
 --- 2 row(s) selected.
 >>
@@ -2282,7 +2284,7 @@ OPERATOR
 ----------------
 
 ROOT            
-HYBRID_HASH_JOIN
+NESTED_JOIN     
 
 --- 2 row(s) selected.
 >>
@@ -2686,7 +2688,12 @@ A            B
 --- SQL command prepared.
 >>execute explainIt;
 
---- 0 row(s) selected.
+OPERATOR        
+----------------
+
+TUPLELIST       
+
+--- 1 row(s) selected.
 >>execute XX;
 
 A            B            C          
@@ -2724,7 +2731,12 @@ A            B            C
 --- SQL command prepared.
 >>execute explainIt;
 
---- 0 row(s) selected.
+OPERATOR        
+----------------
+
+TUPLELIST       
+
+--- 1 row(s) selected.
 >>execute XX;
 
 A            B            C          

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/9a3cf2e5/core/sql/regress/compGeneral/EXPECTED042
----------------------------------------------------------------------
diff --git a/core/sql/regress/compGeneral/EXPECTED042 b/core/sql/regress/compGeneral/EXPECTED042
index a02e306..f6c7543 100644
--- a/core/sql/regress/compGeneral/EXPECTED042
+++ b/core/sql/regress/compGeneral/EXPECTED042
@@ -1,9 +1,9 @@
 >>showstats for table t042_orderline on ol_o_id detail;
 
 Detailed Histogram data for Table TRAFODION.ORDERENTRY.T042_ORDERLINE
-Table ID: 5468040854252687878
+Table ID: 4943375013317643387
 
-Hist ID:    540592453
+Hist ID:    796718003
 Column(s):  OL_O_ID
 Total Rows: 10
 Total UEC:  4
@@ -1789,21 +1789,18 @@ HQC key=SELECT T . VARCHAR0_UNIQ AS T_VARCHAR0_UNIQ , T . CHAR2_2 AS T_CHAR2_2 ,
 >>-- test compile time
 >>
 >>sh more /proc/loadavg  | cut -d' ' -f 1-3 | sed -e 's/^/System load: /' >> LOG042;
-System load: ::::::::::::::
-System load: /proc/loadavg
-System load: ::::::::::::::
-System load: 0.49 0.49 0.47
+System load: 2.85 3.75 3.68
 >>sh grep "model name" /proc/cpuinfo | head -1 | cut -d '@' -f 2 | sed -e 's/^/CPU frequency: /' >> LOG042;
-CPU frequency:  2.40GHz
+CPU frequency: model name	: Intel Core Processor (Haswell)
 >>set statistics on;
 >>prepare xx from select * from t042_orderline where ol_o_id = 1 ;
 
 --- SQL command prepared.
 
-Start Time             2016/09/08 10:05:44.474034
-End Time               2016/09/08 10:05:44.474891
-Elapsed Time                      00:00:00.000857
-Compile Time                      00:00:00.000857
+Start Time             2016/10/19 02:41:10.451650
+End Time               2016/10/19 02:41:10.455362
+Elapsed Time                      00:00:00.003712
+Compile Time                      00:00:00.003712
 Execution Time                    00:00:00.000000
 
 
@@ -1834,10 +1831,10 @@ HQC key=SELECT * FROM T042_ORDERLINE WHERE OL_O_ID = #NP# ;
 
 --- SQL command prepared.
 
-Start Time             2016/09/08 10:05:44.628323
-End Time               2016/09/08 10:05:44.628875
-Elapsed Time                      00:00:00.000552
-Compile Time                      00:00:00.000552
+Start Time             2016/10/19 02:41:10.663273
+End Time               2016/10/19 02:41:10.667240
+Elapsed Time                      00:00:00.003967
+Compile Time                      00:00:00.003967
 Execution Time                    00:00:00.000000
 
 
@@ -1878,7 +1875,7 @@ NUM_ENTRIES  TEXT_ENTRIES  NUM_PLANS
 NUM_ENTRIES  TEXT_ENTRIES  NUM_PLANS 
 -----------  ------------  ----------
 
-         22             0          22
+         31             0          31
           2             0           2
 
 --- 2 row(s) selected.
@@ -1891,7 +1888,7 @@ NUM_ENTRIES  TEXT_ENTRIES  NUM_PLANS
 -----------  ------------  ----------
 
          65            10          65
-         22             0          22
+         31             0          31
           2             0           2
 
 --- 3 row(s) selected.
@@ -1987,6 +1984,10 @@ NUM_HITS    NUM_PARAMS
          0           1
          0           1
          0           1
+         0           1
+         0           1
+         0           1
+         0           1
          0           2
          0           2
          0           2
@@ -1994,9 +1995,14 @@ NUM_HITS    NUM_PARAMS
          0           3
          0           3
          0           4
+         0           4
          0           5
          1           1
          1           1
+         1           1
+         1           1
+         1           1
+         1           1
          1           2
          1           2
          1           3
@@ -2006,9 +2012,9 @@ NUM_HITS    NUM_PARAMS
          2           1
          2           3
          3           3
-         9           4
+        12           4
 
---- 24 row(s) selected.
+--- 33 row(s) selected.
 >>select num_hits, num_params from table(querycacheentries('ustats', 'local')) order by 1,2;
 
 --- 0 row(s) selected.
@@ -2080,6 +2086,10 @@ NUM_HITS    NUM_PARAMS
          0           1
          0           1
          0           1
+         0           1
+         0           1
+         0           1
+         0           1
          0           2
          0           2
          0           2
@@ -2088,6 +2098,7 @@ NUM_HITS    NUM_PARAMS
          0           3
          0           3
          0           4
+         0           4
          0           5
          1           0
          1           1
@@ -2102,6 +2113,10 @@ NUM_HITS    NUM_PARAMS
          1           1
          1           1
          1           1
+         1           1
+         1           1
+         1           1
+         1           1
          1           2
          1           2
          1           2
@@ -2115,9 +2130,9 @@ NUM_HITS    NUM_PARAMS
          2           3
          3           3
          5           1
-         9           4
+        12           4
 
---- 99 row(s) selected.
+--- 108 row(s) selected.
 >>
 >>
 >>--Stats in Hybrid Query Cache
@@ -2134,7 +2149,7 @@ NUM_HKEYS   NUM_SKEYS   NUM_MAX_VALUES_PER_KEY  NUM_HASH_TABLE_BUCKETS
 NUM_HKEYS   NUM_SKEYS   NUM_MAX_VALUES_PER_KEY  NUM_HASH_TABLE_BUCKETS
 ----------  ----------  ----------------------  ----------------------
 
-        22          22                       5                     211
+        29          31                       5                     211
          2           2                       5                     211
 
 --- 2 row(s) selected.
@@ -2147,7 +2162,7 @@ NUM_HKEYS   NUM_SKEYS   NUM_MAX_VALUES_PER_KEY  NUM_HASH_TABLE_BUCKETS
 ----------  ----------  ----------------------  ----------------------
 
         37          60                       5                     211
-        22          22                       5                     211
+        29          31                       5                     211
          2           2                       5                     211
 
 --- 3 row(s) selected.
@@ -2228,6 +2243,7 @@ NUM_HKEYS   NUM_SKEYS   NUM_MAX_VALUES_PER_KEY  NUM_HASH_TABLE_BUCKETS
        134           1              1               0
        142           0              1               0
        142           1              1               0
+       163           0              4               0
        174           2              3               0
        174           3              3               0
        187           0              4               0
@@ -2238,6 +2254,14 @@ NUM_HKEYS   NUM_SKEYS   NUM_MAX_VALUES_PER_KEY  NUM_HASH_TABLE_BUCKETS
        208           0              5               0
        222           0              3               1
        222           1              3               1
+       270           0              1               0
+       270           1              1               0
+       282           0              1               0
+       282           1              1               0
+       308           0              1              10
+       308           0              1              10
+       308           1              1              10
+       308           1              1              10
        314           0              3               1
        314           0              3               1
        314           2              1               0
@@ -2249,7 +2273,7 @@ NUM_HKEYS   NUM_SKEYS   NUM_MAX_VALUES_PER_KEY  NUM_HASH_TABLE_BUCKETS
        619           0              1              14
        619           0              1              14
 
---- 24 row(s) selected.
+--- 33 row(s) selected.
 >>select char_length(hkey), num_hits, num_PLiterals,  num_NPLiterals from table(hybridquerycacheentries('ustats', 'local')) order by 1, 2, 3, 4;
 
 --- 0 row(s) selected.
@@ -2322,6 +2346,7 @@ NUM_HKEYS   NUM_SKEYS   NUM_MAX_VALUES_PER_KEY  NUM_HASH_TABLE_BUCKETS
        134           1              1               0
        142           0              1               0
        142           1              1               0
+       163           0              4               0
        174           2              3               0
        174           3              3               0
        187           0              4               0
@@ -2332,6 +2357,14 @@ NUM_HKEYS   NUM_SKEYS   NUM_MAX_VALUES_PER_KEY  NUM_HASH_TABLE_BUCKETS
        208           0              5               0
        222           0              3               1
        222           1              3               1
+       270           0              1               0
+       270           1              1               0
+       282           0              1               0
+       282           1              1               0
+       308           0              1              10
+       308           0              1              10
+       308           1              1              10
+       308           1              1              10
        314           0              3               1
        314           0              3               1
        314           2              1               0
@@ -2343,7 +2376,7 @@ NUM_HKEYS   NUM_SKEYS   NUM_MAX_VALUES_PER_KEY  NUM_HASH_TABLE_BUCKETS
        619           0              1              14
        619           0              1              14
 
---- 84 row(s) selected.
+--- 93 row(s) selected.
 >>
 >>
 >>-- virtual table ISP queries are not cacheable.

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/9a3cf2e5/core/sql/regress/core/EXPECTED005.SB
----------------------------------------------------------------------
diff --git a/core/sql/regress/core/EXPECTED005.SB b/core/sql/regress/core/EXPECTED005.SB
index 8b283d2..58987e7 100644
--- a/core/sql/regress/core/EXPECTED005.SB
+++ b/core/sql/regress/core/EXPECTED005.SB
@@ -1493,7 +1493,7 @@ S   OPERATOR              LC  RC  TAB_NAME
 CONTEXT   NUM_LOOKUPS  NUM_CACHE_HITS  NUM_ENTRIES  MAX_CACHE_SIZE
 --------  -----------  --------------  -----------  --------------
 
-NONE              165             135           16        20971520
+NONE              171             140           16        20971520
 
 --- 1 row(s) selected.
 >>
@@ -1568,7 +1568,7 @@ NONE              165             135           16        20971520
 NUM_LOOKUPS  NUM_CACHE_HITS  NUM_ENTRIES  MAX_CACHE_SIZE
 -----------  --------------  -----------  --------------
 
-        165             135            0        20971520
+        171             140            0        20971520
 
 --- 1 row(s) selected.
 >>