// append an ascii-version of Scan into cachewa.qryText_ void Scan::generateCacheKey(CacheWA &cwa) const { RelExpr::generateCacheKey(cwa); // Fix to 10-010618-3505, 10-010619-3515: include this Scan table's // RedefTime into cwa.qryText_ to make sure we get a cache hit only on // query that reference table(s) that have not changed since the query's // addition to the cache. The queries that reference altered table(s) // will never be hit again and will eventually age out of the cache. const NATable *tbl; if (cwa.getPhase() >= CmpMain::BIND && getTableDesc() && (tbl=getTableDesc()->getNATable()) != NULL) { char redefTime[40]; convertInt64ToAscii(tbl->getRedefTime(), redefTime); cwa += " redef:"; cwa += redefTime; if (tbl->isHiveTable()) { char lastModTime[40]; Int64 mTime = tbl->getClusteringIndex()->getHHDFSTableStats()->getModificationTS(); convertInt64ToAscii(mTime, lastModTime); cwa += " lastMod:"; cwa += lastModTime; cwa += " numFiles:"; char numFiles[20]; Int64 numberOfFiles = tbl->getClusteringIndex()->getHHDFSTableStats()->getNumFiles(); sprintf(numFiles, " %ld", numberOfFiles); cwa += numFiles ; } // save pointer to this table. later, QueryCache::addEntry will use // this pointer to get to this table's histograms's timestamp cwa.addTable( (NATable*)tbl ); // If PARTITION clause has been used we must reflect that in the key. if (tbl->isPartitionNameSpecified()) { cwa += " partition:"; cwa += tbl->getClusteringIndex()->getFileSetName().getQualifiedNameAsString().data(); } // If PARTITION range has been used we must reflect that in the key. else if (tbl->isPartitionRangeSpecified()) { cwa += " partition:"; char str[100]; sprintf(str, " from %d to %d", tbl->getExtendedQualName().getPartnClause().getBeginPartitionNumber() , tbl->getExtendedQualName().getPartnClause().getEndPartitionNumber()); cwa += str; } } // We must reflect userTableName_.location into cache key. // Otherwise, two queries which differ only in location such as // table table (table T058a, location $system.zsd12345.x1234500); // table table (table T058a, location $data .zsd12345.x1234500); // can confuse our query caching code to return a false hit and // cause fullstack/test058 to fail. cwa += userTableName_.getLocationName().data(); // Same with stream_ because queries like // "select * from t" and "select * from stream(t)" can // confuse query caching into a false hit causing test079 to fail. if (stream_) { cwa += " stream "; } // mark mpalias queries so they can be decached upon user request if (getTableDesc()->getNATable()->isAnMPTableWithAnsiName()) { cwa += AM_AN_MPALIAS_QUERY; } if (getHbaseAccessOptions()) { cwa += " hbaseVersions: "; char numVersions[20]; sprintf(numVersions, " %d", getHbaseAccessOptions()->getHbaseVersions()); cwa += numVersions ; } }