You've already forked mariadb-columnstore-engine
							
							
				mirror of
				https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
				synced 2025-10-30 07:25:34 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			6407 lines
		
	
	
		
			217 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			6407 lines
		
	
	
		
			217 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* Copyright (C) 2014 InfiniDB, Inc.
 | |
|    Copyright (C) 2019 MariaDB Corporation
 | |
| 
 | |
|    This program is free software; you can redistribute it and/or
 | |
|    modify it under the terms of the GNU General Public License
 | |
|    as published by the Free Software Foundation; version 2 of
 | |
|    the License.
 | |
| 
 | |
|    This program is distributed in the hope that it will be useful,
 | |
|    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|    GNU General Public License for more details.
 | |
| 
 | |
|    You should have received a copy of the GNU General Public License
 | |
|    along with this program; if not, write to the Free Software
 | |
|    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 | |
|    MA 02110-1301, USA. */
 | |
| 
 | |
| /***********************************************************************
 | |
|  *   $Id: calpontsystemcatalog.cpp 9594 2013-06-04 18:19:21Z pleblanc $
 | |
|  *
 | |
|  *
 | |
|  ***********************************************************************/
 | |
| 
 | |
| #include <unistd.h>
 | |
| #include <stdexcept>
 | |
| #include <string>
 | |
| #include <iostream>
 | |
| 
 | |
| using namespace std;
 | |
| 
 | |
| #include "messagequeue.h"
 | |
| #include "calpontsystemcatalog.h"
 | |
| #include "dataconvert.h"
 | |
| #include "ddlpkg.h"
 | |
| #include "expressionparser.h"
 | |
| #include "calpontselectexecutionplan.h"
 | |
| #include "calpontselectexecutionplan.h"
 | |
| #include "clientrotator.h"
 | |
| #include "simplefilter.h"
 | |
| #include "simplecolumn.h"
 | |
| #include "expressionparser.h"
 | |
| #include "constantcolumn.h"
 | |
| #include "treenode.h"
 | |
| #include "operator.h"
 | |
| #include "sessionmanager.h"
 | |
| #include "columnresult.h"
 | |
| 
 | |
| #include "joblistfactory.h"
 | |
| #include "joblist.h"
 | |
| #include "distributedenginecomm.h"
 | |
| #include "resourcemanager.h"
 | |
| using namespace joblist;
 | |
| 
 | |
| #include "bytestream.h"
 | |
| #include "messagequeue.h"
 | |
| #include "messagequeuepool.h"
 | |
| using namespace messageqcpp;
 | |
| 
 | |
| #include "configcpp.h"
 | |
| #include "liboamcpp.h"
 | |
| using namespace config;
 | |
| 
 | |
| #include "exceptclasses.h"
 | |
| #include "idberrorinfo.h"
 | |
| #include "errorids.h"
 | |
| using namespace logging;
 | |
| 
 | |
| #include "rowgroup.h"
 | |
| using namespace rowgroup;
 | |
| 
 | |
| #include "installdir.h"
 | |
| 
 | |
| #include <boost/thread/thread.hpp>
 | |
| #include <boost/thread/mutex.hpp>
 | |
| #include <boost/version.hpp>
 | |
| 
 | |
| #undef BAIL_IF_0
 | |
| #if 1
 | |
| // We are unlikely to ever get anything more out of this connection, so bail out
 | |
| #define BAIL_IF_0(m)                               \
 | |
|   if ((m).length() == 0)                           \
 | |
|   {                                                \
 | |
|     fExeMgr->shutdown();                           \
 | |
|     throw runtime_error("CALPONT_INTERNAL_ERROR"); \
 | |
|   }
 | |
| #else
 | |
| #define BAIL_IF_0(m)
 | |
| #endif
 | |
| 
 | |
| #undef CSC_DEBUG
 | |
| #define CSC_DEBUG 0
 | |
| #if CSC_DEBUG
 | |
| namespace
 | |
| {
 | |
| string tmpDir = startup::StartUp::tmpDir() + "/csc.log";
 | |
| std::ofstream csclog(tmpDir, std::ios::app);
 | |
| }  // namespace
 | |
| #define DEBUG csclog
 | |
| #else
 | |
| #define DEBUG \
 | |
|   if (false)  \
 | |
|   cerr
 | |
| #endif
 | |
| 
 | |
| namespace execplan
 | |
| {
 | |
| const SOP opeq(new Operator("="));
 | |
| 
 | |
| const string colDataTypeToString(CalpontSystemCatalog::ColDataType cdt)
 | |
| {
 | |
|   switch (cdt)
 | |
|   {
 | |
|     case CalpontSystemCatalog::BIT: return "bit"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::TINYINT: return "tinyint"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::CHAR: return "char"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::SMALLINT: return "smallint"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::DECIMAL: return "decimal"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::MEDINT: return "medint"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::INT: return "int"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::FLOAT: return "float"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::DATE: return "date"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::BIGINT: return "bigint"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::DOUBLE: return "double"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::LONGDOUBLE: return "long double"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::DATETIME: return "datetime"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::TIME: return "time"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::TIMESTAMP: return "timestamp"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::VARCHAR: return "varchar"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::VARBINARY: return "varbinary"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::CLOB: return "clob"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::BLOB: return "blob"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::TEXT: return "text"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::UTINYINT: return "utinyint"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::USMALLINT: return "usmallint"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::UDECIMAL: return "udecimal"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::UMEDINT: return "umedint"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::UINT: return "uint32_t"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::UFLOAT: return "ufloat"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::UBIGINT: return "ubigint"; break;
 | |
| 
 | |
|     case CalpontSystemCatalog::UDOUBLE: return "udouble"; break;
 | |
| 
 | |
|     default: break;
 | |
|   }
 | |
| 
 | |
|   return "invalid!";
 | |
| }
 | |
| 
 | |
| }  // namespace execplan
 | |
| 
 | |
| namespace execplan
 | |
| {
 | |
| typedef CalpontSelectExecutionPlan::ColumnMap::value_type CMVT_;
 | |
| 
 | |
| boost::shared_ptr<SessionManager> fSessionManager;
 | |
| CalpontSystemCatalog::NJLSysDataList::~NJLSysDataList()
 | |
| {
 | |
|   NJLSysDataVector::iterator it;
 | |
| 
 | |
|   for (it = sysDataVec.begin(); it != sysDataVec.end(); it++)
 | |
|     delete *it;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::TableColName make_tcn(const string& s, const string& t, const string& c,
 | |
|                                                   int lower_case_table_names)
 | |
| {
 | |
|   CalpontSystemCatalog::TableColName tcns;
 | |
| 
 | |
|   tcns.schema = s;
 | |
|   tcns.table = t;
 | |
|   tcns.column = c;
 | |
|   if (lower_case_table_names)
 | |
|   {
 | |
|     boost::algorithm::to_lower(tcns.schema);
 | |
|     boost::algorithm::to_lower(tcns.table);
 | |
|   }
 | |
|   boost::algorithm::to_lower(tcns.column);
 | |
|   return tcns;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::TableName make_table(const string& s, const string& t, int lower_case_table_names)
 | |
| {
 | |
|   CalpontSystemCatalog::TableName tn;
 | |
|   tn.schema = s;
 | |
|   tn.table = t;
 | |
|   if (lower_case_table_names)
 | |
|   {
 | |
|     boost::algorithm::to_lower(tn.schema);
 | |
|     boost::algorithm::to_lower(tn.table);
 | |
|   }
 | |
|   return tn;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::TableAliasName make_aliastable(const string& s, const string& t, const string& a,
 | |
|                                                            const bool isColumnStore,
 | |
|                                                            int lower_case_table_names)
 | |
| {
 | |
|   CalpontSystemCatalog::TableAliasName tn;
 | |
|   tn.schema = s;
 | |
|   tn.table = t;
 | |
|   tn.alias = a;
 | |
|   tn.view = "";
 | |
|   tn.fisColumnStore = isColumnStore;
 | |
|   if (lower_case_table_names)
 | |
|   {
 | |
|     boost::algorithm::to_lower(tn.schema);
 | |
|     boost::algorithm::to_lower(tn.table);
 | |
|     boost::algorithm::to_lower(tn.alias);
 | |
|   }
 | |
|   return tn;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::TableAliasName make_aliasview(const string& s, const string& t, const string& a,
 | |
|                                                           const string& v, const bool isColumnStore,
 | |
|                                                           int lower_case_table_names)
 | |
| {
 | |
|   CalpontSystemCatalog::TableAliasName tn;
 | |
|   tn.schema = s;
 | |
|   tn.table = t;
 | |
|   tn.alias = a;
 | |
|   tn.view = v;
 | |
|   tn.fisColumnStore = isColumnStore;
 | |
|   if (lower_case_table_names)
 | |
|   {
 | |
|     boost::algorithm::to_lower(tn.schema);
 | |
|     boost::algorithm::to_lower(tn.table);
 | |
|     boost::algorithm::to_lower(tn.alias);
 | |
|     boost::algorithm::to_lower(tn.view);
 | |
|   }
 | |
|   return tn;
 | |
| }
 | |
| 
 | |
| bool CalpontSystemCatalog::TableColName::operator<(const TableColName& rhs) const
 | |
| {
 | |
|   if (schema < rhs.schema)
 | |
|   {
 | |
|     return true;
 | |
|   }
 | |
|   else if (schema == rhs.schema)
 | |
|   {
 | |
|     if (table < rhs.table)
 | |
|     {
 | |
|       return true;
 | |
|     }
 | |
|     else if (table == rhs.table)
 | |
|     {
 | |
|       if (column < rhs.column)
 | |
|       {
 | |
|         return true;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| const string CalpontSystemCatalog::TableColName::toString() const
 | |
| {
 | |
|   string os;
 | |
|   os = schema + '.' + table + '.' + column;
 | |
|   return os;
 | |
| }
 | |
| 
 | |
| bool CalpontSystemCatalog::TableName::operator<(const TableName& rhs) const
 | |
| {
 | |
|   if (schema < rhs.schema)
 | |
|   {
 | |
|     return true;
 | |
|   }
 | |
|   else if (schema == rhs.schema)
 | |
|   {
 | |
|     if (table < rhs.table)
 | |
|     {
 | |
|       return true;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| void CalpontSystemCatalog::TableAliasName::clear()
 | |
| {
 | |
|   schema.clear();
 | |
|   table.clear();
 | |
|   alias.clear();
 | |
|   view.clear();
 | |
| }
 | |
| 
 | |
| bool CalpontSystemCatalog::TableAliasName::operator<(const TableAliasName& rhs) const
 | |
| {
 | |
|   if (schema < rhs.schema)
 | |
|   {
 | |
|     return true;
 | |
|   }
 | |
|   else if (schema == rhs.schema)
 | |
|   {
 | |
|     if (table < rhs.table)
 | |
|     {
 | |
|       return true;
 | |
|     }
 | |
|     else if (table == rhs.table)
 | |
|     {
 | |
|       if (alias < rhs.alias)
 | |
|       {
 | |
|         return true;
 | |
|       }
 | |
|       else if (alias == rhs.alias)
 | |
|       {
 | |
|         if (view < rhs.view)
 | |
|         {
 | |
|           return true;
 | |
|         }
 | |
|         else if (view == rhs.view)
 | |
|         {
 | |
|           if (partitions < rhs.partitions)
 | |
|           {
 | |
|             return true;
 | |
|           }
 | |
|           if (partitions == rhs.partitions)
 | |
|           {
 | |
|             if (fisColumnStore < rhs.fisColumnStore)
 | |
|               return true;
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| void CalpontSystemCatalog::TableAliasName::serialize(messageqcpp::ByteStream& b) const
 | |
| {
 | |
|   b << schema;
 | |
|   b << table;
 | |
|   b << alias;
 | |
|   b << view;
 | |
|   b << static_cast<ByteStream::doublebyte>(fisColumnStore);
 | |
|   partitions.serialize(b);
 | |
| }
 | |
| 
 | |
| void CalpontSystemCatalog::TableAliasName::unserialize(messageqcpp::ByteStream& b)
 | |
| {
 | |
|   b >> schema;
 | |
|   b >> table;
 | |
|   b >> alias;
 | |
|   b >> view;
 | |
|   b >> reinterpret_cast<ByteStream::doublebyte&>(fisColumnStore);
 | |
|   partitions.unserialize(b);
 | |
| }
 | |
| 
 | |
| /*static*/
 | |
| boost::mutex CalpontSystemCatalog::map_mutex;
 | |
| /*static*/
 | |
| CalpontSystemCatalog::CatalogMap CalpontSystemCatalog::fCatalogMap;
 | |
| /*static*/
 | |
| uint32_t CalpontSystemCatalog::fModuleID = numeric_limits<uint32_t>::max();
 | |
| 
 | |
| CalpontSystemCatalog::OID CalpontSystemCatalog::lookupTableOID(const TableName& tablename,
 | |
|                                                                int lower_case_table_names)
 | |
| {
 | |
|   TableName aTableName;
 | |
|   aTableName.schema = tablename.schema;
 | |
|   aTableName.table = tablename.table;
 | |
|   if (lower_case_table_names)
 | |
|   {
 | |
|     boost::algorithm::to_lower(aTableName.schema);
 | |
|     boost::algorithm::to_lower(aTableName.table);
 | |
|   }
 | |
| 
 | |
|   if (aTableName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|     DEBUG << "Enter tableInfo: " << tablename.schema << "|" << tablename.table << endl;
 | |
| 
 | |
|   // select objectid from systable where schema = tableName.schema and tablename = tableName.table;
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + OBJECTID_COL, fSessionID);
 | |
|   SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|   SimpleColumn* c3 =
 | |
|       new SimpleColumn(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
| 
 | |
|   SRCP srcp;
 | |
|   srcp.reset(c1);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + OBJECTID_COL, srcp));
 | |
|   srcp.reset(c2);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + SCHEMA_COL, srcp));
 | |
|   srcp.reset(c3);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + TABLENAME_COL, srcp));
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   srcp.reset(c1->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   csep.returnedCols(returnedColumnList);
 | |
|   OID oid = c1->oid();
 | |
| 
 | |
|   // Filters
 | |
|   SimpleFilter* f1 =
 | |
|       new SimpleFilter(opeq, c2->clone(), new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f1);
 | |
|   filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|   SimpleFilter* f2 =
 | |
|       new SimpleFilter(opeq, c3->clone(), new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f2);
 | |
|   csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|   ostringstream oss;
 | |
|   oss << "select objectid from systable where schema='" << aTableName.schema << "' and tablename='"
 | |
|       << aTableName.table << "' --tableRID/";
 | |
| 
 | |
|   csep.data(oss.str());  //@bug 6078. Log the statement
 | |
| 
 | |
|   if (fIdentity == EC)
 | |
|     oss << "EC";
 | |
|   else
 | |
|     oss << "FE";
 | |
| 
 | |
|   NJLSysDataList sysDataList;
 | |
| 
 | |
|   try
 | |
|   {
 | |
|     getSysData(csep, sysDataList, SYSTABLE_TABLE);
 | |
|   }
 | |
|   catch (IDBExcept&)
 | |
|   {
 | |
|     throw;
 | |
|   }
 | |
|   catch (runtime_error& e)
 | |
|   {
 | |
|     throw runtime_error(e.what());
 | |
|   }
 | |
| 
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->dataCount() == 0)
 | |
|     {
 | |
|       return (OID)0;
 | |
|     }
 | |
| 
 | |
|     if ((*it)->ColumnOID() == oid)
 | |
|     {
 | |
|       if (fIdentity == EC)
 | |
|         return (*it)->GetRid(0);
 | |
|       else
 | |
|         return (OID)((*it)->GetData(0));
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return (OID)0;
 | |
| }
 | |
| 
 | |
| CalpontSystemCatalog::OID CalpontSystemCatalog::lookupOID(const TableColName& tableColName,
 | |
|                                                           int lower_case_table_names)
 | |
| {
 | |
|   if (tableColName.schema.length() == 0 || tableColName.table.length() == 0 ||
 | |
|       tableColName.column.length() == 0)
 | |
|     return -1;
 | |
| 
 | |
|   TableColName aTableColName;
 | |
|   aTableColName.schema = tableColName.schema;
 | |
|   aTableColName.table = tableColName.table;
 | |
|   aTableColName.column = tableColName.column;
 | |
|   if (lower_case_table_names)
 | |
|   {
 | |
|     boost::algorithm::to_lower(aTableColName.schema);
 | |
|     boost::algorithm::to_lower(aTableColName.table);
 | |
|   }
 | |
|   boost::algorithm::to_lower(aTableColName.column);
 | |
| 
 | |
|   if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|     DEBUG << "Enter lookupOID: " << tableColName.schema << "|" << tableColName.table << "|"
 | |
|           << tableColName.column << endl;
 | |
| 
 | |
|   // Check whether cache needs to be flushed
 | |
|   if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|   {
 | |
|     checkSysCatVer();
 | |
|   }
 | |
| 
 | |
|   boost::mutex::scoped_lock lk2(fOIDmapLock);
 | |
| 
 | |
|   if (fOIDmap.size() > 0)
 | |
|   {
 | |
|     OIDmap::const_iterator iter = fOIDmap.find(aTableColName);
 | |
| 
 | |
|     // @bug 1358. double check fColRIDMap in case it's not filled with valid rid.
 | |
|     if (iter != fOIDmap.end())
 | |
|     {
 | |
|       if (fIdentity == EC && aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|       {
 | |
|         ColRIDmap::const_iterator iter1 = fColRIDmap.find(aTableColName);
 | |
| 
 | |
|         if (iter1 != fColRIDmap.end())
 | |
|         {
 | |
|           return iter->second;
 | |
|         }
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         return iter->second;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   lk2.unlock();
 | |
| 
 | |
|   // select objectid,columnlength,datatype,dictobjectid,listobjectid,treeobjectid,columnposition,scale,prec,
 | |
|   //    defaultvalue from syscolumn where schema=schema and tablename=table and columnname=column;
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   string columnlength = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLUMNLEN_COL;
 | |
|   string objectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + OBJECTID_COL;
 | |
|   string datatype = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + DATATYPE_COL;
 | |
|   string dictobjectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + DICTOID_COL;
 | |
|   string listobjectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + LISTOBJID_COL;
 | |
|   string treeobjectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TREEOBJID_COL;
 | |
|   string columnposition = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLUMNPOS_COL;
 | |
|   string scale = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + SCALE_COL;
 | |
|   string precision = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + PRECISION_COL;
 | |
|   string defaultvalue = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + DEFAULTVAL_COL;
 | |
|   // the following columns will be save in cache although it's not needed for now
 | |
|   string columnname = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLNAME_COL;
 | |
|   string tablename = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TABLENAME_COL;
 | |
|   string schemaname = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + SCHEMA_COL;
 | |
|   string compressiontype = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COMPRESSIONTYPE_COL;
 | |
|   string autoincrement = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + AUTOINC_COL;
 | |
|   string nextVal = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + NEXTVALUE_COL;
 | |
|   string nullable = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + NULLABLE_COL;
 | |
|   string charsetnum = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + CHARSETNUM_COL;
 | |
| 
 | |
|   SimpleColumn* col[18];
 | |
|   col[0] = new SimpleColumn(columnlength, fSessionID);
 | |
|   col[1] = new SimpleColumn(objectid, fSessionID);
 | |
|   col[2] = new SimpleColumn(datatype, fSessionID);
 | |
|   col[3] = new SimpleColumn(dictobjectid, fSessionID);
 | |
|   col[4] = new SimpleColumn(listobjectid, fSessionID);
 | |
|   col[5] = new SimpleColumn(treeobjectid, fSessionID);
 | |
|   col[6] = new SimpleColumn(columnposition, fSessionID);
 | |
|   col[7] = new SimpleColumn(scale, fSessionID);
 | |
|   col[8] = new SimpleColumn(precision, fSessionID);
 | |
|   col[9] = new SimpleColumn(defaultvalue, fSessionID);
 | |
|   col[10] = new SimpleColumn(schemaname, fSessionID);
 | |
|   col[11] = new SimpleColumn(tablename, fSessionID);
 | |
|   col[12] = new SimpleColumn(columnname, fSessionID);
 | |
|   col[13] = new SimpleColumn(compressiontype, fSessionID);
 | |
|   col[14] = new SimpleColumn(autoincrement, fSessionID);
 | |
|   col[15] = new SimpleColumn(nextVal, fSessionID);
 | |
|   col[16] = new SimpleColumn(nullable, fSessionID);
 | |
|   col[17] = new SimpleColumn(charsetnum, fSessionID);
 | |
| 
 | |
|   SRCP srcp;
 | |
|   srcp.reset(col[0]);
 | |
|   colMap.insert(CMVT_(columnlength, srcp));
 | |
|   srcp.reset(col[1]);
 | |
|   colMap.insert(CMVT_(objectid, srcp));
 | |
|   srcp.reset(col[2]);
 | |
|   colMap.insert(CMVT_(datatype, srcp));
 | |
|   srcp.reset(col[3]);
 | |
|   colMap.insert(CMVT_(dictobjectid, srcp));
 | |
|   srcp.reset(col[4]);
 | |
|   colMap.insert(CMVT_(listobjectid, srcp));
 | |
|   srcp.reset(col[5]);
 | |
|   colMap.insert(CMVT_(treeobjectid, srcp));
 | |
|   srcp.reset(col[6]);
 | |
|   colMap.insert(CMVT_(columnposition, srcp));
 | |
|   srcp.reset(col[7]);
 | |
|   colMap.insert(CMVT_(scale, srcp));
 | |
|   srcp.reset(col[8]);
 | |
|   colMap.insert(CMVT_(precision, srcp));
 | |
|   // TODO: NULL value handling
 | |
|   srcp.reset(col[9]);
 | |
|   colMap.insert(CMVT_(defaultvalue, srcp));
 | |
|   srcp.reset(col[10]);
 | |
|   colMap.insert(CMVT_(schemaname, srcp));
 | |
|   srcp.reset(col[11]);
 | |
|   colMap.insert(CMVT_(tablename, srcp));
 | |
|   srcp.reset(col[12]);
 | |
|   colMap.insert(CMVT_(columnname, srcp));
 | |
|   srcp.reset(col[13]);
 | |
|   colMap.insert(CMVT_(compressiontype, srcp));
 | |
|   srcp.reset(col[14]);
 | |
|   colMap.insert(CMVT_(autoincrement, srcp));
 | |
|   srcp.reset(col[15]);
 | |
|   colMap.insert(CMVT_(nextVal, srcp));
 | |
|   srcp.reset(col[16]);
 | |
|   colMap.insert(CMVT_(nullable, srcp));
 | |
|   srcp.reset(col[17]);
 | |
|   colMap.insert(CMVT_(charsetnum, srcp));
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   // ignore returnedcolumn, because it's not read by Joblist for now
 | |
|   csep.returnedCols(returnedColumnList);
 | |
|   OID oid[18];
 | |
| 
 | |
|   for (int i = 0; i < 18; i++)
 | |
|     oid[i] = col[i]->oid();
 | |
| 
 | |
|   // Filters
 | |
|   SimpleFilter* f1 = new SimpleFilter(opeq, col[10]->clone(),
 | |
|                                       new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f1);
 | |
|   filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|   SimpleFilter* f2 = new SimpleFilter(opeq, col[11]->clone(),
 | |
|                                       new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f2);
 | |
|   filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|   SimpleFilter* f3 = new SimpleFilter(opeq, col[12]->clone(),
 | |
|                                       new ConstantColumn(aTableColName.column, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f3);
 | |
|   csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|   ostringstream oss;
 | |
|   oss << "select objectid,columnlength,datatype,dictobjectid,listobjectid,treeobjectid,columnposition,scale,"
 | |
|          "prec,defaultvalue from syscolumn where schema='"
 | |
|       << aTableColName.schema << "' and tablename='" << aTableColName.table << "' and columnname='"
 | |
|       << aTableColName.column << "' --lookupOID/";
 | |
| 
 | |
|   if (fIdentity == EC)
 | |
|     oss << "EC";
 | |
|   else
 | |
|     oss << "FE";
 | |
| 
 | |
|   csep.data(oss.str());
 | |
|   NJLSysDataList sysDataList;
 | |
|   TableColName tcn;
 | |
|   ColType ct;
 | |
|   OID coloid = -1;
 | |
|   getSysData(csep, sysDataList, SYSCOLUMN_TABLE);
 | |
| 
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == oid[1])
 | |
|     {
 | |
|       // populate cache
 | |
|       coloid = (OID)((*it)->GetData(0));
 | |
|       lk2.lock();
 | |
|       fOIDmap[aTableColName] = coloid;
 | |
| 
 | |
|       if (fIdentity == EC)
 | |
|         fColRIDmap[aTableColName] = (*it)->GetRid(0);
 | |
| 
 | |
|       // @bug 1358. do not insert this entry to map
 | |
|       // else
 | |
|       //    fColRIDmap[aTableColName] = 0;
 | |
|       lk2.unlock();
 | |
|     }
 | |
| 
 | |
|     if ((*it)->ColumnOID() == oid[0])
 | |
|       ct.colWidth = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[2])
 | |
|       ct.colDataType = (ColDataType)((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[3])
 | |
|       ct.ddn.dictOID = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[4])
 | |
|       ct.ddn.listOID = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[5])
 | |
|       ct.ddn.treeOID = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[6])
 | |
|       ct.colPosition = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[7])
 | |
|       ct.scale = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[8])
 | |
|       ct.precision = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[13])
 | |
|       ct.compressionType = ct.ddn.compressionType = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[14])
 | |
|     {
 | |
|       ostringstream os;
 | |
|       os << (char)(*it)->GetData(0);
 | |
| 
 | |
|       if (os.str().compare("y") == 0)
 | |
|         ct.autoincrement = true;
 | |
|       else
 | |
|         ct.autoincrement = false;
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[15])
 | |
|       ct.nextvalue = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[16])
 | |
|     {
 | |
|       if (static_cast<ConstraintType>((*it)->GetData(0)) == 0)
 | |
|       {
 | |
|         ct.constraintType = NOTNULL_CONSTRAINT;
 | |
|       }
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[17])
 | |
|       ct.charsetNumber = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_DEFAULTVAL)
 | |
|     {
 | |
|       ct.defaultValue = ((*it)->GetStringData(0));
 | |
| 
 | |
|       if (!ct.defaultValue.isNull())
 | |
|       {
 | |
|         if (ct.constraintType != NOTNULL_CONSTRAINT)
 | |
|           ct.constraintType = DEFAULT_CONSTRAINT;
 | |
|       }
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_SCHEMA)
 | |
|       tcn.schema = ((*it)->GetStringData(0).safeString(""));
 | |
|     else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_TABLENAME)
 | |
|       tcn.table = ((*it)->GetStringData(0).safeString(""));
 | |
|     else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_COLNAME)
 | |
|       tcn.column = ((*it)->GetStringData(0).safeString(""));
 | |
|   }
 | |
| 
 | |
|   // temporialy memory leak fix until defaultvalue is added.
 | |
|   // delete col[9];
 | |
|   ct.columnOID = coloid;
 | |
|   // populate colinfomap cache and oidbitmap
 | |
|   boost::mutex::scoped_lock lk3(fColinfomapLock);
 | |
|   fColinfomap[coloid] = ct;
 | |
|   return coloid;
 | |
| }
 | |
| 
 | |
| void CalpontSystemCatalog::getSysData(CalpontSelectExecutionPlan& csep, NJLSysDataList& sysDataList,
 | |
|                                       const string& sysTableName)
 | |
| {
 | |
|   // start up new transaction
 | |
| 
 | |
|   BRM::TxnID txnID;
 | |
|   int oldTxnID;
 | |
|   txnID = fSessionManager->getTxnID(fSessionID);
 | |
| 
 | |
|   if (!txnID.valid)
 | |
|   {
 | |
|     txnID.id = 0;
 | |
|     txnID.valid = true;
 | |
|   }
 | |
| 
 | |
|   BRM::QueryContext verID, oldVerID;
 | |
|   verID = fSessionManager->verID();
 | |
|   oldTxnID = csep.txnID();
 | |
|   csep.txnID(txnID.id);
 | |
|   oldVerID = csep.verID();
 | |
|   csep.verID(verID);
 | |
|   // We need to use a session ID that's separate from the actual query SID, because the dbcon runs queries
 | |
|   //  in the middle of receiving data bands for the real query.
 | |
|   // TODO: we really need a flag or something to identify this as a syscat query: there are assumptions made
 | |
|   // in joblist that a high-bit-set session id is always a syscat query. This will be okay for a long time,
 | |
|   // but not forever...
 | |
| 
 | |
|   csep.sessionID(fSessionID | 0x80000000);
 | |
|   int tryCnt = 0;
 | |
| 
 | |
|   // add the tableList to csep for tuple joblist to use
 | |
|   CalpontSelectExecutionPlan::TableList tablelist;
 | |
|   tablelist.push_back(make_aliastable("calpontsys", sysTableName, ""));
 | |
|   csep.tableList(tablelist);
 | |
| 
 | |
|   // populate the returned column list as column map
 | |
|   csep.returnedCols().clear();
 | |
|   CalpontSelectExecutionPlan::ColumnMap::const_iterator it;
 | |
| 
 | |
|   for (it = csep.columnMap().begin(); it != csep.columnMap().end(); ++it)
 | |
|   {
 | |
|     csep.returnedCols().push_back(it->second);
 | |
|   }
 | |
| 
 | |
|   if (fIdentity == EC)
 | |
|   {
 | |
|     try
 | |
|     {
 | |
|       getSysData_EC(csep, sysDataList, sysTableName);
 | |
|     }
 | |
|     catch (IDBExcept&)
 | |
|     {
 | |
|       throw;
 | |
|     }
 | |
|     catch (runtime_error& e)
 | |
|     {
 | |
|       throw runtime_error(e.what());
 | |
|     }
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     while (tryCnt < 5)
 | |
|     {
 | |
|       tryCnt++;
 | |
| 
 | |
|       try
 | |
|       {
 | |
|         getSysData_FE(csep, sysDataList, sysTableName);
 | |
|         break;
 | |
|       }
 | |
|       catch (IDBExcept&)  // error already occurred. this is not a broken pipe
 | |
|       {
 | |
|         throw;
 | |
|       }
 | |
|       catch (...)
 | |
|       {
 | |
|         // may be a broken pipe. re-establish exeMgr and send the message
 | |
|         delete fExeMgr;
 | |
|         fExeMgr = new ClientRotator(0, "ExeMgr");
 | |
| 
 | |
|         try
 | |
|         {
 | |
|           fExeMgr->connect(5);
 | |
|         }
 | |
|         catch (...)
 | |
|         {
 | |
|           throw IDBExcept(ERR_LOST_CONN_EXEMGR);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     if (tryCnt >= 5){
 | |
|       // throw runtime_error("Error occurred when calling system catalog. ExeMgr is not functioning.");
 | |
|       Message::Args args;
 | |
|       args.add("Cannot connect to ExeMgr re-connections tries exceeded");
 | |
|       throw IDBExcept(ERR_SYSTEM_CATALOG, args);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   csep.sessionID(fSessionID);
 | |
|   csep.txnID(oldTxnID);
 | |
|   csep.verID(oldVerID);
 | |
| }
 | |
| 
 | |
| void CalpontSystemCatalog::getSysData_EC(CalpontSelectExecutionPlan& csep, NJLSysDataList& sysDataList,
 | |
|                                          const string& /*sysTableName*/)
 | |
| {
 | |
|   DEBUG << "Enter getSysData_EC " << fSessionID << endl;
 | |
| 
 | |
|   uint32_t tableOID = IDB_VTABLE_ID;
 | |
|   ByteStream bs;
 | |
|   uint32_t status;
 | |
| 
 | |
|   ResourceManager* rm = ResourceManager::instance(true);
 | |
|   DistributedEngineComm* fEc = DistributedEngineComm::instance(rm);
 | |
|   PrimitiveServerThreadPools dummyPrimitiveServerThreadPools;
 | |
| 
 | |
|   SJLP jl = JobListFactory::makeJobList(&csep, rm, dummyPrimitiveServerThreadPools, true);
 | |
|   //@bug 2221. Work around to prevent DMLProc crash.
 | |
|   int retryNum = 0;
 | |
| 
 | |
|   while (jl->status() != 0)
 | |
|   {
 | |
|     if (retryNum >= 6)
 | |
|       throw runtime_error("Error occurred when calling makeJobList");
 | |
| 
 | |
|     sleep(1);
 | |
|     jl = JobListFactory::makeJobList(&csep, rm, dummyPrimitiveServerThreadPools, true);
 | |
|     retryNum++;
 | |
|   }
 | |
| 
 | |
|   if (jl->status() != 0 || jl->putEngineComm(fEc) != 0)
 | |
|   {
 | |
|     string emsg = jl->errMsg();
 | |
|     throw runtime_error("Error occurred when calling system catalog (1). " + emsg);
 | |
|   }
 | |
| 
 | |
|   if (jl->doQuery() != 0)
 | |
|   {
 | |
|     throw runtime_error(
 | |
|         "Error occurred when calling system catalog (2). Make sure all processes are running.");
 | |
|   }
 | |
| 
 | |
|   TupleJobList* tjlp = dynamic_cast<TupleJobList*>(jl.get());
 | |
|   idbassert(tjlp);
 | |
|   RowGroup rowGroup = tjlp->getOutputRowGroup();
 | |
|   RGData rgData;
 | |
| 
 | |
|   while (true)
 | |
|   {
 | |
|     bs.restart();
 | |
|     uint32_t rowCount = jl->projectTable(tableOID, bs);
 | |
| 
 | |
|     // XXXST: take out the 'true' when all jobsteps have been made st-compatible.
 | |
|     rgData.deserialize(bs, true);
 | |
|     rowGroup.setData(&rgData);
 | |
| 
 | |
|     // rowGroup.setData(const_cast<uint8_t*>(bs.buf()));
 | |
|     if ((status = rowGroup.getStatus()) != 0)
 | |
|     {
 | |
|       if (status >= 1000)  // new error system
 | |
|         throw IDBExcept(status);
 | |
|       else{
 | |
|         Message::Args args;
 | |
|         args.add("rowGroup status: " + std::to_string(status));
 | |
|         throw IDBExcept(ERR_SYSTEM_CATALOG, args);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     if (rowCount > 0)
 | |
|       rowGroup.addToSysDataList(sysDataList);
 | |
|     else
 | |
|       break;
 | |
|   }
 | |
| }
 | |
| 
 | |
| void CalpontSystemCatalog::getSysData_FE(const CalpontSelectExecutionPlan& csep, NJLSysDataList& sysDataList,
 | |
|                                          const string& sysTableName)
 | |
| {
 | |
|   DEBUG << "Enter getSysData_FE " << fSessionID << endl;
 | |
| 
 | |
|   ByteStream msg;
 | |
| 
 | |
|   // send code to indicat tuple
 | |
|   ByteStream::quadbyte qb = 4;
 | |
|   msg << qb;
 | |
|   fExeMgr->write(msg);
 | |
|   msg.restart();
 | |
| 
 | |
|   // Send the CalpontSelectExecutionPlan to ExeMgr.
 | |
|   csep.serialize(msg);
 | |
|   fExeMgr->write(msg);
 | |
| 
 | |
|   // Get the table oid for the system table being queried.
 | |
|   TableName tableName;
 | |
|   tableName.schema = CALPONT_SCHEMA;
 | |
|   tableName.table = sysTableName;
 | |
|   uint32_t tableOID = IDB_VTABLE_ID;
 | |
|   uint16_t status = 0;
 | |
| 
 | |
|   // Send the request for the table.
 | |
|   qb = static_cast<ByteStream::quadbyte>(tableOID);
 | |
|   ByteStream bs;
 | |
|   bs << qb;
 | |
|   fExeMgr->write(bs);
 | |
|   boost::scoped_ptr<rowgroup::RowGroup> rowGroup;
 | |
|   RGData rgData;
 | |
| 
 | |
|   msg.restart();
 | |
|   bs.restart();
 | |
|   msg = fExeMgr->read();
 | |
|   bs = fExeMgr->read();
 | |
| 
 | |
|   if (bs.length() == 0)
 | |
|   {
 | |
|     Message::Args args;
 | |
|     args.add("look in error.log on node, having dbroot1");
 | |
|     throw IDBExcept(ERR_LOST_CONN_EXEMGR, args);
 | |
|   }
 | |
| 
 | |
|   string emsgStr;
 | |
|   bs >> emsgStr;
 | |
|   bool err = false;
 | |
| 
 | |
|   if (msg.length() == 4)
 | |
|   {
 | |
|     msg >> qb;
 | |
| 
 | |
|     if (qb != 0)
 | |
|       err = true;
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     err = true;
 | |
|   }
 | |
| 
 | |
|   if (err)
 | |
|   {
 | |
|     throw runtime_error(emsgStr);
 | |
|   }
 | |
| 
 | |
|   while (true)
 | |
|   {
 | |
|     bs.restart();
 | |
|     bs = fExeMgr->read();
 | |
| 
 | |
|     // @bug 1782. check ExeMgr connection lost
 | |
|     if (bs.length() == 0)
 | |
|     {
 | |
|       Message::Args args;
 | |
|       args.add("look in error.log on node, having dbroot1");
 | |
|       throw IDBExcept(ERR_LOST_CONN_EXEMGR, args);
 | |
|     }
 | |
|     if (!rowGroup)
 | |
|     {
 | |
|       rowGroup.reset(new RowGroup());
 | |
|       rowGroup->deserialize(bs);
 | |
|       continue;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       // XXXST
 | |
|       rgData.deserialize(bs, true);
 | |
|       rowGroup->setData(&rgData);
 | |
|       // rowGroup->setData(const_cast<uint8_t*>(bs.buf()));
 | |
|     }
 | |
| 
 | |
|     if ((status = rowGroup->getStatus()) != 0)
 | |
|     {
 | |
|       if (status >= 1000)  // new error system
 | |
|       {
 | |
|         // bs.advance(rowGroup->getDataSize());
 | |
|         bs >> emsgStr;
 | |
|         throw IDBExcept(emsgStr, rowGroup->getStatus());
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         throw IDBExcept(ERR_SYSTEM_CATALOG);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     if (rowGroup->getRowCount() > 0)
 | |
|       rowGroup->addToSysDataList(sysDataList);
 | |
|     else
 | |
|       break;
 | |
|   }
 | |
| 
 | |
|   bs.reset();
 | |
|   qb = 0;
 | |
|   bs << qb;
 | |
|   fExeMgr->write(bs);
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::ColType CalpontSystemCatalog::colType(const OID& Oid)
 | |
| {
 | |
|   if (Oid >= 3000)
 | |
|     DEBUG << "Enter colType: " << Oid << endl;
 | |
| 
 | |
|   ColType ct;
 | |
| 
 | |
|   // invalid oid
 | |
|   if (Oid < 1000)
 | |
|     return ct;
 | |
| 
 | |
|   // Check whether cache needs to be flushed
 | |
|   if (Oid >= 3000)
 | |
|   {
 | |
|     checkSysCatVer();
 | |
|   }
 | |
| 
 | |
|   // check colinfomap first for system table column or cached column type
 | |
|   boost::mutex::scoped_lock lk3(fColinfomapLock);
 | |
| 
 | |
|   if (fColinfomap.size() > 0)
 | |
|   {
 | |
|     Colinfomap::const_iterator iter = fColinfomap.find(Oid);
 | |
| 
 | |
|     if (iter != fColinfomap.end())
 | |
|     {
 | |
|       return iter->second;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   lk3.unlock();
 | |
| 
 | |
|   /* SQL statement: select columnlength, datatype, dictobjectid,listobjectid,treeobjectid,
 | |
|    * columnposition, scale, prec, defaultvalue, schema, tablename, columnname
 | |
|    * from syscolumn where objectid = Oid;
 | |
|    */
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   string columnlength = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLUMNLEN_COL;
 | |
|   string objectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + OBJECTID_COL;
 | |
|   string datatype = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + DATATYPE_COL;
 | |
|   string dictobjectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + DICTOID_COL;
 | |
|   string listobjectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + LISTOBJID_COL;
 | |
|   string treeobjectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TREEOBJID_COL;
 | |
|   string columnposition = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLUMNPOS_COL;
 | |
|   string scale = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + SCALE_COL;
 | |
|   string precision = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + PRECISION_COL;
 | |
|   string defaultvalue = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + DEFAULTVAL_COL;
 | |
|   // the following columns will be save in cache although it's not needed for now
 | |
|   string columnname = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLNAME_COL;
 | |
|   string tablename = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TABLENAME_COL;
 | |
|   string schemaname = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + SCHEMA_COL;
 | |
|   string nullable = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + NULLABLE_COL;
 | |
|   string compressionType = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COMPRESSIONTYPE_COL;
 | |
|   string autoincrement = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + AUTOINC_COL;
 | |
|   string nextvalue = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + NEXTVALUE_COL;
 | |
|   string charsetnum = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + CHARSETNUM_COL;
 | |
| 
 | |
|   SimpleColumn* col[18];
 | |
|   col[0] = new SimpleColumn(columnlength, fSessionID);
 | |
|   col[1] = new SimpleColumn(objectid, fSessionID);
 | |
|   col[2] = new SimpleColumn(datatype, fSessionID);
 | |
|   col[3] = new SimpleColumn(dictobjectid, fSessionID);
 | |
|   col[4] = new SimpleColumn(listobjectid, fSessionID);
 | |
|   col[5] = new SimpleColumn(treeobjectid, fSessionID);
 | |
|   col[6] = new SimpleColumn(columnposition, fSessionID);
 | |
|   col[7] = new SimpleColumn(scale, fSessionID);
 | |
|   col[8] = new SimpleColumn(precision, fSessionID);
 | |
|   col[9] = new SimpleColumn(defaultvalue, fSessionID);
 | |
|   col[10] = new SimpleColumn(schemaname, fSessionID);
 | |
|   col[11] = new SimpleColumn(tablename, fSessionID);
 | |
|   col[12] = new SimpleColumn(columnname, fSessionID);
 | |
|   col[13] = new SimpleColumn(nullable, fSessionID);
 | |
|   col[14] = new SimpleColumn(compressionType, fSessionID);
 | |
|   col[15] = new SimpleColumn(autoincrement, fSessionID);
 | |
|   col[16] = new SimpleColumn(nextvalue, fSessionID);
 | |
|   col[17] = new SimpleColumn(charsetnum, fSessionID);
 | |
| 
 | |
|   SRCP srcp;
 | |
|   srcp.reset(col[0]);
 | |
|   colMap.insert(CMVT_(columnlength, srcp));
 | |
|   srcp.reset(col[1]);
 | |
|   colMap.insert(CMVT_(objectid, srcp));
 | |
|   srcp.reset(col[2]);
 | |
|   colMap.insert(CMVT_(datatype, srcp));
 | |
|   srcp.reset(col[3]);
 | |
|   colMap.insert(CMVT_(dictobjectid, srcp));
 | |
|   srcp.reset(col[4]);
 | |
|   colMap.insert(CMVT_(listobjectid, srcp));
 | |
|   srcp.reset(col[5]);
 | |
|   colMap.insert(CMVT_(treeobjectid, srcp));
 | |
|   srcp.reset(col[6]);
 | |
|   colMap.insert(CMVT_(columnposition, srcp));
 | |
|   srcp.reset(col[7]);
 | |
|   colMap.insert(CMVT_(scale, srcp));
 | |
|   srcp.reset(col[8]);
 | |
|   colMap.insert(CMVT_(precision, srcp));
 | |
|   // TODO: NULL value handling & convert to static_any::any
 | |
|   // delete this manually at fcn exit
 | |
|   srcp.reset(col[9]);
 | |
|   colMap.insert(CMVT_(defaultvalue, srcp));
 | |
|   srcp.reset(col[10]);
 | |
|   colMap.insert(CMVT_(schemaname, srcp));
 | |
|   srcp.reset(col[11]);
 | |
|   colMap.insert(CMVT_(tablename, srcp));
 | |
|   srcp.reset(col[12]);
 | |
|   colMap.insert(CMVT_(columnname, srcp));
 | |
|   srcp.reset(col[13]);
 | |
|   colMap.insert(CMVT_(nullable, srcp));
 | |
|   srcp.reset(col[14]);
 | |
|   colMap.insert(CMVT_(compressionType, srcp));
 | |
|   srcp.reset(col[15]);
 | |
|   colMap.insert(CMVT_(autoincrement, srcp));
 | |
|   srcp.reset(col[16]);
 | |
|   colMap.insert(CMVT_(nextvalue, srcp));
 | |
|   srcp.reset(col[17]);
 | |
|   colMap.insert(CMVT_(charsetnum, srcp));
 | |
| 
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   // ignore returnedcolumn, because it's not read by Joblist for now
 | |
|   csep.returnedCols(returnedColumnList);
 | |
|   OID oid[18];
 | |
| 
 | |
|   for (int i = 0; i < 18; i++)
 | |
|     oid[i] = col[i]->oid();
 | |
| 
 | |
|   // Filters
 | |
|   SimpleFilter* f1 =
 | |
|       new SimpleFilter(opeq, col[1]->clone(), new ConstantColumn((int64_t)Oid, ConstantColumn::NUM));
 | |
|   filterTokenList.push_back(f1);
 | |
| 
 | |
|   csep.filterTokenList(filterTokenList);
 | |
|   ostringstream oss;
 | |
|   oss << "select "
 | |
|          "columnlength,datatype,dictobjectid,listobjectid,treeobjectid,columnposition,scale,compressiontype"
 | |
|          "prec,defaultvalue,schema,tablename,columnname from syscolumn where objectid="
 | |
|       << Oid << " --colType/";
 | |
| 
 | |
|   if (fIdentity == EC)
 | |
|     oss << "EC";
 | |
|   else
 | |
|     oss << "FE";
 | |
| 
 | |
|   csep.data(oss.str());
 | |
|   NJLSysDataList sysDataList;
 | |
|   getSysData(csep, sysDataList, SYSCOLUMN_TABLE);
 | |
| 
 | |
|   TableColName tcn;
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
|   RID rid = std::numeric_limits<RID>::max();
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == oid[0])
 | |
|     {
 | |
|       ct.colWidth = ((*it)->GetData(0));
 | |
| 
 | |
|       if (fIdentity == EC)
 | |
|         rid = (*it)->GetRid(0);
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[2])
 | |
|       ct.colDataType = (ColDataType)((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[3])
 | |
|       ct.ddn.dictOID = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[4])
 | |
|       ct.ddn.listOID = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[5])
 | |
|       ct.ddn.treeOID = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[6])
 | |
|       ct.colPosition = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[7])
 | |
|       ct.scale = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[8])
 | |
|       ct.precision = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_DEFAULTVAL)
 | |
|     {
 | |
|       ct.defaultValue = ((*it)->GetStringData(0));
 | |
| 
 | |
|       if (!ct.defaultValue.isNull())
 | |
|       {
 | |
|         if (ct.constraintType != NOTNULL_CONSTRAINT)
 | |
|           ct.constraintType = DEFAULT_CONSTRAINT;
 | |
|       }
 | |
|     }
 | |
|     // NJL fix.  The schema, table, and column now return the oids for the dictionary columns
 | |
|     // on schema, table, and column.
 | |
|     else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_SCHEMA)
 | |
|       tcn.schema = ((*it)->GetStringData(0).safeString(""));
 | |
|     else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_TABLENAME)
 | |
|       tcn.table = ((*it)->GetStringData(0).safeString(""));
 | |
|     else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_COLNAME)
 | |
|       tcn.column = ((*it)->GetStringData(0).safeString(""));
 | |
|     else if ((*it)->ColumnOID() == oid[13])
 | |
|     {
 | |
|       if (static_cast<ConstraintType>((*it)->GetData(0)) == 0)
 | |
|       {
 | |
|         ct.constraintType = NOTNULL_CONSTRAINT;
 | |
|       }
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[14])
 | |
|       ct.compressionType = ct.ddn.compressionType = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[15])
 | |
|     {
 | |
|       ostringstream os;
 | |
|       os << (char)(*it)->GetData(0);
 | |
| 
 | |
|       if (os.str().compare("y") == 0)
 | |
|         ct.autoincrement = true;
 | |
|       else
 | |
|         ct.autoincrement = false;
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[16])
 | |
|       ct.nextvalue = ((*it)->GetData(0));
 | |
|     else if ((*it)->ColumnOID() == oid[17])
 | |
|       ct.charsetNumber = ((*it)->GetData(0));
 | |
| 
 | |
|     ct.columnOID = Oid;
 | |
|   }
 | |
| 
 | |
|   if ((sysDataList.size() == 0) && isAUXColumnOID(Oid) >= 3000)
 | |
|   {
 | |
|     ct.colDataType = execplan::AUX_COL_DATATYPE;
 | |
|     ct.colWidth = execplan::AUX_COL_WIDTH;
 | |
|     ct.compressionType = execplan::AUX_COL_COMPRESSION_TYPE;
 | |
|     ct.columnOID = Oid;
 | |
|   }
 | |
| 
 | |
|   // populate colinfomap cache and oidbitmap
 | |
|   lk3.lock();
 | |
|   boost::mutex::scoped_lock lk2(fOIDmapLock);
 | |
|   fColinfomap[Oid] = ct;
 | |
|   fOIDmap[tcn] = Oid;
 | |
| 
 | |
|   if (fIdentity == EC)
 | |
|     fColRIDmap[tcn] = rid;
 | |
| 
 | |
|   // Prevent mem leak
 | |
|   // delete col[9];
 | |
| 
 | |
|   return ct;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::ColType CalpontSystemCatalog::colTypeDct(const OID& dictOid)
 | |
| {
 | |
|   if (dictOid >= 3000)
 | |
|     DEBUG << "Enter colType: " << dictOid << endl;
 | |
| 
 | |
|   ColType ct;
 | |
| 
 | |
|   // invalid oid
 | |
|   if (dictOid < 1000)
 | |
|     return ct;
 | |
| 
 | |
|   // Check whether cache needs to be flushed
 | |
|   if (dictOid >= 3000)
 | |
|   {
 | |
|     checkSysCatVer();
 | |
|   }
 | |
| 
 | |
|   // check map first cached column type
 | |
|   boost::recursive_mutex::scoped_lock lk3(fDctTokenMapLock);
 | |
|   DctTokenMap::const_iterator iter = fDctTokenMap.find(dictOid);
 | |
| 
 | |
|   if (iter != fDctTokenMap.end())
 | |
|     return colType(iter->second);
 | |
| 
 | |
|   lk3.unlock();
 | |
| 
 | |
|   /* SQL statement: select objectid from syscolumn where dictobjectid = dictOid;
 | |
|    */
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   string objectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + OBJECTID_COL;
 | |
|   string dictobjectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + DICTOID_COL;
 | |
| 
 | |
|   SimpleColumn* col[2];
 | |
|   col[0] = new SimpleColumn(objectid, fSessionID);
 | |
|   col[1] = new SimpleColumn(dictobjectid, fSessionID);
 | |
| 
 | |
|   SRCP srcp;
 | |
|   srcp.reset(col[0]);
 | |
|   colMap.insert(CMVT_(objectid, srcp));
 | |
|   srcp.reset(col[1]);
 | |
|   colMap.insert(CMVT_(dictobjectid, srcp));
 | |
| 
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   // ignore returnedcolumn, because it's not read by Joblist for now
 | |
|   csep.returnedCols(returnedColumnList);
 | |
|   OID oid[2];
 | |
| 
 | |
|   for (int i = 0; i < 2; i++)
 | |
|     oid[i] = col[i]->oid();
 | |
| 
 | |
|   // Filters
 | |
|   SimpleFilter* f1 =
 | |
|       new SimpleFilter(opeq, col[1]->clone(), new ConstantColumn((int64_t)dictOid, ConstantColumn::NUM));
 | |
|   filterTokenList.push_back(f1);
 | |
| 
 | |
|   csep.filterTokenList(filterTokenList);
 | |
|   ostringstream oss;
 | |
|   oss << "select objectid from syscolumn where dictobjectid=" << dictOid << " --colTypeDct/";
 | |
| 
 | |
|   if (fIdentity == EC)
 | |
|     oss << "EC";
 | |
|   else
 | |
|     oss << "FE";
 | |
| 
 | |
|   csep.data(oss.str());
 | |
|   NJLSysDataList sysDataList;
 | |
|   getSysData(csep, sysDataList, SYSCOLUMN_TABLE);
 | |
| 
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|   OID tokenOID = 0;
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == oid[0])
 | |
|       tokenOID = ((*it)->GetData(0));
 | |
|   }
 | |
| 
 | |
|   // populate cache
 | |
|   lk3.lock();
 | |
|   fDctTokenMap[dictOid] = tokenOID;
 | |
| 
 | |
|   return colType(tokenOID);
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::TableColName CalpontSystemCatalog::colName(const OID& oid)
 | |
| {
 | |
|   if (oid >= 3000)
 | |
|     DEBUG << "Enter colName: " << oid;
 | |
| 
 | |
|   TableColName tableColName;
 | |
| 
 | |
|   // invalid oid
 | |
|   if (oid < 1000)
 | |
|     return tableColName;
 | |
| 
 | |
|   // Check whether cache needs to be flushed
 | |
|   if (oid >= 3000)
 | |
|   {
 | |
|     checkSysCatVer();
 | |
|   }
 | |
| 
 | |
|   // check oidmap for system table columns and cached columns
 | |
|   boost::mutex::scoped_lock lk2(fOIDmapLock);
 | |
|   OIDmap::const_iterator iter = fOIDmap.begin();
 | |
| 
 | |
|   while (iter != fOIDmap.end())
 | |
|   {
 | |
|     if (oid == (*iter).second)
 | |
|     {
 | |
|       tableColName = (*iter).first;
 | |
|       DEBUG << "|in cache|" << tableColName.schema << "|" << tableColName.table << "|" << tableColName.column
 | |
|             << endl;
 | |
|       return tableColName;
 | |
|     }
 | |
| 
 | |
|     ++iter;
 | |
|   }
 | |
| 
 | |
|   lk2.unlock();
 | |
| 
 | |
|   // SQL statement: select schema, tablename, columnname from syscolumn where objectid = oid;
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   SimpleColumn* c1 =
 | |
|       new SimpleColumn(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + OBJECTID_COL, fSessionID);
 | |
|   SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|   SimpleColumn* c3 =
 | |
|       new SimpleColumn(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|   SimpleColumn* c4 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLNAME_COL, fSessionID);
 | |
| 
 | |
|   SRCP srcp;
 | |
|   srcp.reset(c1);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + OBJECTID_COL, srcp));
 | |
|   srcp.reset(c2);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + SCHEMA_COL, srcp));
 | |
|   srcp.reset(c3);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TABLENAME_COL, srcp));
 | |
|   srcp.reset(c4);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLNAME_COL, srcp));
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   srcp.reset(c2->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   srcp.reset(c3->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   srcp.reset(c4->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   csep.returnedCols(returnedColumnList);
 | |
| 
 | |
|   // NJL fix.  The dictionary column OID is now returned from getSysData.
 | |
|   // OID oid2 = c2->oid();
 | |
|   // OID oid3 = c3->oid();
 | |
|   // OID oid4 = c4->oid();
 | |
|   OID oid2 = DICTOID_SYSCOLUMN_SCHEMA;
 | |
|   OID oid3 = DICTOID_SYSCOLUMN_TABLENAME;
 | |
|   OID oid4 = DICTOID_SYSCOLUMN_COLNAME;
 | |
| 
 | |
|   // Filters
 | |
|   SimpleFilter* f1 =
 | |
|       new SimpleFilter(opeq, c1->clone(), new ConstantColumn((int64_t)oid, ConstantColumn::NUM));
 | |
|   filterTokenList.push_back(f1);
 | |
| 
 | |
|   csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|   ostringstream oss;
 | |
|   oss << "select schema,tablename,columnname from syscolumn where objectid=" << oid << " --colName/";
 | |
| 
 | |
|   if (fIdentity == EC)
 | |
|     oss << "EC";
 | |
|   else
 | |
|     oss << "FE";
 | |
| 
 | |
|   csep.data(oss.str());
 | |
|   NJLSysDataList sysDataList;
 | |
|   getSysData(csep, sysDataList, SYSCOLUMN_TABLE);
 | |
| 
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == oid2)
 | |
|       tableColName.schema = (*it)->GetStringData(0).safeString("");
 | |
|     else if ((*it)->ColumnOID() == oid3)
 | |
|       tableColName.table = (*it)->GetStringData(0).safeString("");
 | |
|     else if ((*it)->ColumnOID() == oid4)
 | |
|       tableColName.column = (*it)->GetStringData(0).safeString("");
 | |
|   }
 | |
| 
 | |
|   if (oid > 3000)
 | |
|     DEBUG << "|" << tableColName.schema << "|" << tableColName.table << "|" << tableColName.column << endl;
 | |
| 
 | |
| #if BOOST_VERSION < 103800
 | |
| 
 | |
|   if (!lk2.locked())
 | |
|     lk2.lock();
 | |
| 
 | |
| #else
 | |
| 
 | |
|   if (!lk2.owns_lock())
 | |
|     lk2.lock();
 | |
| 
 | |
| #endif
 | |
|   fOIDmap[tableColName] = oid;
 | |
| 
 | |
|   return tableColName;
 | |
| }
 | |
| const CalpontSystemCatalog::TableColName CalpontSystemCatalog::dictColName(const OID& oid)
 | |
| {
 | |
|   if (oid >= 3000)
 | |
|     DEBUG << "Enter dictColName: " << oid;
 | |
| 
 | |
|   TableColName tableColName;
 | |
| 
 | |
|   // invalid oid
 | |
|   if (oid < 1000)
 | |
|     return tableColName;
 | |
| 
 | |
|   // Check whether cache needs to be flushed
 | |
|   if (oid >= 3000)
 | |
|   {
 | |
|     checkSysCatVer();
 | |
|   }
 | |
| 
 | |
|   // SQL statement: select schema, tablename, columnname from syscolumn where dictobjectid = oid;
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + DICTOID_COL, fSessionID);
 | |
|   SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|   SimpleColumn* c3 =
 | |
|       new SimpleColumn(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|   SimpleColumn* c4 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLNAME_COL, fSessionID);
 | |
| 
 | |
|   SRCP srcp;
 | |
|   srcp.reset(c1);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + DICTOID_COL, srcp));
 | |
|   srcp.reset(c2);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + SCHEMA_COL, srcp));
 | |
|   srcp.reset(c3);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TABLENAME_COL, srcp));
 | |
|   srcp.reset(c4);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLNAME_COL, srcp));
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   srcp.reset(c2->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   srcp.reset(c3->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   srcp.reset(c4->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   csep.returnedCols(returnedColumnList);
 | |
| 
 | |
|   OID oid2 = DICTOID_SYSCOLUMN_SCHEMA;
 | |
|   OID oid3 = DICTOID_SYSCOLUMN_TABLENAME;
 | |
|   OID oid4 = DICTOID_SYSCOLUMN_COLNAME;
 | |
| 
 | |
|   // Filters
 | |
|   SimpleFilter* f1 =
 | |
|       new SimpleFilter(opeq, c1->clone(), new ConstantColumn((int64_t)oid, ConstantColumn::NUM));
 | |
|   filterTokenList.push_back(f1);
 | |
| 
 | |
|   csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|   ostringstream oss;
 | |
|   oss << "select schema,tablename,columnname from syscolumn where dictobjectid=" << oid << " --colName/";
 | |
| 
 | |
|   if (fIdentity == EC)
 | |
|     oss << "EC";
 | |
|   else
 | |
|     oss << "FE";
 | |
| 
 | |
|   csep.data(oss.str());
 | |
|   NJLSysDataList sysDataList;
 | |
|   getSysData(csep, sysDataList, SYSCOLUMN_TABLE);
 | |
| 
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == oid2)
 | |
|       tableColName.schema = (*it)->GetStringData(0).safeString("");
 | |
|     else if ((*it)->ColumnOID() == oid3)
 | |
|       tableColName.table = (*it)->GetStringData(0).safeString("");
 | |
|     else if ((*it)->ColumnOID() == oid4)
 | |
|       tableColName.column = (*it)->GetStringData(0).safeString("");
 | |
|   }
 | |
| 
 | |
|   if (oid > 3000)
 | |
|     DEBUG << "|" << tableColName.schema << "|" << tableColName.table << "|" << tableColName.column << endl;
 | |
| 
 | |
|   return tableColName;
 | |
| }
 | |
| uint64_t CalpontSystemCatalog::nextAutoIncrValue(TableName aTableName, int lower_case_table_names)
 | |
| {
 | |
|   TableInfo tbInfo;
 | |
| 
 | |
|   if (lower_case_table_names)
 | |
|   {
 | |
|     boost::algorithm::to_lower(aTableName.schema);
 | |
|     boost::algorithm::to_lower(aTableName.table);
 | |
|   }
 | |
| 
 | |
|   try
 | |
|   {
 | |
|     tbInfo = tableInfo(aTableName);
 | |
|   }
 | |
|   catch (runtime_error& /*ex*/)
 | |
|   {
 | |
|     throw;
 | |
|   }
 | |
| 
 | |
|   if (tbInfo.tablewithautoincr == NO_AUTOINCRCOL)
 | |
|     return AUTOINCR_SATURATED;
 | |
| 
 | |
|   // Build a plan to get current nextvalue:  select nextvalue from syscolumn where schema = tableName.schema
 | |
|   // and tablename = tableName.table and autoincrement='y';
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   string tablename = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TABLENAME_COL;
 | |
|   string schemaname = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + SCHEMA_COL;
 | |
|   string autoincrement = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + AUTOINC_COL;
 | |
|   string nextvalue = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + NEXTVALUE_COL;
 | |
| 
 | |
|   SimpleColumn* col[5];
 | |
|   col[0] = new SimpleColumn(tablename, fSessionID);
 | |
|   col[1] = new SimpleColumn(schemaname, fSessionID);
 | |
|   col[2] = new SimpleColumn(autoincrement, fSessionID);
 | |
|   col[3] = new SimpleColumn(nextvalue, fSessionID);
 | |
| 
 | |
|   SRCP srcp;
 | |
|   srcp.reset(col[0]);
 | |
|   colMap.insert(CMVT_(tablename, srcp));
 | |
|   srcp.reset(col[1]);
 | |
|   colMap.insert(CMVT_(schemaname, srcp));
 | |
|   srcp.reset(col[2]);
 | |
|   colMap.insert(CMVT_(autoincrement, srcp));
 | |
|   srcp.reset(col[3]);
 | |
|   colMap.insert(CMVT_(nextvalue, srcp));
 | |
| 
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   csep.returnedCols(returnedColumnList);
 | |
| 
 | |
|   OID oid[4];
 | |
| 
 | |
|   for (int i = 0; i < 4; i++)
 | |
|     oid[i] = col[i]->oid();
 | |
| 
 | |
|   // Filters
 | |
|   SimpleFilter* f1 =
 | |
|       new SimpleFilter(opeq, col[1]->clone(), new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f1);
 | |
|   filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|   SimpleFilter* f2 =
 | |
|       new SimpleFilter(opeq, col[0]->clone(), new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f2);
 | |
|   filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|   SimpleFilter* f3 =
 | |
|       new SimpleFilter(opeq, col[2]->clone(), new ConstantColumn("y", ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f3);
 | |
|   csep.filterTokenList(filterTokenList);
 | |
|   ostringstream oss;
 | |
|   oss << "select nextvalue from syscolumn where schema = aTableName.schema and tablename = aTableName.table "
 | |
|          "and autoincrement='y'";
 | |
| 
 | |
|   if (fIdentity == EC)
 | |
|     oss << "EC";
 | |
|   else
 | |
|     oss << "FE";
 | |
| 
 | |
|   csep.data(oss.str());
 | |
| 
 | |
|   NJLSysDataList sysDataList;
 | |
| 
 | |
|   try
 | |
|   {
 | |
|     getSysData(csep, sysDataList, SYSCOLUMN_TABLE);
 | |
|   }
 | |
|   catch (runtime_error& e)
 | |
|   {
 | |
|     throw runtime_error(e.what());
 | |
|   }
 | |
| 
 | |
|   uint64_t nextVal = AUTOINCR_SATURATED;
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == oid[3])
 | |
|     {
 | |
|       nextVal = static_cast<uint64_t>(((*it)->GetData(0)));
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return (nextVal);
 | |
| }
 | |
| 
 | |
| int32_t CalpontSystemCatalog::autoColumOid(TableName aTableName, int lower_case_table_names)
 | |
| {
 | |
|   TableInfo tbInfo;
 | |
| 
 | |
|   if (lower_case_table_names)
 | |
|   {
 | |
|     boost::algorithm::to_lower(aTableName.schema);
 | |
|     boost::algorithm::to_lower(aTableName.table);
 | |
|   }
 | |
| 
 | |
|   try
 | |
|   {
 | |
|     tbInfo = tableInfo(aTableName);
 | |
|   }
 | |
|   catch (runtime_error& /*ex*/)
 | |
|   {
 | |
|     return -2;
 | |
|   }
 | |
| 
 | |
|   if (tbInfo.tablewithautoincr == NO_AUTOINCRCOL)
 | |
|     return 0;
 | |
| 
 | |
|   // Build a plan to get column oid:  select objectid from syscolumn where schema = tableName.schema and
 | |
|   // tablename = tableName.table and autoincrement='y';
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   string tablename = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TABLENAME_COL;
 | |
|   string schemaname = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + SCHEMA_COL;
 | |
|   string autoincrement = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + AUTOINC_COL;
 | |
|   string objectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + OBJECTID_COL;
 | |
| 
 | |
|   SimpleColumn* col[5];
 | |
|   col[0] = new SimpleColumn(tablename, fSessionID);
 | |
|   col[1] = new SimpleColumn(schemaname, fSessionID);
 | |
|   col[2] = new SimpleColumn(autoincrement, fSessionID);
 | |
|   col[3] = new SimpleColumn(objectid, fSessionID);
 | |
| 
 | |
|   SRCP srcp;
 | |
|   srcp.reset(col[0]);
 | |
|   colMap.insert(CMVT_(tablename, srcp));
 | |
|   srcp.reset(col[1]);
 | |
|   colMap.insert(CMVT_(schemaname, srcp));
 | |
|   srcp.reset(col[2]);
 | |
|   colMap.insert(CMVT_(autoincrement, srcp));
 | |
|   srcp.reset(col[3]);
 | |
|   colMap.insert(CMVT_(objectid, srcp));
 | |
| 
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   csep.returnedCols(returnedColumnList);
 | |
| 
 | |
|   OID oid[4];
 | |
| 
 | |
|   for (int i = 0; i < 4; i++)
 | |
|     oid[i] = col[i]->oid();
 | |
| 
 | |
|   // Filters
 | |
|   SimpleFilter* f1 =
 | |
|       new SimpleFilter(opeq, col[1]->clone(), new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f1);
 | |
|   filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|   SimpleFilter* f2 =
 | |
|       new SimpleFilter(opeq, col[0]->clone(), new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f2);
 | |
|   filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|   SimpleFilter* f3 =
 | |
|       new SimpleFilter(opeq, col[2]->clone(), new ConstantColumn("y", ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f3);
 | |
|   csep.filterTokenList(filterTokenList);
 | |
|   ostringstream oss;
 | |
|   oss << "select nextvalue from syscolumn where schema = aTableName.schema and tablename = aTableName.table "
 | |
|          "and autoincrement='y'";
 | |
| 
 | |
|   if (fIdentity == EC)
 | |
|     oss << "EC";
 | |
|   else
 | |
|     oss << "FE";
 | |
| 
 | |
|   csep.data(oss.str());
 | |
|   NJLSysDataList sysDataList;
 | |
| 
 | |
|   try
 | |
|   {
 | |
|     getSysData(csep, sysDataList, SYSCOLUMN_TABLE);
 | |
|   }
 | |
|   catch (runtime_error& e)
 | |
|   {
 | |
|     throw runtime_error(e.what());
 | |
|   }
 | |
| 
 | |
|   int32_t columnOid = 0;
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == oid[3])
 | |
|     {
 | |
|       columnOid = ((*it)->GetData(0));
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return (columnOid);
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::ROPair CalpontSystemCatalog::nextAutoIncrRid(const OID& columnoid)
 | |
| {
 | |
|   // Build a plan to get rid of nextvalue:  select nextvalue from syscolumn where objectid = columnoid;
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   string objectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + OBJECTID_COL;
 | |
|   string nextvalue = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + NEXTVALUE_COL;
 | |
| 
 | |
|   SimpleColumn* col[2];
 | |
|   col[0] = new SimpleColumn(objectid, fSessionID);
 | |
|   col[1] = new SimpleColumn(nextvalue, fSessionID);
 | |
| 
 | |
|   SRCP srcp;
 | |
|   srcp.reset(col[0]);
 | |
|   colMap.insert(CMVT_(objectid, srcp));
 | |
|   srcp.reset(col[1]);
 | |
|   colMap.insert(CMVT_(nextvalue, srcp));
 | |
| 
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   csep.returnedCols(returnedColumnList);
 | |
| 
 | |
|   OID oid[2];
 | |
| 
 | |
|   for (int i = 0; i < 2; i++)
 | |
|     oid[i] = col[i]->oid();
 | |
| 
 | |
|   // Filters
 | |
|   SimpleFilter* f1 = new SimpleFilter(opeq, col[0]->clone(),
 | |
|                                       new ConstantColumn((int64_t)columnoid, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f1);
 | |
| 
 | |
|   csep.filterTokenList(filterTokenList);
 | |
|   ostringstream oss;
 | |
|   oss << "select nextvalue from syscolumn objectid = columnoid";
 | |
| 
 | |
|   if (fIdentity == EC)
 | |
|     oss << "EC";
 | |
|   else
 | |
|     oss << "FE";
 | |
| 
 | |
|   csep.data(oss.str());
 | |
|   NJLSysDataList sysDataList;
 | |
| 
 | |
|   try
 | |
|   {
 | |
|     getSysData(csep, sysDataList, SYSCOLUMN_TABLE);
 | |
|   }
 | |
|   catch (runtime_error& e)
 | |
|   {
 | |
|     throw runtime_error(e.what());
 | |
|   }
 | |
| 
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
|   ROPair roPair;
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == oid[1])
 | |
|     {
 | |
|       roPair.rid = ((*it)->GetRid(0));
 | |
|       roPair.objnum = oid[1];
 | |
|       return roPair;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return roPair;
 | |
| }
 | |
| 
 | |
| #if 0  // Not implemented
 | |
| const CalpontSystemCatalog::OID CalpontSystemCatalog::colBitmap(const OID& oid) const
 | |
| {
 | |
|     return oid;
 | |
|     DEBUG << "Enter colBitmap: Not implemented" << endl;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::SCN CalpontSystemCatalog::scn(void) const
 | |
| {
 | |
|     DEBUG << "Enter scn: Not implemented" << endl;
 | |
|     SCN scn;
 | |
|     scn = 1;
 | |
|     return scn;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| /* static */
 | |
| boost::shared_ptr<CalpontSystemCatalog> CalpontSystemCatalog::makeCalpontSystemCatalog(uint32_t sessionID)
 | |
| {
 | |
|   boost::mutex::scoped_lock lock(map_mutex);
 | |
|   boost::shared_ptr<CalpontSystemCatalog> instance;
 | |
|   CatalogMap::const_iterator it = fCatalogMap.find(sessionID);
 | |
| 
 | |
|   if (sessionID == 0)
 | |
|   {
 | |
|     if (it == fCatalogMap.end())
 | |
|     {
 | |
|       instance.reset(new CalpontSystemCatalog());
 | |
|       fCatalogMap[0] = instance;
 | |
|       return instance;
 | |
|     }
 | |
| 
 | |
| #if 0
 | |
| 
 | |
|         //Is it really an error for a non-sessionid-0 catalog to be present at this point?
 | |
|         if (fCatalogMap.size() != 1)
 | |
|         {
 | |
|             //throw runtime_error ("No calpont system catalog instance found.");
 | |
|             ostringstream oss;
 | |
|             oss << "Preposterous number of system catalog instances found when looking for "
 | |
|                 "session 0: " << fCatalogMap.size();
 | |
|             throw runtime_error(oss.str());
 | |
|         }
 | |
| 
 | |
| #endif
 | |
| 
 | |
|     return it->second;
 | |
|   }
 | |
| 
 | |
|   if (it == fCatalogMap.end())
 | |
|   {
 | |
|     instance.reset(new CalpontSystemCatalog());
 | |
|     instance->sessionID(sessionID);
 | |
|     instance->fExeMgr->setSessionId(sessionID);
 | |
|     fCatalogMap[sessionID] = instance;
 | |
|     return instance;
 | |
|   }
 | |
| 
 | |
|   return it->second;
 | |
| }
 | |
| 
 | |
| /* static */
 | |
| void CalpontSystemCatalog::removeCalpontSystemCatalog(uint32_t sessionID)
 | |
| {
 | |
|   boost::mutex::scoped_lock lock(map_mutex);
 | |
|   DEBUG << "remove calpont system catalog for session " << sessionID << endl;
 | |
|   fCatalogMap.erase(sessionID);
 | |
|   /*
 | |
|       CatalogMap::iterator it = fCatalogMap.find(sessionID);
 | |
|       if (it != fCatalogMap.end())
 | |
|       {
 | |
|           delete (*it).second;
 | |
|           fCatalogMap.erase(it);
 | |
|       }
 | |
|   */
 | |
| }
 | |
| 
 | |
| CalpontSystemCatalog::CalpontSystemCatalog() : fExeMgr(new ClientRotator(0, "ExeMgr")), fSessionID(0)
 | |
| {
 | |
|   // Set fIdentity based on the module on which we are running.
 | |
|   fIdentity = EC;
 | |
| 
 | |
|   if (fSessionManager.get() == 0)
 | |
|     fSessionManager.reset(new SessionManager());
 | |
| 
 | |
|   try
 | |
|   {
 | |
|     string localModuleType;
 | |
|     const char* p = 0;
 | |
|     // see if env is set to override identity lookup
 | |
|     p = getenv("CALPONT_CSC_IDENT");
 | |
| 
 | |
|     if (p && *p)
 | |
|     {
 | |
|       localModuleType = p;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       oam::Oam oam;
 | |
|       oam::oamModuleInfo_t t = oam.getModuleInfo();
 | |
|       localModuleType = boost::get<1>(t);
 | |
|     }
 | |
| 
 | |
|     // If dm (director module), set the identity to FE (Front End).
 | |
|     // @bug 1029. set "FE" for beetlejuice (xm)
 | |
|     if (localModuleType == "dm" || localModuleType == "xm")
 | |
|     {
 | |
|       fIdentity = FE;
 | |
|     }
 | |
|   }
 | |
|   catch (exception&)
 | |
|   {
 | |
|     // If not in an environment with OAM set up, default to Front End.
 | |
|     fIdentity = FE;
 | |
|   }
 | |
| 
 | |
|   buildSysColinfomap();
 | |
|   buildSysOIDmap();
 | |
|   buildSysTablemap();
 | |
|   buildSysDctmap();
 | |
|   fSyscatSCN = fSessionManager->sysCatVerID().currentScn;
 | |
| }
 | |
| 
 | |
| CalpontSystemCatalog::~CalpontSystemCatalog()
 | |
| {
 | |
|   if (fExeMgr)
 | |
|   {
 | |
|     delete fExeMgr;
 | |
|     fExeMgr = nullptr;
 | |
|   }
 | |
| }
 | |
| 
 | |
| #if 0
 | |
| const CalpontSystemCatalog::RIDList CalpontSystemCatalog::indexRIDs(const TableName& tableName)
 | |
| {
 | |
|     /* SQL statement: select indexname from sysindex where schema=tableName.schema and tablename=tableName.table;*/
 | |
|     ROPair rid;
 | |
|     TableColName aTableName;
 | |
|     aTableName.schema = tableName.schema;
 | |
|     aTableName.table = tableName.table;
 | |
| 
 | |
|     if (aTableName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter constraintRIDs: " << tableName.schema << "|" << tableName.table << endl;
 | |
| 
 | |
|     RIDList rl;
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + INDEXNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + INDEXNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid = DICTOID_SYSINDEX_INDEXNAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c2->clone(),
 | |
|                                          new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSINDEX_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->ColumnOID() == oid)
 | |
|         {
 | |
|             // TODO: get rowid from columnresult. new feather of columnresult
 | |
|             for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|             {
 | |
|                 if (fIdentity == EC)
 | |
|                     rid.rid = (*it)->GetRid(i);
 | |
|                 else
 | |
|                     rid.rid = 0;
 | |
| 
 | |
|                 rl.push_back(rid);
 | |
|             }
 | |
| 
 | |
|             return rl;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return rl;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::RIDList CalpontSystemCatalog::indexColRIDs(const TableName& tableName)
 | |
| {
 | |
|     /* SQL statement: select indexname from sysindexcol where schema=tableColName.schema and
 | |
|      * tablename=tableColName.table;
 | |
|      */
 | |
|     RIDList ridlist;
 | |
|     TableName aTableColName;
 | |
|     aTableColName.schema = tableName.schema;
 | |
|     aTableColName.table = tableName.table;
 | |
| 
 | |
|     if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter indexColRIDs: " << tableName.schema << "|"
 | |
|               << tableName.table << endl;
 | |
| 
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + INDEXNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + INDEXNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid = DICTOID_SYSINDEXCOL_INDEXNAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c2->clone(),
 | |
|                                          new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSINDEXCOL_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
|     ROPair rid;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->ColumnOID() == oid)
 | |
|         {
 | |
|             for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|             {
 | |
|                 if (fIdentity == EC)
 | |
|                     rid.rid = (*it)->GetRid(i);
 | |
| 
 | |
|                 ridlist.push_back(rid);
 | |
|             }
 | |
| 
 | |
|             return ridlist;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return ridlist;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::RIDList CalpontSystemCatalog::indexColRIDs(const IndexName& indexName)
 | |
| {
 | |
|     /* SQL statement: select indexname from sysindexcol where schema=indexName.schema and
 | |
|       * tablename=indexName.table and indexname=indexName.index;
 | |
|       */
 | |
|     RIDList ridlist;
 | |
|     IndexName aIndexName;
 | |
|     aIndexName.schema = indexName.schema;
 | |
|     aIndexName.table = indexName.table;
 | |
|     aIndexName.index = indexName.index;
 | |
| 
 | |
|     if (aIndexName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter indexColRIDs: " << aIndexName.schema << "|"
 | |
|               << aIndexName.table << aIndexName.index << endl;
 | |
| 
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + INDEXNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + INDEXNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid = DICTOID_SYSINDEXCOL_INDEXNAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c2->clone(),
 | |
|                                          new ConstantColumn(aIndexName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f3 = new SimpleFilter (opeq,
 | |
|                                          c1->clone(),
 | |
|                                          new ConstantColumn(aIndexName.index, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f3);
 | |
| 
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSINDEXCOL_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
|     ROPair rid;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->ColumnOID() == oid)
 | |
|         {
 | |
|             for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|             {
 | |
|                 if (fIdentity == EC)
 | |
|                     rid.rid = (*it)->GetRid(i);
 | |
| 
 | |
|                 ridlist.push_back(rid);
 | |
|             }
 | |
| 
 | |
|             return ridlist;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return ridlist;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::RIDList CalpontSystemCatalog::constraintRIDs(const TableName& tableName)
 | |
| {
 | |
|     /* SQL statement: select constraintname from sysconstraint where schema=tableName.schema and tablename=tableName.table;*/
 | |
|     ROPair rid;
 | |
|     TableColName aTableName;
 | |
|     aTableName.schema = tableName.schema;
 | |
|     aTableName.table = tableName.table;
 | |
| 
 | |
|     if (aTableName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter constraintRIDs: " << tableName.schema << "|" << tableName.table << endl;
 | |
| 
 | |
|     RIDList rl;
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid = DICTOID_SYSCONSTRAINT_CONSTRAINTNAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c2->clone(),
 | |
|                                          new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSCONSTRAINT_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->ColumnOID() == oid)
 | |
|         {
 | |
|             // TODO: get rowid from columnresult. new feather of columnresult
 | |
|             for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|             {
 | |
|                 if (fIdentity == EC)
 | |
|                     rid.rid = (*it)->GetRid(i);
 | |
| 
 | |
|                 rl.push_back(rid);
 | |
|             }
 | |
| 
 | |
|             return rl;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return rl;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::IndexNameList CalpontSystemCatalog::colValueSysconstraint (const TableColName& tableColName, bool useCache)
 | |
| {
 | |
|     /* SQL statement: select constraintname from sysconstraint where schema = schema and table=table and column=column;*/
 | |
|     IndexNameList indexNameList;
 | |
|     TableColName aTableColName;
 | |
|     aTableColName.schema = tableColName.schema;
 | |
|     aTableColName.table = tableColName.table;
 | |
|     aTableColName.column = tableColName.column;
 | |
|     boost::algorithm::to_lower(aTableColName.column);
 | |
| 
 | |
| #if BOOST_VERSION < 104000
 | |
|     boost::mutex::scoped_lock lk1(fColIndexListmapLock, false);
 | |
| #else
 | |
|     boost::mutex::scoped_lock lk1(fColIndexListmapLock, boost::defer_lock);
 | |
| #endif
 | |
| 
 | |
|     if (useCache)
 | |
|     {
 | |
|         lk1.lock();
 | |
|         ColIndexListmap::const_iterator iter = fColIndexListmap.find(aTableColName);
 | |
| 
 | |
|         if (iter != fColIndexListmap.end())
 | |
|         {
 | |
|             indexNameList = iter->second;
 | |
|             return indexNameList;
 | |
|         }
 | |
| 
 | |
|         lk1.unlock();
 | |
|     }
 | |
| 
 | |
|     if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter colValueSysconstraint: " << tableColName.schema << "|"
 | |
|               << tableColName.table << "|"
 | |
|               << tableColName.column << endl;
 | |
| 
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + CONSTRAINTNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|     SimpleColumn* c4 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + COLNAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + CONSTRAINTNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     srcp.reset(c4);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + COLNAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid = DICTOID_SYSCONSTRAINTCOL_CONSTRAINTNAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c2->clone(),
 | |
|                                          new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f3 = new SimpleFilter (opeq,
 | |
|                                          c4->clone(),
 | |
|                                          new ConstantColumn(aTableColName.column, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f3);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSCONSTRAINTCOL_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->ColumnOID() == oid)
 | |
|         {
 | |
|             for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|             {
 | |
|                 IndexName indexName;
 | |
|                 indexName.schema = aTableColName.schema;
 | |
|                 indexName.table = aTableColName.table;
 | |
|                 indexName.index = ((*it)->GetStringData(0));
 | |
|                 indexNameList.push_back(indexName);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     lk1.lock();
 | |
|     fColIndexListmap[aTableColName] = indexNameList;
 | |
|     lk1.unlock();
 | |
| 
 | |
|     return indexNameList;
 | |
| }
 | |
| 
 | |
| // TODO: should take index name as parameter and filter on schema name and table name also
 | |
| const CalpontSystemCatalog::RID CalpontSystemCatalog::constraintRID(const std::string constraintName)
 | |
| {
 | |
|     DEBUG << "Enter constraintRID: " << constraintName << endl;
 | |
| 
 | |
|     /* SQL statement: select constraintname from sysconstraint where constraintname=constraintName;
 | |
|      */
 | |
|     RID rid = std::numeric_limits<RID>::max();
 | |
|     string aConstraintName = constraintName;
 | |
| 
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTNAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTNAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid = DICTOID_SYSCONSTRAINT_CONSTRAINTNAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c1->clone(),
 | |
|                                          new ConstantColumn(aConstraintName, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSCONSTRAINT_TABLE);
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
| 
 | |
|         if ((*it)->ColumnOID() == oid)
 | |
|         {
 | |
|             if (fIdentity == EC)
 | |
|                 rid = (*it)->GetRid(0);
 | |
| 
 | |
|             return rid;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     string msg("CalpontSystemCatalog::constraintRID: no RID found for ");
 | |
|     msg += constraintName;
 | |
|     throw runtime_error(msg);
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::RIDList CalpontSystemCatalog::constraintColRID(const std::string constraintName)
 | |
| {
 | |
|     DEBUG << "Enter constraintColRID: " << constraintName << endl;
 | |
|     /* SQL statement: select constraintname from sysconstraintcol where constraintname=constraintName;
 | |
|      */
 | |
|     RIDList ridlist;
 | |
|     string aConstraintName = constraintName;
 | |
|     boost::algorithm::to_lower(aConstraintName);
 | |
| 
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + CONSTRAINTNAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + CONSTRAINTNAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid = DICTOID_SYSCONSTRAINTCOL_CONSTRAINTNAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c1->clone(),
 | |
|                                          new ConstantColumn(aConstraintName, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSCONSTRAINTCOL_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
|     CalpontSystemCatalog::ROPair ropair;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->ColumnOID() == oid)
 | |
|         {
 | |
|             for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|             {
 | |
|                 if (fIdentity == EC)
 | |
|                 {
 | |
|                     ropair.rid = (*it)->GetRid(i);
 | |
|                     ropair.objnum = 0;
 | |
|                 }
 | |
| 
 | |
|                 ridlist.push_back(ropair);
 | |
|             }
 | |
| 
 | |
|             return ridlist;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return ridlist;
 | |
| }
 | |
| 
 | |
| const std::string CalpontSystemCatalog::colValueSysconstraintCol (const TableColName& tableColName)
 | |
| {
 | |
|     /* SQL statement: select constraintname from sysconstraintcol where schema = schema and table=table and column=column;*/
 | |
|     TableColName aTableColName;
 | |
|     aTableColName.schema = tableColName.schema;
 | |
|     aTableColName.table = tableColName.table;
 | |
|     aTableColName.column = tableColName.column;
 | |
|     boost::algorithm::to_lower(aTableColName.column);
 | |
| 
 | |
|     if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter colValueSysconstraintCol: " << tableColName.schema << "|"
 | |
|               << tableColName.table << "|"
 | |
|               << tableColName.column << endl;
 | |
| 
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + CONSTRAINTNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|     SimpleColumn* c4 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + COLNAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + CONSTRAINTNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     srcp.reset(c4);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + COLNAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid = DICTOID_SYSCONSTRAINTCOL_CONSTRAINTNAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c2->clone(),
 | |
|                                          new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f3 = new SimpleFilter (opeq,
 | |
|                                          c4->clone(),
 | |
|                                          new ConstantColumn(aTableColName.column, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f3);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSCONSTRAINTCOL_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
|     string constraintname = "";
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->dataCount() == 0)
 | |
|             return constraintname;
 | |
| 
 | |
|         if ((*it)->ColumnOID() == oid)
 | |
|             return (*it)->GetStringData(0);
 | |
|     }
 | |
| 
 | |
|     return constraintname;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::RIDList CalpontSystemCatalog::constraintColRIDs(const TableName& tableName)
 | |
| {
 | |
|     /* SQL statement: select constraintname from sysconstraintcol where schema=tableColName.schema and
 | |
|      * tablename=tableColName.table;
 | |
|      */
 | |
|     RIDList ridlist;
 | |
|     TableColName aTableColName;
 | |
|     aTableColName.schema = tableName.schema;
 | |
|     aTableColName.table = tableName.table;
 | |
| 
 | |
|     if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter constraintColRIDs: " << tableName.schema << "|"
 | |
|               << tableName.table << endl;
 | |
| 
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + CONSTRAINTNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + CONSTRAINTNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid = DICTOID_SYSCONSTRAINTCOL_CONSTRAINTNAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c2->clone(),
 | |
|                                          new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSCONSTRAINTCOL_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
|     ROPair rid;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->ColumnOID() == oid)
 | |
|         {
 | |
|             for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|             {
 | |
|                 if (fIdentity == EC)
 | |
|                     rid.rid = (*it)->GetRid(i);
 | |
| 
 | |
|                 ridlist.push_back(rid);
 | |
|             }
 | |
| 
 | |
|             return ridlist;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return ridlist;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::RID CalpontSystemCatalog::constraintColRID(const TableColName& tableColName)
 | |
| {
 | |
|     /* SQL statement: select constraintname from sysconstraintcol where schema=tableColName.schema and
 | |
|      * tablename=tableColName.table and columnname=tableColName.column;
 | |
|      */
 | |
|     RID rid = 0;
 | |
|     TableColName aTableColName;
 | |
|     aTableColName.schema = tableColName.schema;
 | |
|     aTableColName.table = tableColName.table;
 | |
|     aTableColName.column = tableColName.column;
 | |
|     boost::algorithm::to_lower(aTableColName.column);
 | |
| 
 | |
|     if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter constraintColRID: " << tableColName.schema << "|"
 | |
|               << tableColName.table << "|"
 | |
|               << tableColName.column << "(note: rowid not fully implemented)" << endl;
 | |
| 
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + CONSTRAINTNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|     SimpleColumn* c4 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + COLNAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + CONSTRAINTNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     srcp.reset(c4);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + COLNAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid = DICTOID_SYSCONSTRAINTCOL_CONSTRAINTNAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c2->clone(),
 | |
|                                          new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f3 = new SimpleFilter (opeq,
 | |
|                                          c4->clone(),
 | |
|                                          new ConstantColumn(aTableColName.column, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f3);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSCONSTRAINTCOL_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->ColumnOID() == oid)
 | |
|         {
 | |
|             if (fIdentity == EC)
 | |
|                 rid = (*it)->GetRid(0);
 | |
| 
 | |
|             return rid;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return std::numeric_limits<RID>::max();
 | |
| }
 | |
| #endif
 | |
| 
 | |
| const vector<pair<CalpontSystemCatalog::OID, CalpontSystemCatalog::TableName> >
 | |
| CalpontSystemCatalog::getTables(const std::string schema, int lower_case_table_names)
 | |
| {
 | |
|   string schemaname = schema;
 | |
|   if (lower_case_table_names)
 | |
|   {
 | |
|     boost::algorithm::to_lower(schemaname);
 | |
|   }
 | |
|   vector<pair<OID, TableName> > tables;
 | |
| 
 | |
|   if (schemaname == CALPONT_SCHEMA)
 | |
|   {
 | |
|     // systables
 | |
|     tables.push_back(make_pair(SYSTABLE_BASE, make_table(CALPONT_SCHEMA, SYSTABLE_TABLE)));
 | |
|     tables.push_back(make_pair(SYSCOLUMN_BASE, make_table(CALPONT_SCHEMA, SYSCOLUMN_TABLE)));
 | |
|     return tables;
 | |
|   }
 | |
| 
 | |
|   DEBUG << "Enter getTables" << endl;
 | |
|   // SQL statement: select tablename from systable where schemaname = schema;
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   SimpleColumn* c1 =
 | |
|       new SimpleColumn(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|   SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|   SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + OBJECTID_COL, fSessionID);
 | |
|   SimpleColumn* c4 =
 | |
|       new SimpleColumn(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + CREATEDATE_COL, fSessionID);
 | |
| 
 | |
|   SRCP srcp;
 | |
|   srcp.reset(c1);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + TABLENAME_COL, srcp));
 | |
|   srcp.reset(c2);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + SCHEMA_COL, srcp));
 | |
|   srcp.reset(c3);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + OBJECTID_COL, srcp));
 | |
|   srcp.reset(c4);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + CREATEDATE_COL, srcp));
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   srcp.reset(c1->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   srcp.reset(c2->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   csep.returnedCols(returnedColumnList);
 | |
|   OID oid1 = DICTOID_SYSTABLE_TABLENAME;
 | |
|   OID oid2 = DICTOID_SYSTABLE_SCHEMA;
 | |
| 
 | |
|   if (!schema.empty())
 | |
|   {
 | |
|     // Filters
 | |
|     SimpleFilter* f1 =
 | |
|         new SimpleFilter(opeq, c2->clone(), new ConstantColumn(schemaname, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
|   }
 | |
| 
 | |
|   NJLSysDataList sysDataList;
 | |
|   getSysData(csep, sysDataList, SYSTABLE_TABLE);
 | |
| 
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
|   vector<string> tnl;
 | |
|   ROPair rp;
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == oid1)
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|       {
 | |
|         tables.push_back(make_pair(0, make_table("", (*it)->GetStringData(i).safeString(""))));
 | |
|         tnl.push_back((*it)->GetStringData(i).safeString(""));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == oid2)
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         tables[i].second.schema = (*it)->GetStringData(i).safeString("");
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == c4->oid())
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         tables[i].second.create_date = (*it)->GetData(i);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == c3->oid())
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|       {
 | |
|         rp.objnum = (OID)((*it)->GetData(i));
 | |
| 
 | |
|         if (fIdentity == EC)
 | |
|           rp.rid = (*it)->GetRid(i);
 | |
| 
 | |
|         fTablemap[tables[i].second] = rp.objnum;
 | |
|         fTableRIDmap[tables[i].second] = rp.rid;
 | |
|         tables[i].first = rp.objnum;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return tables;
 | |
| }
 | |
| 
 | |
| /* SQL statement: select objectid from systable */
 | |
| int CalpontSystemCatalog::getTableCount()
 | |
| {
 | |
|   int tableCnt = 0;
 | |
| 
 | |
|   DEBUG << "Enter getTableCount" << endl;
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + OBJECTID_COL, fSessionID);
 | |
| 
 | |
|   SRCP srcp;
 | |
|   srcp.reset(c1);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + OBJECTID_COL, srcp));
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   srcp.reset(c1->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   csep.returnedCols(returnedColumnList);
 | |
|   OID oid1 = OID_SYSTABLE_OBJECTID;
 | |
| 
 | |
|   NJLSysDataList sysDataList;
 | |
|   getSysData(csep, sysDataList, SYSTABLE_TABLE);
 | |
| 
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == oid1)
 | |
|     {
 | |
|       tableCnt = (*it)->dataCount();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return tableCnt;
 | |
| }
 | |
| /* SQL statement: select objectid from syscolumn where schema=tableColName.schema and
 | |
|  * tablename=tableColName.table and columnname=tableColName.column;*/
 | |
| const CalpontSystemCatalog::ROPair CalpontSystemCatalog::columnRID(const TableColName& tableColName,
 | |
|                                                                    int lower_case_table_names)
 | |
| {
 | |
|   ROPair rp;
 | |
|   TableColName aTableColName;
 | |
|   aTableColName.schema = tableColName.schema;
 | |
|   aTableColName.table = tableColName.table;
 | |
|   aTableColName.column = tableColName.column;
 | |
|   if (lower_case_table_names)
 | |
|   {
 | |
|     boost::algorithm::to_lower(aTableColName.schema);
 | |
|     boost::algorithm::to_lower(aTableColName.table);
 | |
|   }
 | |
|   boost::algorithm::to_lower(aTableColName.column);
 | |
| 
 | |
|   if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|     DEBUG << "Enter columnRID: " << tableColName.schema << "|" << tableColName.table << "|"
 | |
|           << tableColName.column << endl;
 | |
| 
 | |
|   // Check whether cache needs to be flushed
 | |
|   if (aTableColName.schema.compare(CALPONT_SCHEMA))
 | |
|   {
 | |
|     checkSysCatVer();
 | |
|   }
 | |
| 
 | |
|   /* SQL statement: select objectid from syscolumn where schema=tableColName.schema and
 | |
|      tablename=tableColName.table and columnname=tableColName.column;*/
 | |
|   // this function is duplicate to lookupOID() and will be deprecated soon
 | |
|   rp.objnum = lookupOID(tableColName);
 | |
|   boost::mutex::scoped_lock lk2(fOIDmapLock);
 | |
| 
 | |
|   ColRIDmap::const_iterator iter = fColRIDmap.find(aTableColName);
 | |
| 
 | |
|   if (iter != fColRIDmap.end())
 | |
|     rp.rid = (*iter).second;
 | |
| 
 | |
|   return rp;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::RIDList CalpontSystemCatalog::columnRIDs(const TableName& tableName,
 | |
|                                                                      bool useCache,
 | |
|                                                                      int lower_case_table_names)
 | |
| {
 | |
|   TableName aTableName(tableName);
 | |
| 
 | |
|   if (lower_case_table_names)
 | |
|   {
 | |
|     boost::algorithm::to_lower(aTableName.schema);
 | |
|     boost::algorithm::to_lower(aTableName.table);
 | |
|   }
 | |
| 
 | |
|   if (aTableName.schema.empty() || aTableName.table.empty())
 | |
|     throw runtime_error("ColumnRIDs: Invalid table name");
 | |
| 
 | |
|   if (aTableName.schema != CALPONT_SCHEMA)
 | |
|     DEBUG << "Enter columnRIDs: " << tableName.schema << "|" << tableName.table << endl;
 | |
| 
 | |
|   RIDList rl;
 | |
| 
 | |
|   // Check whether cache needs to be flushed
 | |
|   if (aTableName.schema != CALPONT_SCHEMA)
 | |
|   {
 | |
|     checkSysCatVer();
 | |
|   }
 | |
| 
 | |
|   boost::mutex::scoped_lock lk1(fTableInfoMapLock);
 | |
|   TableInfoMap::const_iterator ti_iter = fTableInfoMap.find(aTableName);
 | |
| 
 | |
|   // search fOIDmap for system catalog tables
 | |
|   // or if fTableInfoMap has entry for this table, column oids are cached.
 | |
|   // because columnRIDs(), colType() and tableInfo() are actually binded.
 | |
| #if BOOST_VERSION < 103800
 | |
|   boost::mutex::scoped_lock lk2(fOIDmapLock, false);
 | |
| #else
 | |
|   boost::mutex::scoped_lock lk2(fOIDmapLock, boost::defer_lock);
 | |
| #endif
 | |
|   boost::mutex::scoped_lock lk3(fColinfomapLock);
 | |
| 
 | |
|   if (aTableName.schema == CALPONT_SCHEMA || (useCache && ti_iter != fTableInfoMap.end()))
 | |
|   {
 | |
|     if (aTableName.schema == CALPONT_SCHEMA)
 | |
|       lk3.unlock();
 | |
|     else
 | |
|       rl.resize(ti_iter->second.numOfCols);
 | |
| 
 | |
|     lk2.lock();
 | |
| 
 | |
|     if (aTableName.schema != CALPONT_SCHEMA)
 | |
|       DEBUG << "for " << aTableName << ", searching " << fOIDmap.size() << " oids" << endl;
 | |
| 
 | |
|     OIDmap::const_iterator iter = fOIDmap.begin();
 | |
| 
 | |
|     while (iter != fOIDmap.end())
 | |
|     {
 | |
|       TableColName tableColName = (*iter).first;
 | |
| 
 | |
|       if (tableColName.schema == aTableName.schema && tableColName.table == aTableName.table)
 | |
|       {
 | |
|         ROPair rp;
 | |
|         rp.objnum = (*iter).second;
 | |
|         ColRIDmap::const_iterator rid_iter = fColRIDmap.find(tableColName);
 | |
| 
 | |
|         if (rid_iter != fColRIDmap.end())
 | |
|           rp.rid = (*rid_iter).second;
 | |
| 
 | |
|         // @bug 1584. make sure the columns are in position order
 | |
|         if (aTableName.schema == CALPONT_SCHEMA)
 | |
|         {
 | |
|           rl.push_back(rp);
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|           Colinfomap::const_iterator ct_iter = fColinfomap.find(rp.objnum);
 | |
|           rl[ct_iter->second.colPosition] = rp;
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       ++iter;
 | |
|     }
 | |
| 
 | |
|     if (aTableName.schema != CALPONT_SCHEMA)
 | |
|       DEBUG << aTableName << " was cached: " << rl.size() << " rows" << endl;
 | |
| 
 | |
|     return rl;
 | |
|   }
 | |
| 
 | |
|   lk1.unlock();
 | |
|   lk3.unlock();
 | |
| 
 | |
|   if (aTableName.schema != CALPONT_SCHEMA)
 | |
|     DEBUG << aTableName << " was not cached, fetching..." << endl;
 | |
| 
 | |
|   // get real data from system catalog for all user tables. don't check cache
 | |
|   // because cache may not have complete columns for this table
 | |
|   // SQL statement: select objectid,columnname from syscolumn where schema=tableName.schema and
 | |
|   // tablename=tableName.table;
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   string columnlength = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLUMNLEN_COL;
 | |
|   string objectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + OBJECTID_COL;
 | |
|   string datatype = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + DATATYPE_COL;
 | |
|   string dictobjectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + DICTOID_COL;
 | |
|   string listobjectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + LISTOBJID_COL;
 | |
|   string treeobjectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TREEOBJID_COL;
 | |
|   string columnposition = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLUMNPOS_COL;
 | |
|   string scale = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + SCALE_COL;
 | |
|   string precision = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + PRECISION_COL;
 | |
|   string defaultvalue = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + DEFAULTVAL_COL;
 | |
|   // the following columns will be save in cache although it's not needed for now
 | |
|   string columnname = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLNAME_COL;
 | |
|   string tablename = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TABLENAME_COL;
 | |
|   string schemaname = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + SCHEMA_COL;
 | |
|   string nullable = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + NULLABLE_COL;
 | |
|   string compressiontype = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COMPRESSIONTYPE_COL;
 | |
|   string autoIncrement = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + AUTOINC_COL;
 | |
|   string nextVal = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + NEXTVALUE_COL;
 | |
|   string charsetnum = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + CHARSETNUM_COL;
 | |
| 
 | |
|   SimpleColumn* col[18];
 | |
|   col[0] = new SimpleColumn(columnlength, fSessionID);
 | |
|   col[1] = new SimpleColumn(objectid, fSessionID);
 | |
|   col[2] = new SimpleColumn(datatype, fSessionID);
 | |
|   col[3] = new SimpleColumn(dictobjectid, fSessionID);
 | |
|   col[4] = new SimpleColumn(listobjectid, fSessionID);
 | |
|   col[5] = new SimpleColumn(treeobjectid, fSessionID);
 | |
|   col[6] = new SimpleColumn(columnposition, fSessionID);
 | |
|   col[7] = new SimpleColumn(scale, fSessionID);
 | |
|   col[8] = new SimpleColumn(precision, fSessionID);
 | |
|   col[9] = new SimpleColumn(defaultvalue, fSessionID);
 | |
|   col[10] = new SimpleColumn(schemaname, fSessionID);
 | |
|   col[11] = new SimpleColumn(tablename, fSessionID);
 | |
|   col[12] = new SimpleColumn(columnname, fSessionID);
 | |
|   col[13] = new SimpleColumn(nullable, fSessionID);
 | |
|   col[14] = new SimpleColumn(compressiontype, fSessionID);
 | |
|   col[15] = new SimpleColumn(autoIncrement, fSessionID);
 | |
|   col[16] = new SimpleColumn(nextVal, fSessionID);
 | |
|   col[17] = new SimpleColumn(charsetnum, fSessionID);
 | |
| 
 | |
|   SRCP srcp;
 | |
|   srcp.reset(col[0]);
 | |
|   colMap.insert(CMVT_(columnlength, srcp));
 | |
|   srcp.reset(col[1]);
 | |
|   colMap.insert(CMVT_(objectid, srcp));
 | |
|   srcp.reset(col[2]);
 | |
|   colMap.insert(CMVT_(datatype, srcp));
 | |
|   srcp.reset(col[3]);
 | |
|   colMap.insert(CMVT_(dictobjectid, srcp));
 | |
|   srcp.reset(col[4]);
 | |
|   colMap.insert(CMVT_(listobjectid, srcp));
 | |
|   srcp.reset(col[5]);
 | |
|   colMap.insert(CMVT_(treeobjectid, srcp));
 | |
|   srcp.reset(col[6]);
 | |
|   colMap.insert(CMVT_(columnposition, srcp));
 | |
|   srcp.reset(col[7]);
 | |
|   colMap.insert(CMVT_(scale, srcp));
 | |
|   srcp.reset(col[8]);
 | |
|   colMap.insert(CMVT_(precision, srcp));
 | |
| 
 | |
|   srcp.reset(col[9]);
 | |
|   colMap.insert(CMVT_(defaultvalue, srcp));
 | |
|   srcp.reset(col[10]);
 | |
|   colMap.insert(CMVT_(schemaname, srcp));
 | |
|   srcp.reset(col[11]);
 | |
|   colMap.insert(CMVT_(tablename, srcp));
 | |
|   srcp.reset(col[12]);
 | |
|   colMap.insert(CMVT_(columnname, srcp));
 | |
|   srcp.reset(col[13]);
 | |
|   colMap.insert(CMVT_(nullable, srcp));
 | |
|   srcp.reset(col[14]);
 | |
|   colMap.insert(CMVT_(compressiontype, srcp));
 | |
|   srcp.reset(col[15]);
 | |
|   colMap.insert(CMVT_(autoIncrement, srcp));
 | |
|   srcp.reset(col[16]);
 | |
|   colMap.insert(CMVT_(nextVal, srcp));
 | |
|   srcp.reset(col[17]);
 | |
|   colMap.insert(CMVT_(charsetnum, srcp));
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   srcp.reset(col[1]->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   csep.returnedCols(returnedColumnList);
 | |
| 
 | |
|   OID oid[18];
 | |
| 
 | |
|   for (int i = 0; i < 18; i++)
 | |
|     oid[i] = col[i]->oid();
 | |
| 
 | |
|   oid[12] = DICTOID_SYSCOLUMN_COLNAME;
 | |
|   // Filters
 | |
|   SimpleFilter* f1 = new SimpleFilter(opeq, col[10]->clone(),
 | |
|                                       new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f1);
 | |
|   filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|   SimpleFilter* f2 =
 | |
|       new SimpleFilter(opeq, col[11]->clone(), new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f2);
 | |
|   csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|   ostringstream oss;
 | |
|   oss << "select objectid,columnname from syscolumn where schema='" << aTableName.schema
 | |
|       << "' and tablename='" << aTableName.table << "' --columnRIDs/";
 | |
| 
 | |
|   if (fIdentity == EC)
 | |
|     oss << "EC";
 | |
|   else
 | |
|     oss << "FE";
 | |
| 
 | |
|   csep.data(oss.str());
 | |
|   NJLSysDataList sysDataList;
 | |
|   getSysData(csep, sysDataList, SYSCOLUMN_TABLE);
 | |
| 
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
|   ColType ct;
 | |
|   ColType* ctList = NULL;
 | |
|   TableInfo ti;
 | |
|   ti.tablewithautoincr = NO_AUTOINCRCOL;
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == oid[1])  // objectid
 | |
|     {
 | |
|       DEBUG << "column count: " << (*it)->dataCount() << endl;
 | |
|       // populate tableinfo cache for numOfCols
 | |
|       ti.numOfCols = (*it)->dataCount();
 | |
|       //			ti.tablewithautoincr = NO_AUTOINCRCOL;
 | |
| 
 | |
|       ctList = new ColType[ti.numOfCols];
 | |
| 
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|       {
 | |
|         ROPair rp;
 | |
|         //                 rp.rid = -1;
 | |
|         rp.objnum = (*it)->GetData(i);
 | |
| 
 | |
|         if (fIdentity == EC)
 | |
|           rp.rid = (*it)->GetRid(i);
 | |
| 
 | |
|         DEBUG << rp.rid << " ";
 | |
|         rl.push_back(rp);
 | |
|         ColType ct;
 | |
|         ct.columnOID = rp.objnum;
 | |
|         ctList[i] = ct;
 | |
|       }
 | |
| 
 | |
|       DEBUG << endl;
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[15])  // autoincrement
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|       {
 | |
|         ostringstream os;
 | |
|         os << (char)(*it)->GetData(i);
 | |
| 
 | |
|         if (os.str().compare("y") == 0)
 | |
|         {
 | |
|           ti.tablewithautoincr = AUTOINCRCOL;
 | |
|           break;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     lk1.lock();
 | |
|     fTableInfoMap[aTableName] = ti;
 | |
|     lk1.unlock();
 | |
|   }
 | |
| 
 | |
|   // loop 2nd time to make sure rl has been populated.
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == oid[12])
 | |
|     {
 | |
|       lk2.lock();
 | |
| 
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|       {
 | |
|         TableColName tcn =
 | |
|             make_tcn(aTableName.schema, aTableName.table, (*it)->GetStringData(i).safeString(""));
 | |
|         fOIDmap[tcn] = rl[i].objnum;
 | |
| 
 | |
|         if (fIdentity == EC)
 | |
|           fColRIDmap[tcn] = rl[i].rid;
 | |
|       }
 | |
| 
 | |
|       lk2.unlock();
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[0])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].colWidth = (*it)->GetData(i);
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[2])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].colDataType = (ColDataType)((*it)->GetData(i));
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[3])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].ddn.dictOID = ((*it)->GetData(i));
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[4])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].ddn.listOID = ((*it)->GetData(i));
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[5])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].ddn.treeOID = ((*it)->GetData(i));
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[6])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].colPosition = ((*it)->GetData(i));
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[7])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].scale = ((*it)->GetData(i));
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[8])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].precision = ((*it)->GetData(i));
 | |
|     }
 | |
|     // TODO: check datatype to call GetData() or GetStringData()
 | |
|     else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_DEFAULTVAL)
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|       {
 | |
|         ctList[i].defaultValue = ((*it)->GetStringData(i));
 | |
| 
 | |
|         if (!ctList[i].defaultValue.isNull())
 | |
|         {
 | |
|           if (ctList[i].constraintType != NOTNULL_CONSTRAINT)
 | |
|             ctList[i].constraintType = DEFAULT_CONSTRAINT;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[13])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         if ((*it)->GetData(i) == 0)
 | |
|           ctList[i].constraintType = NOTNULL_CONSTRAINT;
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[14])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].compressionType = ctList[i].ddn.compressionType = ((*it)->GetData(i));
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[15])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|       {
 | |
|         ostringstream os;
 | |
|         os << (char)(*it)->GetData(i);
 | |
| 
 | |
|         if (os.str().compare("y") == 0)
 | |
|           ctList[i].autoincrement = true;
 | |
|         else
 | |
|           ctList[i].autoincrement = false;
 | |
|       }
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[16])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].nextvalue = ((*it)->GetData(i));
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[17])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].charsetNumber = ((*it)->GetData(i));
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   // MCOL-895 sort ctList, we can't specify an ORDER BY to do this yet
 | |
|   std::sort(ctList, ctList + ti.numOfCols, ctListSort);
 | |
| 
 | |
|   // populate colinfo cache
 | |
|   lk3.lock();
 | |
| 
 | |
|   for (int i = 0; i < ti.numOfCols; i++)
 | |
|     fColinfomap[ctList[i].columnOID] = ctList[i];
 | |
| 
 | |
|   lk3.unlock();
 | |
| 
 | |
|   // Re-sort the output based on the sorted ctList
 | |
|   // Don't need to do this for the cached list as this will be already sorted
 | |
|   RIDList rlOut;
 | |
| 
 | |
|   for (int i = 0; i < ti.numOfCols; i++)
 | |
|   {
 | |
|     OID objid = ctList[i].columnOID;
 | |
| 
 | |
|     for (size_t j = 0; j < rl.size(); j++)
 | |
|     {
 | |
|       if (rl[j].objnum == objid)
 | |
|       {
 | |
|         rlOut.push_back(rl[j]);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   delete[] ctList;
 | |
| 
 | |
|   // delete col[9];
 | |
|   if (rlOut.size() != 0)
 | |
|   {
 | |
|     return rlOut;
 | |
|   }
 | |
| 
 | |
|   Message::Args args;
 | |
|   args.add("'" + tableName.schema + "." + tableName.table + "'");
 | |
|   throw IDBExcept(ERR_TABLE_NOT_IN_CATALOG, args);
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::TableName CalpontSystemCatalog::tableName(const OID& tableoid)
 | |
| {
 | |
|   // Check whether cache needs to be flushed
 | |
|   if (tableoid >= 3000)
 | |
|   {
 | |
|     checkSysCatVer();
 | |
|   }
 | |
| 
 | |
|   // check cache
 | |
|   boost::mutex::scoped_lock lk(fTableNameMapLock);
 | |
| 
 | |
|   if (fTableNameMap.size() > 0)
 | |
|   {
 | |
|     TableNameMap::const_iterator iter = fTableNameMap.find(tableoid);
 | |
| 
 | |
|     if (iter != fTableNameMap.end())
 | |
|       return iter->second;
 | |
|   }
 | |
| 
 | |
|   lk.unlock();
 | |
| 
 | |
|   // select schema, tablename from systable where objectid = tableoid
 | |
|   TableName tableName;
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + OBJECTID_COL, fSessionID);
 | |
|   SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|   SimpleColumn* c3 =
 | |
|       new SimpleColumn(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
| 
 | |
|   SRCP srcp;
 | |
|   srcp.reset(c1);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + OBJECTID_COL, srcp));
 | |
|   srcp.reset(c2);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + SCHEMA_COL, srcp));
 | |
|   srcp.reset(c3);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + TABLENAME_COL, srcp));
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   srcp.reset(c2->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   srcp.reset(c3->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   csep.returnedCols(returnedColumnList);
 | |
| 
 | |
|   OID oid2 = DICTOID_SYSTABLE_SCHEMA;
 | |
|   OID oid3 = DICTOID_SYSTABLE_TABLENAME;
 | |
| 
 | |
|   // Filters
 | |
|   SimpleFilter* f1 =
 | |
|       new SimpleFilter(opeq, c1->clone(), new ConstantColumn((int64_t)tableoid, ConstantColumn::NUM));
 | |
|   filterTokenList.push_back(f1);
 | |
|   csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|   ostringstream oss;
 | |
|   oss << "select schema,tablename,columnname from syscolumn where objectid=" << tableoid << " --colName/";
 | |
| 
 | |
|   if (fIdentity == EC)
 | |
|     oss << "EC";
 | |
|   else
 | |
|     oss << "FE";
 | |
| 
 | |
|   csep.data(oss.str());
 | |
|   NJLSysDataList sysDataList;
 | |
| 
 | |
|   try
 | |
|   {
 | |
|     getSysData(csep, sysDataList, SYSTABLE_TABLE);
 | |
|   }
 | |
|   catch (runtime_error& e)
 | |
|   {
 | |
|     throw runtime_error(e.what());
 | |
|   }
 | |
| 
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->dataCount() == 0)
 | |
|     {
 | |
|       Message::Args args;
 | |
|       oss << tableoid;
 | |
|       args.add("'" + oss.str() + "'");
 | |
|       throw IDBExcept(ERR_TABLE_NOT_IN_CATALOG, args);
 | |
|     }
 | |
| 
 | |
|     if ((*it)->ColumnOID() == oid2)
 | |
|       tableName.schema = (*it)->GetStringData(0).safeString("");
 | |
|     else if ((*it)->ColumnOID() == oid3)
 | |
|       tableName.table = (*it)->GetStringData(0).safeString("");
 | |
|   }
 | |
| 
 | |
|   //@Bug 2682. datacount 0 sometimes does not mean the table is not found.
 | |
|   if ((tableName.schema.length() == 0) || (tableName.table.length() == 0))
 | |
|   {
 | |
|     Message::Args args;
 | |
|     oss << tableoid;
 | |
|     args.add("'" + oss.str() + "'");
 | |
|     throw IDBExcept(ERR_TABLE_NOT_IN_CATALOG, args);
 | |
|   }
 | |
| 
 | |
|   // populate cache
 | |
|   lk.lock();
 | |
|   fTableNameMap[tableoid] = tableName;
 | |
|   lk.unlock();
 | |
|   return tableName;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::ROPair CalpontSystemCatalog::tableRID(const TableName& tableName,
 | |
|                                                                   int lower_case_table_names)
 | |
| {
 | |
|   TableName aTableName;
 | |
|   aTableName.schema = tableName.schema;
 | |
|   aTableName.table = tableName.table;
 | |
|   if (lower_case_table_names)
 | |
|   {
 | |
|     boost::algorithm::to_lower(aTableName.schema);
 | |
|     boost::algorithm::to_lower(aTableName.table);
 | |
|   }
 | |
| 
 | |
|   if (aTableName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|     DEBUG << "Enter tableRID: " << tableName.schema << "|" << tableName.table << endl;
 | |
| 
 | |
|   // look up cache first for system table and cached table
 | |
|   ROPair rp;
 | |
|   //     rp.rid = -1; @bug1866  use default
 | |
| 
 | |
|   // calpontsys only needs oid
 | |
|   boost::mutex::scoped_lock lk1(fTableInfoMapLock);
 | |
|   Tablemap::const_iterator iter = fTablemap.find(aTableName);
 | |
| 
 | |
|   if (aTableName.schema.compare("calpontsys") == 0 && iter != fTablemap.end())
 | |
|   {
 | |
|     rp.objnum = (*iter).second;
 | |
|     return rp;
 | |
|   }
 | |
| 
 | |
|   lk1.unlock();
 | |
| 
 | |
|   checkSysCatVer();
 | |
| 
 | |
|   lk1.lock();
 | |
|   iter = fTablemap.find(aTableName);
 | |
|   TableRIDmap::const_iterator rid_iter = fTableRIDmap.find(aTableName);
 | |
| 
 | |
|   if (iter != fTablemap.end() && rid_iter != fTableRIDmap.end())
 | |
|   {
 | |
|     rp.objnum = (*iter).second;
 | |
|     rp.rid = (*rid_iter).second;
 | |
|     return rp;
 | |
|   }
 | |
| 
 | |
|   lk1.unlock();
 | |
| 
 | |
|   // select objectid from systable where schema = tableName.schema and tablename = tableName.table;
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + OBJECTID_COL, fSessionID);
 | |
|   SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|   SimpleColumn* c3 =
 | |
|       new SimpleColumn(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
| 
 | |
|   SRCP srcp;
 | |
|   srcp.reset(c1);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + OBJECTID_COL, srcp));
 | |
|   srcp.reset(c2);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + SCHEMA_COL, srcp));
 | |
|   srcp.reset(c3);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSTABLE_TABLE + "." + TABLENAME_COL, srcp));
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   srcp.reset(c1->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   csep.returnedCols(returnedColumnList);
 | |
|   OID oid = c1->oid();
 | |
| 
 | |
|   // Filters
 | |
|   SimpleFilter* f1 =
 | |
|       new SimpleFilter(opeq, c2->clone(), new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f1);
 | |
|   filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|   SimpleFilter* f2 =
 | |
|       new SimpleFilter(opeq, c3->clone(), new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f2);
 | |
|   csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|   ostringstream oss;
 | |
|   oss << "select objectid from systable where schema='" << aTableName.schema << "' and tablename='"
 | |
|       << aTableName.table << "' --tableRID/";
 | |
| 
 | |
|   if (fIdentity == EC)
 | |
|     oss << "EC";
 | |
|   else
 | |
|     oss << "FE";
 | |
| 
 | |
|   csep.data(oss.str());  //@bug 6078. Log the statement
 | |
| 
 | |
|   NJLSysDataList sysDataList;
 | |
| 
 | |
|   try
 | |
|   {
 | |
|     getSysData(csep, sysDataList, SYSTABLE_TABLE);
 | |
|   }
 | |
|   catch (IDBExcept&)
 | |
|   {
 | |
|     throw;
 | |
|   }
 | |
|   catch (runtime_error& e)
 | |
|   {
 | |
|     throw runtime_error(e.what());
 | |
|   }
 | |
| 
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->dataCount() == 0)
 | |
|     {
 | |
|       Message::Args args;
 | |
|       args.add("'" + tableName.schema + "." + tableName.table + "'");
 | |
|       // throw logging::NoTableExcept(msg);
 | |
|       throw IDBExcept(ERR_TABLE_NOT_IN_CATALOG, args);
 | |
|     }
 | |
| 
 | |
|     if ((*it)->ColumnOID() == oid)
 | |
|     {
 | |
|       rp.objnum = (OID)((*it)->GetData(0));
 | |
| 
 | |
|       if (fIdentity == EC)
 | |
|       {
 | |
|         rp.rid = (*it)->GetRid(0);
 | |
|       }
 | |
| 
 | |
|       // populate cache
 | |
|       lk1.lock();
 | |
|       fTablemap[aTableName] = rp.objnum;
 | |
|       fTableRIDmap[aTableName] = rp.rid;
 | |
|       return rp;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   // string msg("CalpontSystemCatalog::tableRID: no OID found for ");
 | |
|   // msg += tableName.schema;
 | |
|   // msg += ".";
 | |
|   // msg += tableName.table;
 | |
|   Message::Args args;
 | |
|   args.add("'" + tableName.schema + "." + tableName.table + "'");
 | |
|   // throw logging::NoTableExcept(msg);
 | |
|   throw IDBExcept(ERR_TABLE_NOT_IN_CATALOG, args);
 | |
| }
 | |
| 
 | |
| // This function is similar to CalpontSystemCatalog::tableRID, except that
 | |
| // instead of returning a ROPair for the table, it returns the OID for the
 | |
| // AUX column for the table
 | |
| CalpontSystemCatalog::OID CalpontSystemCatalog::tableAUXColumnOID(const TableName& tableName,
 | |
|                                                                   int lower_case_table_names)
 | |
| {
 | |
|   TableName aTableName;
 | |
|   aTableName.schema = tableName.schema;
 | |
|   aTableName.table = tableName.table;
 | |
|   if (lower_case_table_names)
 | |
|   {
 | |
|     boost::algorithm::to_lower(aTableName.schema);
 | |
|     boost::algorithm::to_lower(aTableName.table);
 | |
|   }
 | |
| 
 | |
|   if (aTableName.schema.compare(CALPONT_SCHEMA) == 0)
 | |
|   {
 | |
|     std::ostringstream oss;
 | |
|     oss << "tableAUXColumnOID() cannot be called on a ";
 | |
|     oss << CALPONT_SCHEMA << " schema table";
 | |
|     throw runtime_error(oss.str());
 | |
|   }
 | |
| 
 | |
|   DEBUG << "Enter tableAUXColumnOID: " << tableName.schema << "|" << tableName.table << endl;
 | |
| 
 | |
|   // look up the OID in the cache first
 | |
|   OID auxColOid;
 | |
| 
 | |
|   checkSysCatVer();
 | |
| 
 | |
|   boost::mutex::scoped_lock lk1(fTableAUXColumnOIDMapLock);
 | |
|   TableOIDmap::const_iterator iter = fTableAUXColumnOIDMap.find(aTableName);
 | |
| 
 | |
|   if (iter != fTableAUXColumnOIDMap.end())
 | |
|   {
 | |
|     auxColOid = iter->second;
 | |
|     return auxColOid;
 | |
|   }
 | |
| 
 | |
|   lk1.unlock();
 | |
| 
 | |
|   // select auxcolumnoid from systable where schema = tableName.schema and tablename = tableName.table;
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   static const std::string sysCatSchemaTablePrefix = CALPONT_SCHEMA + "." + SYSTABLE_TABLE + ".";
 | |
| 
 | |
|   SimpleColumn* c1 = new SimpleColumn(sysCatSchemaTablePrefix + AUXCOLUMNOID_COL, fSessionID);
 | |
|   SimpleColumn* c2 = new SimpleColumn(sysCatSchemaTablePrefix + SCHEMA_COL, fSessionID);
 | |
|   SimpleColumn* c3 = new SimpleColumn(sysCatSchemaTablePrefix + TABLENAME_COL, fSessionID);
 | |
| 
 | |
|   SRCP srcp;
 | |
|   srcp.reset(c1);
 | |
|   colMap.insert(CMVT_(sysCatSchemaTablePrefix + AUXCOLUMNOID_COL, srcp));
 | |
|   srcp.reset(c2);
 | |
|   colMap.insert(CMVT_(sysCatSchemaTablePrefix + SCHEMA_COL, srcp));
 | |
|   srcp.reset(c3);
 | |
|   colMap.insert(CMVT_(sysCatSchemaTablePrefix + TABLENAME_COL, srcp));
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   srcp.reset(c1->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   csep.returnedCols(returnedColumnList);
 | |
|   OID oid = c1->oid();
 | |
| 
 | |
|   // Filters
 | |
|   SimpleFilter* f1 =
 | |
|       new SimpleFilter(opeq, c2->clone(), new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f1);
 | |
|   filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|   SimpleFilter* f2 =
 | |
|       new SimpleFilter(opeq, c3->clone(), new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f2);
 | |
|   csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|   ostringstream oss;
 | |
|   oss << "select auxcolumnoid from systable where schema='" << aTableName.schema << "' and tablename='"
 | |
|       << aTableName.table << "' --tableAUXColumnOID/";
 | |
| 
 | |
|   if (fIdentity == EC)
 | |
|     oss << "EC";
 | |
|   else
 | |
|     oss << "FE";
 | |
| 
 | |
|   csep.data(oss.str());  //@bug 6078. Log the statement
 | |
| 
 | |
|   NJLSysDataList sysDataList;
 | |
| 
 | |
|   try
 | |
|   {
 | |
|     getSysData(csep, sysDataList, SYSTABLE_TABLE);
 | |
|   }
 | |
|   catch (IDBExcept&)
 | |
|   {
 | |
|     throw;
 | |
|   }
 | |
|   catch (runtime_error& e)
 | |
|   {
 | |
|     throw runtime_error(e.what());
 | |
|   }
 | |
| 
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->dataCount() == 0)
 | |
|     {
 | |
|       Message::Args args;
 | |
|       args.add("'" + tableName.schema + "." + tableName.table + "'");
 | |
|       // throw logging::NoTableExcept(msg);
 | |
|       throw IDBExcept(ERR_TABLE_NOT_IN_CATALOG, args);
 | |
|     }
 | |
| 
 | |
|     if ((*it)->ColumnOID() == oid)
 | |
|     {
 | |
|       auxColOid = (OID)((*it)->GetData(0));
 | |
| 
 | |
|       // populate cache
 | |
|       lk1.lock();
 | |
|       fTableAUXColumnOIDMap[aTableName] = auxColOid;
 | |
|       return auxColOid;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   Message::Args args;
 | |
|   args.add("'" + tableName.schema + "." + tableName.table + "'");
 | |
|   // throw logging::NoTableExcept(msg);
 | |
|   throw IDBExcept(ERR_TABLE_NOT_IN_CATALOG, args);
 | |
| }
 | |
| 
 | |
| CalpontSystemCatalog::OID CalpontSystemCatalog::isAUXColumnOID(const OID& oid)
 | |
| {
 | |
|   DEBUG << "Enter isAUXColumnOID" << endl;
 | |
| 
 | |
|   checkSysCatVer();
 | |
| 
 | |
|   boost::mutex::scoped_lock lk1(fAUXColumnOIDToTableOIDMapLock);
 | |
|   AUXColumnOIDTableOIDmap::const_iterator iter = fAUXColumnOIDToTableOIDMap.find(oid);
 | |
| 
 | |
|   if (iter != fAUXColumnOIDToTableOIDMap.end())
 | |
|   {
 | |
|     return iter->second;
 | |
|   }
 | |
| 
 | |
|   lk1.unlock();
 | |
| 
 | |
|   // select objectid from systable where auxcolumnoid = oid;
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   static const std::string sysCatSchemaTablePrefix = CALPONT_SCHEMA + "." + SYSTABLE_TABLE + ".";
 | |
| 
 | |
|   SimpleColumn* c1 = new SimpleColumn(sysCatSchemaTablePrefix + OBJECTID_COL, fSessionID);
 | |
|   SimpleColumn* c2 = new SimpleColumn(sysCatSchemaTablePrefix + AUXCOLUMNOID_COL, fSessionID);
 | |
|   SRCP srcp;
 | |
|   srcp.reset(c1);
 | |
|   colMap.insert(CMVT_(sysCatSchemaTablePrefix + OBJECTID_COL, srcp));
 | |
|   srcp.reset(c2);
 | |
|   colMap.insert(CMVT_(sysCatSchemaTablePrefix + AUXCOLUMNOID_COL, srcp));
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   srcp.reset(c1->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   csep.returnedCols(returnedColumnList);
 | |
| 
 | |
|   CalpontSystemCatalog::OID systableOid = c1->oid();
 | |
| 
 | |
|   // Filters
 | |
|   SimpleFilter* f1 =
 | |
|       new SimpleFilter(opeq, c2->clone(), new ConstantColumn((int64_t)oid, ConstantColumn::NUM));
 | |
|   filterTokenList.push_back(f1);
 | |
|   csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|   ostringstream oss;
 | |
|   oss << "select objectid from systable where auxcolumnoid='" << oid << "' --isAUXColumnOID/";
 | |
| 
 | |
|   if (fIdentity == EC)
 | |
|     oss << "EC";
 | |
|   else
 | |
|     oss << "FE";
 | |
| 
 | |
|   csep.data(oss.str());  //@bug 6078. Log the statement
 | |
| 
 | |
|   NJLSysDataList sysDataList;
 | |
| 
 | |
|   try
 | |
|   {
 | |
|     getSysData(csep, sysDataList, SYSTABLE_TABLE);
 | |
|   }
 | |
|   catch (IDBExcept&)
 | |
|   {
 | |
|     throw;
 | |
|   }
 | |
|   catch (runtime_error& e)
 | |
|   {
 | |
|     throw runtime_error(e.what());
 | |
|   }
 | |
| 
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == systableOid)
 | |
|     {
 | |
|       if ((*it)->dataCount() == 1)
 | |
|       {
 | |
|         // populate cache
 | |
|         lk1.lock();
 | |
|         fAUXColumnOIDToTableOIDMap[oid] = (OID)((*it)->GetData(0));
 | |
|         return fAUXColumnOIDToTableOIDMap[oid];
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         break;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   // populate cache
 | |
|   lk1.lock();
 | |
|   fAUXColumnOIDToTableOIDMap[oid] = 0;
 | |
|   return fAUXColumnOIDToTableOIDMap[oid];
 | |
| }
 | |
| 
 | |
| #if 0
 | |
| const CalpontSystemCatalog::IndexNameList CalpontSystemCatalog::indexNames(const TableName& tableName)
 | |
| {
 | |
|     DEBUG << "Enter indexNames: " << tableName.schema << "|" << tableName.table << endl;
 | |
|     IndexNameList indexlist;
 | |
| 
 | |
|     TableName aTableName;
 | |
|     aTableName.schema = tableName.schema;
 | |
|     aTableName.table = tableName.table;
 | |
| 
 | |
|     /* SQL statement: select indexname from sysindex where schema=indexName.schema and
 | |
|      * tablename=indexName.table and indexname=indexName.index;
 | |
|      */
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + MULTICOLFLAG_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c4 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|     SimpleColumn* c5 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + INDEXNAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + MULTICOLFLAG_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c4);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     srcp.reset(c5);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + INDEXNAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c5->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     srcp.reset(c2->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid5 = DICTOID_SYSINDEX_INDEXNAME;
 | |
|     OID oid2 = c2->oid();
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c4->clone(),
 | |
|                                          new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSINDEX_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
|     IndexName indexName;
 | |
|     indexName.schema = tableName.schema;
 | |
|     indexName.table = tableName.table;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->ColumnOID() == oid5)
 | |
|         {
 | |
|             if (indexlist.size() != 0)
 | |
|             {
 | |
|                 for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|                     indexlist[i].index = (*it)->GetStringData(i);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|                 {
 | |
|                     indexName.index = (*it)->GetStringData(i);
 | |
|                     indexlist.push_back(indexName);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         else if ((*it)->ColumnOID() == oid2)
 | |
|         {
 | |
|             if (indexlist.size() != 0)
 | |
|             {
 | |
|                 for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|                     indexlist[i].multiColFlag = ((*it)->GetData(i) == 't' ? true : false);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|                 {
 | |
|                     indexName.multiColFlag = ((*it)->GetData(i) == 't' ? true : false);
 | |
|                     indexlist.push_back(indexName);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return indexlist;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::TableColNameList CalpontSystemCatalog::indexColNames ( const IndexName& indexName)
 | |
| {
 | |
|     DEBUG << "Enter indexColNames: " << indexName.schema << "|" << indexName.table << "|" << indexName.index << endl;
 | |
| 
 | |
|     // not cached yet
 | |
|     CalpontSystemCatalog::TableColNameList tableColNameList;
 | |
| 
 | |
|     IndexName aIndexName;
 | |
|     aIndexName.schema = indexName.schema;
 | |
|     aIndexName.table = indexName.table;
 | |
|     aIndexName.index = indexName.index;
 | |
|     boost::algorithm::to_lower(aIndexName.index);
 | |
| 
 | |
|     /* SQL statement: select columnname, columnposition from sysindexcol where schema=indexname.schema and
 | |
|      * tablename=indexName.table and indexname=indexName.index;
 | |
|      */
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + COLNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + COLUMNPOS_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c4 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|     SimpleColumn* c5 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + INDEXNAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + COLNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + COLUMNPOS_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c4);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     srcp.reset(c5);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + INDEXNAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     srcp.reset(c2->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid1 = DICTOID_SYSINDEXCOL_COLNAME;
 | |
|     OID oid2 = c2->oid();
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aIndexName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c4->clone(),
 | |
|                                          new ConstantColumn(aIndexName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f3 = new SimpleFilter (opeq,
 | |
|                                          c5->clone(),
 | |
|                                          new ConstantColumn(aIndexName.index, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f3);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSINDEXCOL_TABLE);
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|     // help arrays. assume max index in a table. for sorting purpose
 | |
|     int dataCount = (*sysDataList.begin())->dataCount();
 | |
|     TableColName result[dataCount];
 | |
|     vector<int> colPos;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->ColumnOID() == oid1)
 | |
|         {
 | |
|             TableColName tcn;
 | |
|             tcn.schema = indexName.schema;
 | |
|             tcn.table = indexName.table;
 | |
| 
 | |
|             for (int i = 0; i < dataCount; i++)
 | |
|             {
 | |
|                 tcn.column = (*it)->GetStringData(i);
 | |
|                 tableColNameList.push_back(tcn);
 | |
|             }
 | |
|         }
 | |
|         else if ((*it)->ColumnOID() == oid2)
 | |
|         {
 | |
|             for (int i = 0; i < dataCount; i++)
 | |
|                 colPos.push_back((*it)->GetData(i));
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // sorting tableColName based on columnPosition
 | |
|     vector<int>::iterator iter = colPos.begin();
 | |
|     TableColNameList::iterator iter1 = tableColNameList.begin();
 | |
| 
 | |
|     for (; iter != colPos.end(); iter++)
 | |
|     {
 | |
|         result[(*iter)] = (*iter1);
 | |
|         tableColNameList.erase(iter1);
 | |
|     }
 | |
| 
 | |
|     for (int i = 0; i < dataCount; i++)
 | |
|         tableColNameList.push_back(result[i]);
 | |
| 
 | |
|     return tableColNameList;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::TableColNameList CalpontSystemCatalog::constraintColNames ( const std::string constraintName)
 | |
| {
 | |
|     DEBUG << "Enter constraintColNames: " << constraintName << endl;
 | |
| 
 | |
|     std::string aConstraintName( constraintName );
 | |
| 
 | |
|     boost::algorithm::to_lower(aConstraintName);
 | |
| 
 | |
|     /* SQL statement: select columnname from sysconstraintcol where constraintname = aConstraintName
 | |
|      */
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + COLNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + CONSTRAINTNAME_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c4 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + COLNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + CONSTRAINTNAME_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c4);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINTCOL_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     srcp.reset(c3->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     srcp.reset(c4->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid1 = DICTOID_SYSCONSTRAINTCOL_COLNAME;
 | |
|     OID oid3 = DICTOID_SYSCONSTRAINTCOL_SCHEMA;
 | |
|     OID oid4 = DICTOID_SYSCONSTRAINTCOL_TABLENAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c2->clone(),
 | |
|                                          new ConstantColumn(aConstraintName, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
| 
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSCONSTRAINTCOL_TABLE);
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|     // help arrays. assume max index in a table. for sorting purpose
 | |
|     //int dataCount = (*sysDataList.begin())->dataCount();
 | |
| 
 | |
|     vector<TableColName> colNameList;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->ColumnOID() == oid1)
 | |
|         {
 | |
|             for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|             {
 | |
|                 TableColName tableColName;
 | |
|                 tableColName.column = (*it)->GetStringData(i);
 | |
|                 colNameList.push_back(tableColName);
 | |
|             }
 | |
| 
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->ColumnOID() == oid3)
 | |
|         {
 | |
|             for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|             {
 | |
|                 colNameList[i].schema = (*it)->GetStringData(i);
 | |
|             }
 | |
| 
 | |
|             continue;
 | |
|         }
 | |
| 
 | |
|         if ((*it)->ColumnOID() == oid4)
 | |
|         {
 | |
|             for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|             {
 | |
|                 colNameList[i].table = (*it)->GetStringData(i);
 | |
|             }
 | |
| 
 | |
|             continue;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return colNameList;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::ROPair CalpontSystemCatalog::indexRID(const IndexName& indexName)
 | |
| {
 | |
|     DEBUG << "Enter indexRID: " << indexName.schema << "|" << indexName.table << indexName.index << endl;
 | |
|     ROPair rp;
 | |
| 
 | |
|     IndexName aIndexName;
 | |
|     aIndexName.schema = indexName.schema;
 | |
|     aIndexName.table = indexName.table;
 | |
|     aIndexName.index = indexName.index;
 | |
|     boost::algorithm::to_lower(aIndexName.index);
 | |
| 
 | |
|     /* SQL statement: select indexname from sysindex where schema=indexName.schema and indexname=indexName.index;
 | |
|      */
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c5 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + INDEXNAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c5);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + INDEXNAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid5 = DICTOID_SYSINDEX_INDEXNAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aIndexName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c5->clone(),
 | |
|                                          new ConstantColumn(aIndexName.index, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSINDEX_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->dataCount() == 0)
 | |
|             return rp;
 | |
| 
 | |
|         if ((*it)->ColumnOID() == oid5)
 | |
|         {
 | |
|             if (fIdentity == EC)
 | |
|                 rp.rid = (*it)->GetRid(0);
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
|     return rp;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| int CalpontSystemCatalog::colNumbers(const TableName& tableName, int lower_case_table_names)
 | |
| {
 | |
|   DEBUG << "Enter colNumbers: " << tableName.schema << "|" << tableName.table << endl;
 | |
| 
 | |
|   TableInfo ti = tableInfo(tableName, lower_case_table_names);
 | |
| 
 | |
|   return ti.numOfCols;
 | |
| }
 | |
| 
 | |
| #if 0
 | |
| const std::string CalpontSystemCatalog::colValueSysindex (const TableColName& tableColName)
 | |
| {
 | |
|     /* SQL statement: select indexname from sysindex where schema = schema and table=table and column=column;*/
 | |
|     TableColName aTableColName;
 | |
|     aTableColName.schema = tableColName.schema;
 | |
|     aTableColName.table = tableColName.table;
 | |
|     aTableColName.column = tableColName.column;
 | |
|     boost::algorithm::to_lower(aTableColName.column);
 | |
| 
 | |
|     if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter colValueSysindex: " << tableColName.schema << "|"
 | |
|               << tableColName.table << "|"
 | |
|               << tableColName.column << endl;
 | |
| 
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + INDEXNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|     SimpleColumn* c4 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + COLNAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + INDEXNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     srcp.reset(c4);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + COLNAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid = DICTOID_SYSINDEXCOL_INDEXNAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c2->clone(),
 | |
|                                          new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f3 = new SimpleFilter (opeq,
 | |
|                                          c4->clone(),
 | |
|                                          new ConstantColumn(aTableColName.column, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f3);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSINDEXCOL_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->dataCount() == 0)
 | |
|         {
 | |
|             string msg("CalpontSystemCatalog::colValueSysindex: no indexname found for ");
 | |
|             msg += tableColName.schema;
 | |
|             msg += ".";
 | |
|             msg += tableColName.table;
 | |
|             msg += ".";
 | |
|             msg += tableColName.column;
 | |
|             throw runtime_error(msg);
 | |
|         }
 | |
| 
 | |
|         if ((*it)->ColumnOID() == oid)
 | |
|             return (*it)->GetStringData(0);
 | |
|     }
 | |
| 
 | |
|     string msg("CalpontSystemCatalog::colValueSysindex: no indexname found for ");
 | |
|     msg += tableColName.schema;
 | |
|     msg += ".";
 | |
|     msg += tableColName.table;
 | |
|     msg += ".";
 | |
|     msg += tableColName.column;
 | |
|     throw runtime_error(msg);
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::RIDList CalpontSystemCatalog::indexColRID(const IndexName& indexName)
 | |
| {
 | |
|     /* SQL statement: select indexname from sysindexcol where schema=tableColName.schema and
 | |
|      * tablename=tableColName.table and columnname = tableColName.column;
 | |
|      */
 | |
|     IndexName aIndexName;
 | |
|     aIndexName.schema = indexName.schema;
 | |
|     aIndexName.table = indexName.table;
 | |
|     aIndexName.index = indexName.index;
 | |
|     boost::algorithm::to_lower(aIndexName.index);
 | |
| 
 | |
|     if (aIndexName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter indexColRID: " << aIndexName.schema << "|"
 | |
|               << aIndexName.table << "|" << aIndexName.index << endl;
 | |
| 
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + INDEXNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + INDEXNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c2->clone(),
 | |
|                                          new ConstantColumn(aIndexName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aIndexName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f3 = new SimpleFilter (opeq,
 | |
|                                          c1->clone(),
 | |
|                                          new ConstantColumn(aIndexName.index, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f3);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSINDEXCOL_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
|     RIDList ridlist;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         {
 | |
|             ROPair rp;
 | |
| 
 | |
|             if (fIdentity == EC)
 | |
|                 rp.rid = (*it)->GetRid(i);
 | |
| 
 | |
|             ridlist.push_back(rp);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return ridlist;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::ROPair CalpontSystemCatalog::indexColRID(const TableColName& tableColName)
 | |
| {
 | |
|     /* SQL statement: select indexname from sysindexcol where schema=tableColName.schema and
 | |
|      * tablename=tableColName.table and columnname = tableColName.column;
 | |
|      */
 | |
|     TableColName aTableColName;
 | |
|     aTableColName.schema = tableColName.schema;
 | |
|     aTableColName.table = tableColName.table;
 | |
|     aTableColName.column = tableColName.column;
 | |
|     boost::algorithm::to_lower(aTableColName.column);
 | |
| 
 | |
|     if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter indexColRID: " << tableColName.schema << "|"
 | |
|               << tableColName.table << "|" << tableColName.column << endl;
 | |
| 
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + INDEXNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|     SimpleColumn* c4 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + COLNAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + INDEXNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     srcp.reset(c4);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + COLNAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid = DICTOID_SYSINDEXCOL_INDEXNAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c2->clone(),
 | |
|                                          new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f3 = new SimpleFilter (opeq,
 | |
|                                          c4->clone(),
 | |
|                                          new ConstantColumn(aTableColName.column, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f3);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSINDEXCOL_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
|     ROPair rid;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->dataCount() == 0)
 | |
|             return rid;
 | |
| 
 | |
|         if ((*it)->ColumnOID() == oid)
 | |
|         {
 | |
|             if (fIdentity == EC)
 | |
|                 rid.rid = (*it)->GetRid(0);
 | |
| 
 | |
|             return rid;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return rid;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::IndexNameList CalpontSystemCatalog::colValueSysindexCol (const TableColName& tableColName)
 | |
| {
 | |
|     /* SQL statement: select indexname from sysindex where schema = schema and table=table and column=column;*/
 | |
|     TableColName aTableColName;
 | |
|     CalpontSystemCatalog::IndexNameList indexNameList;
 | |
|     aTableColName.schema = tableColName.schema;
 | |
|     aTableColName.table = tableColName.table;
 | |
|     aTableColName.column = tableColName.column;
 | |
|     boost::algorithm::to_lower(aTableColName.column);
 | |
| 
 | |
|     return indexNameList;  //so colxml can run when indexes are not made
 | |
| 
 | |
|     if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter colValueSysindexCol: " << tableColName.schema << "|"
 | |
|               << tableColName.table << "|"
 | |
|               << tableColName.column << endl;
 | |
| 
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + INDEXNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|     SimpleColumn* c4 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + COLNAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + INDEXNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     srcp.reset(c4);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + COLNAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid = DICTOID_SYSINDEXCOL_INDEXNAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c2->clone(),
 | |
|                                          new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f3 = new SimpleFilter (opeq,
 | |
|                                          c4->clone(),
 | |
|                                          new ConstantColumn(aTableColName.column, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f3);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSINDEXCOL_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->ColumnOID() == oid)
 | |
|         {
 | |
|             IndexName indexName;
 | |
|             indexName.schema = aTableColName.schema;
 | |
|             indexName.table = aTableColName.table;
 | |
| 
 | |
|             for ( int i = 0; i < (*it)->dataCount(); i++)
 | |
|             {
 | |
|                 indexName.index = (*it)->GetStringData(i);
 | |
|                 indexNameList.push_back(indexName);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return indexNameList;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::TableName CalpontSystemCatalog::lookupTableForIndex(const std::string indexName, const std::string schema)
 | |
| {
 | |
|     DEBUG << "Enter lookupTableForIndex" << endl;
 | |
|     CalpontSystemCatalog::TableName tablename;
 | |
|     //select tablename from sysindex where indexname = indexName and schema = schema;
 | |
|     std::string aIndexName( indexName );
 | |
|     std::string aSchema ( schema);
 | |
|     boost::algorithm::to_lower(aIndexName);
 | |
|     tablename.schema = aSchema;
 | |
| 
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + INDEXNAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + INDEXNAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c2->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid2 = DICTOID_SYSINDEX_TABLENAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c1->clone(),
 | |
|                                          new ConstantColumn(aSchema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aIndexName, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSINDEX_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->dataCount() == 0)
 | |
|         {
 | |
|             string msg("CalpontSystemCatalog::lookupTableForIndex: no table name found for ");
 | |
|             msg += aIndexName;
 | |
|             throw runtime_error(msg);
 | |
|         }
 | |
| 
 | |
|         if ((*it)->ColumnOID() == oid2)
 | |
|             tablename.table = (*it)->GetStringData(0);
 | |
|     }
 | |
| 
 | |
|     return tablename;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::IndexOID CalpontSystemCatalog::lookupIndexNbr(const IndexName& indexName)
 | |
| {
 | |
|     CalpontSystemCatalog::IndexOID indexoid = {-1, -1};
 | |
|     IndexName aIndexName;
 | |
|     aIndexName.schema = indexName.schema;
 | |
|     aIndexName.table = indexName.table;
 | |
|     aIndexName.index = indexName.index;
 | |
|     boost::algorithm::to_lower(aIndexName.index);
 | |
| 
 | |
|     if (aIndexName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter lookupIndexNbr: " << indexName.schema << "|" << indexName.table
 | |
|               << "|" << indexName.index << endl;
 | |
| 
 | |
|     // return pre-defined indexoid for system catalog index. currently no index
 | |
|     // created for system catalog, return invalid(default) indexoid.
 | |
|     if (aIndexName.schema.compare(CALPONT_SCHEMA) == 0)
 | |
|         return indexoid;
 | |
| 
 | |
|     /* SQL statement: select listobjectoid, treeobjectoid, multicolflag from sysindex where schema=indexName.schema and
 | |
|      * tablename=indexName.table and indexname=indexName.index;
 | |
|      */
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + LISTOBJID_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + TREEOBJID_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c4 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|     SimpleColumn* c5 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + INDEXNAME_COL, fSessionID);
 | |
|     SimpleColumn* c6 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + MULTICOLFLAG_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + LISTOBJID_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + TREEOBJID_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c4);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     srcp.reset(c5);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + INDEXNAME_COL, srcp));
 | |
|     srcp.reset(c6);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + MULTICOLFLAG_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     srcp.reset(c2->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     srcp.reset(c6->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid1 = c1->oid();
 | |
|     OID oid2 = c2->oid();
 | |
|     OID oid3 = c6->oid();
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aIndexName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c4->clone(),
 | |
|                                          new ConstantColumn(aIndexName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
|     SimpleFilter* f3 = new SimpleFilter (opeq,
 | |
|                                          c5->clone(),
 | |
|                                          new ConstantColumn(aIndexName.index, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f3);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSINDEX_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->dataCount() == 0)
 | |
|         {
 | |
|             string msg("CalpontSystemCatalog::lookupIndexNbr: no indexid found for ");
 | |
|             msg += indexName.schema;
 | |
|             msg += ".";
 | |
|             msg += indexName.table;
 | |
|             msg += ".";
 | |
|             msg += indexName.index;
 | |
|             throw runtime_error(msg);
 | |
|         }
 | |
| 
 | |
|         if ((*it)->ColumnOID() == oid1)
 | |
|             indexoid.listOID = (*it)->GetData(0);
 | |
|         else if ((*it)->ColumnOID() == oid2)
 | |
|             indexoid.objnum = (*it)->GetData(0);
 | |
|         else if ((*it)->ColumnOID() == oid3)
 | |
|             indexoid.multiColFlag = ((*it)->GetData(0) == 't' ? true : false);
 | |
|     }
 | |
| 
 | |
|     return indexoid;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::IndexOID CalpontSystemCatalog::lookupIndexNbr(const TableColName& tableColName)
 | |
| {
 | |
|     /*SQL statement: select indexname from sysindexcol where schema=tableColName.schema and
 | |
|      *  tablename=tableColName.table and columnname=tableColName.column;
 | |
|      *  select listobjectoid, treeobjectoid from sysindex where schema=tableColName.schema and
 | |
|      *  table=tableColName.table and indexname=indexname(previous statement);*/
 | |
|     IndexName index;
 | |
|     TableColName aTableColName;
 | |
|     CalpontSystemCatalog::IndexOID indexoid = {-1, -1};
 | |
| 
 | |
|     aTableColName.schema = tableColName.schema;
 | |
|     aTableColName.table = tableColName.table;
 | |
|     aTableColName.column = tableColName.column;
 | |
|     boost::algorithm::to_lower(aTableColName.column);
 | |
| 
 | |
|     if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter lookupIndexNbr: " << tableColName.schema << "|" << tableColName.table
 | |
|               << "|" << tableColName.column << endl;
 | |
| 
 | |
|     index.schema = tableColName.schema;
 | |
|     index.table = tableColName.table;
 | |
| 
 | |
|     // return pre-defined indexoid for system catalog index. currently no index
 | |
|     // created for system catalog, return invalid(default) indexoid.
 | |
|     if (aTableColName.schema.compare(CALPONT_SCHEMA) == 0)
 | |
|         return indexoid;
 | |
| 
 | |
|     // select objectid from syscolumn where schema = tableColName.schema and tablename = tableColName.table and columnname = tableColName.column;
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + INDEXNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|     SimpleColumn* c4 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + COLNAME_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + INDEXNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     srcp.reset(c4);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEXCOL_TABLE + "." + COLNAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid = DICTOID_SYSINDEXCOL_INDEXNAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c2->clone(),
 | |
|                                          new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f3 = new SimpleFilter (opeq,
 | |
|                                          c4->clone(),
 | |
|                                          new ConstantColumn(aTableColName.column, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f3);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSINDEXCOL_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->dataCount() == 0)
 | |
|             return indexoid;
 | |
| 
 | |
|         if ((*it)->ColumnOID() == oid)
 | |
|         {
 | |
|             index.index = ((*it)->GetStringData(0));
 | |
|             return lookupIndexNbr(index);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return indexoid;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::IndexOIDList CalpontSystemCatalog::indexOIDs( const TableName& tableName )
 | |
| {
 | |
|     /*select listobjectoid, treeobjectoid from sysindex where schema=tableName.schema and
 | |
|      * tablename=tableName.table;*/
 | |
|     // not cached yet. can be done in the future
 | |
|     TableColName aTableName;
 | |
|     CalpontSystemCatalog::IndexOID indexoid = {-1, -1};
 | |
|     IndexOIDList indexlist;
 | |
| 
 | |
|     aTableName.schema = tableName.schema;
 | |
|     aTableName.table = tableName.table;
 | |
| 
 | |
|     if (aTableName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter indexOIDs: " << tableName.schema << "|" << tableName.table << endl;
 | |
| 
 | |
|     // return pre-defined indexoid for system catalog index. currently no index
 | |
|     // created for system catalog, return invalid(default) indexoid.
 | |
|     if (aTableName.schema.compare(CALPONT_SCHEMA) == 0)
 | |
|         return indexlist;
 | |
| 
 | |
|     // select objectid from syscolumn where schema = tableColName.schema and tablename = tableColName.table and columnname = tableColName.column;
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + LISTOBJID_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + TREEOBJID_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c4 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|     SimpleColumn* c6 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + MULTICOLFLAG_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + LISTOBJID_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + TREEOBJID_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c4);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     srcp.reset(c6);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSINDEX_TABLE + "." + MULTICOLFLAG_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     srcp.reset(c2->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     srcp.reset(c6->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid1 = c1->oid();
 | |
|     OID oid2 = c2->oid();
 | |
|     OID oid3 = c6->oid();
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c4->clone(),
 | |
|                                          new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSINDEX_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->dataCount() == 0)
 | |
|             return indexlist;
 | |
| 
 | |
|         if ((*it)->ColumnOID() == oid1)
 | |
|         {
 | |
|             for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|             {
 | |
|                 indexoid.listOID = (*it)->GetData(i);
 | |
|                 indexlist.push_back(indexoid);
 | |
|             }
 | |
| 
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->ColumnOID() == oid2)
 | |
|         {
 | |
|             for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|                 indexlist[i].objnum = (*it)->GetData(i);
 | |
|         }
 | |
| 
 | |
|         else if ((*it)->ColumnOID() == oid3)
 | |
|         {
 | |
|             for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|                 indexlist[i].multiColFlag = ((*it)->GetData(i) == 't' ? true : false);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return indexlist;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| const CalpontSystemCatalog::DictOIDList CalpontSystemCatalog::dictOIDs(const TableName& tableName,
 | |
|                                                                        int lower_case_table_names)
 | |
| {
 | |
|   /* SQL statement: select dictobjectid, listobjectid, treeobjectid from syscolumn where
 | |
|    * schema=tableName.schema and table=tableName.table;*/
 | |
|   DictOIDList dictOIDList;
 | |
|   TableColName aTableName;
 | |
|   CalpontSystemCatalog::DictOID dictoid;
 | |
| 
 | |
|   aTableName.schema = tableName.schema;
 | |
|   aTableName.table = tableName.table;
 | |
|   if (lower_case_table_names)
 | |
|   {
 | |
|     boost::algorithm::to_lower(aTableName.schema);
 | |
|     boost::algorithm::to_lower(aTableName.table);
 | |
|   }
 | |
| 
 | |
|   if (aTableName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|     DEBUG << "Enter dictOIDs: " << tableName.schema << "|" << tableName.table << endl;
 | |
| 
 | |
|   // return pre-defined indexoid for system catalog index. currently no index
 | |
|   // created for system catalog, return invalid(default) indexoid.
 | |
|   if (aTableName.schema.compare(CALPONT_SCHEMA) == 0)
 | |
|     return dictOIDList;
 | |
| 
 | |
|   // select objectid from syscolumn where schema = tableColName.schema and tablename = tableColName.table and
 | |
|   // columnname = tableColName.column;
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   SimpleColumn* c1 =
 | |
|       new SimpleColumn(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + LISTOBJID_COL, fSessionID);
 | |
|   SimpleColumn* c2 =
 | |
|       new SimpleColumn(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TREEOBJID_COL, fSessionID);
 | |
|   SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|   SimpleColumn* c4 =
 | |
|       new SimpleColumn(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|   SimpleColumn* c5 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + DICTOID_COL, fSessionID);
 | |
| 
 | |
|   SRCP srcp;
 | |
|   srcp.reset(c1);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + LISTOBJID_COL, srcp));
 | |
|   srcp.reset(c2);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TREEOBJID_COL, srcp));
 | |
|   srcp.reset(c3);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + SCHEMA_COL, srcp));
 | |
|   srcp.reset(c4);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TABLENAME_COL, srcp));
 | |
|   srcp.reset(c5);
 | |
|   colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + DICTOID_COL, srcp));
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   srcp.reset(c1->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   srcp.reset(c2->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   srcp.reset(c5->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   csep.returnedCols(returnedColumnList);
 | |
|   OID oid1 = c1->oid();
 | |
|   OID oid2 = c2->oid();
 | |
|   OID oid3 = c5->oid();
 | |
| 
 | |
|   // Filters
 | |
|   SimpleFilter* f1 =
 | |
|       new SimpleFilter(opeq, c3->clone(), new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f1);
 | |
|   filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|   SimpleFilter* f2 =
 | |
|       new SimpleFilter(opeq, c4->clone(), new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f2);
 | |
|   SOP opisnotnull(new Operator("isnotnull"));
 | |
|   filterTokenList.push_back(new Operator("and"));
 | |
|   SimpleFilter* f3 =
 | |
|       new SimpleFilter(opisnotnull, c5->clone(), new ConstantColumn("", ConstantColumn::NULLDATA));
 | |
|   filterTokenList.push_back(f3);
 | |
|   csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|   NJLSysDataList sysDataList;
 | |
|   getSysData(csep, sysDataList, SYSCOLUMN_TABLE);
 | |
| 
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|   // loop for oid1 first to make sure dictOIDList is populated
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->dataCount() == 0)
 | |
|       return dictOIDList;
 | |
| 
 | |
|     if ((*it)->ColumnOID() == oid1)
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|       {
 | |
|         dictoid.listOID = (*it)->GetData(i);
 | |
|         dictOIDList.push_back(dictoid);
 | |
|       }
 | |
| 
 | |
|       break;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == oid2)
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         dictOIDList[i].treeOID = (*it)->GetData(i);
 | |
|     }
 | |
| 
 | |
|     else if ((*it)->ColumnOID() == oid3)
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         dictOIDList[i].dictOID = (*it)->GetData(i);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return dictOIDList;
 | |
| }
 | |
| #if 0  // Not implemented
 | |
| void CalpontSystemCatalog::storeColOID(void)
 | |
| {
 | |
| }
 | |
| 
 | |
| void CalpontSystemCatalog::storeDictOID(void)
 | |
| {
 | |
| }
 | |
| 
 | |
| void CalpontSystemCatalog::storeIndexOID(void)
 | |
| {
 | |
| }
 | |
| 
 | |
| void CalpontSystemCatalog::updateColInfo(void)
 | |
| {
 | |
| }
 | |
| #endif
 | |
| 
 | |
| int CalpontSystemCatalog::colPosition(const OID& oid)
 | |
| {
 | |
|   DEBUG << "Enter colPosition: " << oid << endl;
 | |
|   ColType col = colType(oid);
 | |
|   return col.colPosition;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::TableInfo CalpontSystemCatalog::tableInfo(const TableName& tb,
 | |
|                                                                       int lower_case_table_names)
 | |
| {
 | |
|   TableName aTableName;
 | |
|   aTableName.schema = tb.schema;
 | |
|   aTableName.table = tb.table;
 | |
|   if (lower_case_table_names)
 | |
|   {
 | |
|     boost::algorithm::to_lower(aTableName.schema);
 | |
|     boost::algorithm::to_lower(aTableName.table);
 | |
|   }
 | |
| 
 | |
|   if (aTableName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|     DEBUG << "Enter tableInfo: " << tb.schema << "|" << tb.table << endl;
 | |
| 
 | |
|   // look up cache first
 | |
|   TableInfo ti;
 | |
|   RIDList ridlist;
 | |
| 
 | |
|   // select count(objectid) from syscolumn where schema=tableName.schema and tablename=tableName.table;
 | |
|   try
 | |
|   {
 | |
|     ridlist = columnRIDs(aTableName);
 | |
|   }
 | |
|   catch (logging::IDBExcept& noTable)
 | |
|   {
 | |
|     throw runtime_error(noTable.what());
 | |
|   }
 | |
| 
 | |
|   if (ridlist.size() == 0)
 | |
|     throw runtime_error("No table info found for" + tb.schema + "." + tb.table);
 | |
| 
 | |
|   if (aTableName.schema.compare(CALPONT_SCHEMA) == 0)
 | |
|   {
 | |
|     ti.numOfCols = ridlist.size();
 | |
|     ti.tablewithautoincr = 0;
 | |
|     return ti;
 | |
|   }
 | |
| 
 | |
|   boost::mutex::scoped_lock lk1(fTableInfoMapLock);
 | |
|   TableInfoMap::const_iterator ti_iter = fTableInfoMap.find(aTableName);
 | |
| 
 | |
|   if (ti_iter != fTableInfoMap.end())
 | |
|   {
 | |
|     return (*ti_iter).second;
 | |
|   }
 | |
|   else
 | |
|     throw runtime_error("No table info found for" + tb.schema + "." + tb.table);
 | |
| }
 | |
| 
 | |
| #if 0
 | |
| const CalpontSystemCatalog::ConstraintInfo CalpontSystemCatalog::constraintInfo (const IndexName& indexName)
 | |
| {
 | |
|     /* SQL statement: select constraintType, constraintText, referencedTableName, referencedSchema, referencedConstraintName from sysconstraint where schema=indexName.schema and tablename=indexName.table and constraintName=indexName.index;*/
 | |
|     ConstraintInfo constraintInfo;
 | |
|     IndexName aIndexName;
 | |
|     aIndexName.schema = indexName.schema;
 | |
|     aIndexName.table = indexName.table;
 | |
|     aIndexName.index = indexName.index;
 | |
|     boost::algorithm::to_lower(aIndexName.index);
 | |
| 
 | |
|     if (aIndexName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter constraintInfo: " << aIndexName.schema << "|" << aIndexName.table << aIndexName.index << endl;
 | |
| 
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|     SimpleColumn* c4 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTTYPE_COL, fSessionID);
 | |
|     SimpleColumn* c5 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTTEXT_COL, fSessionID);
 | |
|     SimpleColumn* c6 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + REFERENCEDSCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c7 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + REFERENCEDTABLENAME_COL, fSessionID);
 | |
|     SimpleColumn* c8 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + REFERENCEDCONSTRAINTNAME_COL, fSessionID);
 | |
|     SimpleColumn* c9 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTSTATUS_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     srcp.reset(c4);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTTYPE_COL, srcp));
 | |
|     srcp.reset(c5);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTTEXT_COL, srcp));
 | |
|     srcp.reset(c6);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + REFERENCEDSCHEMA_COL, srcp));
 | |
|     srcp.reset(c7);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + REFERENCEDTABLENAME_COL, srcp));
 | |
|     srcp.reset(c8);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + REFERENCEDCONSTRAINTNAME_COL, srcp));
 | |
|     srcp.reset(c9);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTSTATUS_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid4 = c4->oid();
 | |
|     OID oid5 = DICTOID_SYSCONSTRAINT_CONSTRAINTTEXT;
 | |
|     OID oid6 = DICTOID_SYSCONSTRAINT_REFERENCEDSCHEMA;
 | |
|     OID oid7 = DICTOID_SYSCONSTRAINT_REFERENCEDTABLENAME;
 | |
|     OID oid8 = DICTOID_SYSCONSTRAINT_REFERENCEDCONSTRAINTNAME;
 | |
|     OID oid9 = DICTOID_SYSCONSTRAINT_CONSTRAINTSTATUS;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c2->clone(),
 | |
|                                          new ConstantColumn(aIndexName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aIndexName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f3 = new SimpleFilter (opeq,
 | |
|                                          c1->clone(),
 | |
|                                          new ConstantColumn(aIndexName.index, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f3);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSCONSTRAINT_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->dataCount() == 0)
 | |
|         {
 | |
|             string msg("CalpontSystemCatalog::constraintInfo: no constraint info found for ");
 | |
|             msg += indexName.schema;
 | |
|             msg += ".";
 | |
|             msg += indexName.table;
 | |
|             msg += ".";
 | |
|             msg += indexName.index;
 | |
|             throw runtime_error(msg);
 | |
|         }
 | |
| 
 | |
|         if ((*it)->ColumnOID() == oid4)
 | |
|         {
 | |
|             if ((*it)->GetData(0) == 'p')
 | |
|                 constraintInfo.constraintType = PRIMARYKEY_CONSTRAINT;
 | |
|             else if ((*it)->GetData(0) == 'f')
 | |
|                 constraintInfo.constraintType = REFERENCE_CONSTRAINT;
 | |
|             else if ((*it)->GetData(0) == 'n')
 | |
|                 constraintInfo.constraintType = NOTNULL_CONSTRAINT;
 | |
|             else if ((*it)->GetData(0) == 'c')
 | |
|                 constraintInfo.constraintType = CHECK_CONSTRAINT;
 | |
|             else if ((*it)->GetData(0) == 'u')
 | |
|                 constraintInfo.constraintType = UNIQUE_CONSTRAINT;
 | |
|             else if ((*it)->GetData(0) == '0')
 | |
|                 constraintInfo.constraintType = DEFAULT_CONSTRAINT;
 | |
|             else    // should never be here
 | |
|                 constraintInfo.constraintType = NO_CONSTRAINT;
 | |
| 
 | |
|             continue;
 | |
|         }
 | |
| 
 | |
|         if ((*it)->ColumnOID() == oid5)
 | |
|         {
 | |
|             constraintInfo.constraintText = (*it)->GetStringData(0);
 | |
|             continue;
 | |
|         }
 | |
| 
 | |
|         if ((*it)->ColumnOID() == oid6)
 | |
|         {
 | |
|             constraintInfo.referenceSchema = (*it)->GetStringData(0);
 | |
|             continue;
 | |
|         }
 | |
| 
 | |
|         if ((*it)->ColumnOID() == oid7)
 | |
|         {
 | |
|             constraintInfo.referenceTable = (*it)->GetStringData(0);
 | |
|             continue;
 | |
|         }
 | |
| 
 | |
|         if ((*it)->ColumnOID() == oid8)
 | |
|         {
 | |
|             constraintInfo.referencePKName = (*it)->GetStringData(0);
 | |
|             continue;
 | |
|         }
 | |
| 
 | |
|         if ((*it)->ColumnOID() == oid9)
 | |
|         {
 | |
|             constraintInfo.constraintStatus = (*it)->GetStringData(0);
 | |
|             continue;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     constraintInfo.constraintName = aIndexName;
 | |
|     return constraintInfo;
 | |
| }
 | |
| 
 | |
| const CalpontSystemCatalog::IndexNameList CalpontSystemCatalog::referenceConstraints( const IndexName& referencePKName)
 | |
| {
 | |
|     /*  SQL statement: select schema, tablename, constraintname from sysconstraint
 | |
|         where referencedTableName = referencePKName.table
 | |
|         and referencedSchema=referencePKName.schema
 | |
|         and referencedConstraintName=referencePKName.index
 | |
|         and constraintType = 'f';*/
 | |
|     IndexName aIndexName;
 | |
|     aIndexName.schema = referencePKName.schema;
 | |
|     aIndexName.table = referencePKName.table;
 | |
|     aIndexName.index = referencePKName.index;
 | |
|     boost::algorithm::to_lower(aIndexName.index);
 | |
| 
 | |
|     if (aIndexName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter referenceConstraints: " << aIndexName.schema << "|" << aIndexName.table << aIndexName.index << endl;
 | |
| 
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|     SimpleColumn* c4 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTTYPE_COL, fSessionID);
 | |
|     SimpleColumn* c6 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + REFERENCEDSCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c7 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + REFERENCEDTABLENAME_COL, fSessionID);
 | |
|     SimpleColumn* c8 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + REFERENCEDCONSTRAINTNAME_COL, fSessionID);
 | |
| 
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     srcp.reset(c4);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTTYPE_COL, srcp));
 | |
|     srcp.reset(c6);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + REFERENCEDSCHEMA_COL, srcp));
 | |
|     srcp.reset(c7);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + REFERENCEDTABLENAME_COL, srcp));
 | |
|     srcp.reset(c8);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + REFERENCEDCONSTRAINTNAME_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid1 = DICTOID_SYSCONSTRAINT_CONSTRAINTNAME;
 | |
|     OID oid2 = DICTOID_SYSCONSTRAINT_SCHEMA;
 | |
|     OID oid3 = DICTOID_SYSCONSTRAINT_TABLENAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c6->clone(),
 | |
|                                          new ConstantColumn(aIndexName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c7->clone(),
 | |
|                                          new ConstantColumn(aIndexName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f3 = new SimpleFilter (opeq,
 | |
|                                          c8->clone(),
 | |
|                                          new ConstantColumn(aIndexName.index, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f3);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f4 = new SimpleFilter(opeq,
 | |
|                                         c4->clone(),
 | |
|                                         new ConstantColumn("f", ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f4);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSCONSTRAINT_TABLE);
 | |
|     //IndexNameList indexNameList;
 | |
|     vector<IndexName> indexNameList;
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->ColumnOID() == oid1)
 | |
|         {
 | |
|             for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|             {
 | |
|                 IndexName indexName;
 | |
|                 indexName.index = (*it)->GetStringData(i);
 | |
|                 indexNameList.push_back(indexName);
 | |
|             }
 | |
| 
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->ColumnOID() == oid2)
 | |
|         {
 | |
|             for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|             {
 | |
|                 indexNameList[i].schema = (*it)->GetStringData(i);
 | |
|             }
 | |
| 
 | |
|             continue;
 | |
|         }
 | |
| 
 | |
|         if ((*it)->ColumnOID() == oid3)
 | |
|         {
 | |
|             for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|             {
 | |
|                 indexNameList[i].table = (*it)->GetStringData(i);
 | |
|             }
 | |
| 
 | |
|             continue;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return indexNameList;
 | |
| }
 | |
| 
 | |
| const string CalpontSystemCatalog::primaryKeyName (const TableName& tableName )
 | |
| {
 | |
|     TableName aTableName;
 | |
|     aTableName.schema = tableName.schema;
 | |
|     aTableName.table = tableName.table;
 | |
| 
 | |
|     if (tableName.schema.compare(CALPONT_SCHEMA) != 0)
 | |
|         DEBUG << "Enter primaryKeyName: " << tableName.schema << "|" << tableName.table << endl;
 | |
| 
 | |
|     string primaryKeyName = "";
 | |
|     CalpontSelectExecutionPlan csep;
 | |
|     CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|     CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|     CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|     SimpleColumn* c1 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTNAME_COL, fSessionID);
 | |
|     SimpleColumn* c2 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + SCHEMA_COL, fSessionID);
 | |
|     SimpleColumn* c3 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + TABLENAME_COL, fSessionID);
 | |
|     SimpleColumn* c4 = new SimpleColumn(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTTYPE_COL, fSessionID);
 | |
| 
 | |
|     SRCP srcp;
 | |
|     srcp.reset(c1);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTNAME_COL, srcp));
 | |
|     srcp.reset(c2);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + SCHEMA_COL, srcp));
 | |
|     srcp.reset(c3);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + TABLENAME_COL, srcp));
 | |
|     srcp.reset(c4);
 | |
|     colMap.insert(CMVT_(CALPONT_SCHEMA + "." + SYSCONSTRAINT_TABLE + "." + CONSTRAINTTYPE_COL, srcp));
 | |
|     csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|     srcp.reset(c1->clone());
 | |
|     returnedColumnList.push_back(srcp);
 | |
|     csep.returnedCols(returnedColumnList);
 | |
|     OID oid1 = DICTOID_SYSCONSTRAINT_CONSTRAINTNAME;
 | |
| 
 | |
|     // Filters
 | |
|     SimpleFilter* f1 = new SimpleFilter (opeq,
 | |
|                                          c2->clone(),
 | |
|                                          new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f1);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f2 = new SimpleFilter (opeq,
 | |
|                                          c3->clone(),
 | |
|                                          new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f2);
 | |
|     filterTokenList.push_back(new Operator("and"));
 | |
| 
 | |
|     SimpleFilter* f3 = new SimpleFilter (opeq,
 | |
|                                          c4->clone(),
 | |
|                                          new ConstantColumn("p", ConstantColumn::LITERAL));
 | |
|     filterTokenList.push_back(f3);
 | |
|     csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|     NJLSysDataList sysDataList;
 | |
|     getSysData (csep, sysDataList, SYSCONSTRAINT_TABLE);
 | |
| 
 | |
|     vector<ColumnResult*>::const_iterator it;
 | |
| 
 | |
|     for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|     {
 | |
|         if ((*it)->ColumnOID() == oid1 && (*it)->dataCount() == 1)
 | |
|         {
 | |
|             primaryKeyName = (*it)->GetStringData(0);
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return primaryKeyName;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| void CalpontSystemCatalog::getSchemaInfo(const string& in_schema, int lower_case_table_names)
 | |
| {
 | |
|   string schema = in_schema;
 | |
|   if (lower_case_table_names)
 | |
|   {
 | |
|     boost::algorithm::to_lower(schema);
 | |
|   }
 | |
|   if (schema == CALPONT_SCHEMA)
 | |
|     return;
 | |
|   else
 | |
|     DEBUG << "Enter getSchemaInfo: " << schema << endl;
 | |
| 
 | |
|   // Check whether cache needs to be flushed
 | |
|   checkSysCatVer();
 | |
| 
 | |
|   boost::mutex::scoped_lock lk(fSchemaCacheLock);
 | |
|   set<string>::iterator setIt = fSchemaCache.find(schema);
 | |
| 
 | |
|   if (setIt != fSchemaCache.end())
 | |
|   {
 | |
|     DEBUG << "getSchemaInfo Cached" << endl;
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   lk.unlock();
 | |
| 
 | |
|   // get table info first
 | |
|   getTables(schema);
 | |
| 
 | |
|   // get column info now
 | |
|   RIDList rl;
 | |
| 
 | |
|   // get real data from system catalog for all user tables under the schema
 | |
|   CalpontSelectExecutionPlan csep;
 | |
|   CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
 | |
|   CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
 | |
|   CalpontSelectExecutionPlan::ColumnMap colMap;
 | |
| 
 | |
|   string columnlength = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLUMNLEN_COL;
 | |
|   string objectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + OBJECTID_COL;
 | |
|   string datatype = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + DATATYPE_COL;
 | |
|   string dictobjectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + DICTOID_COL;
 | |
|   string listobjectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + LISTOBJID_COL;
 | |
|   string treeobjectid = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TREEOBJID_COL;
 | |
|   string columnposition = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLUMNPOS_COL;
 | |
|   string scale = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + SCALE_COL;
 | |
|   string precision = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + PRECISION_COL;
 | |
|   string defaultvalue = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + DEFAULTVAL_COL;
 | |
|   // the following columns will be save in cache although it's not needed for now
 | |
|   string columnname = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COLNAME_COL;
 | |
|   string tablename = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + TABLENAME_COL;
 | |
|   string schemaname = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + SCHEMA_COL;
 | |
|   string nullable = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + NULLABLE_COL;
 | |
|   string compressiontype = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + COMPRESSIONTYPE_COL;
 | |
|   string autoinc = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + AUTOINC_COL;
 | |
|   string nextval = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + NEXTVALUE_COL;
 | |
|   string charsetnum = CALPONT_SCHEMA + "." + SYSCOLUMN_TABLE + "." + CHARSETNUM_COL;
 | |
| 
 | |
|   SimpleColumn* col[18];
 | |
|   col[0] = new SimpleColumn(columnlength, fSessionID);
 | |
|   col[1] = new SimpleColumn(objectid, fSessionID);
 | |
|   col[2] = new SimpleColumn(datatype, fSessionID);
 | |
|   col[3] = new SimpleColumn(dictobjectid, fSessionID);
 | |
|   col[4] = new SimpleColumn(listobjectid, fSessionID);
 | |
|   col[5] = new SimpleColumn(treeobjectid, fSessionID);
 | |
|   col[6] = new SimpleColumn(columnposition, fSessionID);
 | |
|   col[7] = new SimpleColumn(scale, fSessionID);
 | |
|   col[8] = new SimpleColumn(precision, fSessionID);
 | |
|   col[9] = new SimpleColumn(defaultvalue, fSessionID);
 | |
|   col[10] = new SimpleColumn(schemaname, fSessionID);
 | |
|   col[11] = new SimpleColumn(tablename, fSessionID);
 | |
|   col[12] = new SimpleColumn(columnname, fSessionID);
 | |
|   col[13] = new SimpleColumn(nullable, fSessionID);
 | |
|   col[14] = new SimpleColumn(compressiontype, fSessionID);
 | |
|   col[15] = new SimpleColumn(autoinc, fSessionID);
 | |
|   col[16] = new SimpleColumn(nextval, fSessionID);
 | |
|   col[17] = new SimpleColumn(charsetnum, fSessionID);
 | |
| 
 | |
|   SRCP srcp;
 | |
|   srcp.reset(col[0]);
 | |
|   colMap.insert(CMVT_(columnlength, srcp));
 | |
|   srcp.reset(col[1]);
 | |
|   colMap.insert(CMVT_(objectid, srcp));
 | |
|   srcp.reset(col[2]);
 | |
|   colMap.insert(CMVT_(datatype, srcp));
 | |
|   srcp.reset(col[3]);
 | |
|   colMap.insert(CMVT_(dictobjectid, srcp));
 | |
|   srcp.reset(col[4]);
 | |
|   colMap.insert(CMVT_(listobjectid, srcp));
 | |
|   srcp.reset(col[5]);
 | |
|   colMap.insert(CMVT_(treeobjectid, srcp));
 | |
|   srcp.reset(col[6]);
 | |
|   colMap.insert(CMVT_(columnposition, srcp));
 | |
|   srcp.reset(col[7]);
 | |
|   colMap.insert(CMVT_(scale, srcp));
 | |
|   srcp.reset(col[8]);
 | |
|   colMap.insert(CMVT_(precision, srcp));
 | |
|   // TODO: NULL value handling & convert to static_any::any
 | |
|   // delete this manually at fcn exit
 | |
|   srcp.reset(col[9]);
 | |
|   colMap.insert(CMVT_(defaultvalue, srcp));
 | |
|   srcp.reset(col[10]);
 | |
|   colMap.insert(CMVT_(schemaname, srcp));
 | |
|   srcp.reset(col[11]);
 | |
|   colMap.insert(CMVT_(tablename, srcp));
 | |
|   srcp.reset(col[12]);
 | |
|   colMap.insert(CMVT_(columnname, srcp));
 | |
|   srcp.reset(col[13]);
 | |
|   colMap.insert(CMVT_(nullable, srcp));
 | |
|   srcp.reset(col[14]);
 | |
|   colMap.insert(CMVT_(compressiontype, srcp));
 | |
|   srcp.reset(col[15]);
 | |
|   colMap.insert(CMVT_(autoinc, srcp));
 | |
|   srcp.reset(col[16]);
 | |
|   colMap.insert(CMVT_(nextval, srcp));
 | |
|   srcp.reset(col[17]);
 | |
|   colMap.insert(CMVT_(charsetnum, srcp));
 | |
|   csep.columnMapNonStatic(colMap);
 | |
| 
 | |
|   srcp.reset(col[1]->clone());
 | |
|   returnedColumnList.push_back(srcp);
 | |
|   csep.returnedCols(returnedColumnList);
 | |
| 
 | |
|   OID oid[18];
 | |
| 
 | |
|   for (int i = 0; i < 18; i++)
 | |
|     oid[i] = col[i]->oid();
 | |
| 
 | |
|   oid[12] = DICTOID_SYSCOLUMN_COLNAME;
 | |
|   oid[11] = DICTOID_SYSCOLUMN_TABLENAME;
 | |
| 
 | |
|   // Filters
 | |
|   SimpleFilter* f1 =
 | |
|       new SimpleFilter(opeq, col[10]->clone(), new ConstantColumn(schema, ConstantColumn::LITERAL));
 | |
|   filterTokenList.push_back(f1);
 | |
| 
 | |
|   csep.filterTokenList(filterTokenList);
 | |
| 
 | |
|   ostringstream oss;
 | |
|   oss << "select objectid,columnname from syscolumn where schema='" << schema << "' --getSchemaInfo/";
 | |
| 
 | |
|   if (fIdentity == EC)
 | |
|     oss << "EC";
 | |
|   else
 | |
|     oss << "FE";
 | |
| 
 | |
|   csep.data(oss.str());
 | |
|   NJLSysDataList sysDataList;
 | |
|   getSysData(csep, sysDataList, SYSCOLUMN_TABLE);
 | |
| 
 | |
|   vector<ColumnResult*>::const_iterator it;
 | |
|   ColType ct;
 | |
|   // ColType *ctList = NULL;
 | |
|   vector<ColType> ctList;
 | |
|   vector<string> tableNames;
 | |
|   TableInfo ti;
 | |
|   map<string, TableInfo> tbInfo;
 | |
|   map<string, TableInfo>::iterator tbIter;
 | |
| 
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == oid[1])  // objectid
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|       {
 | |
|         ROPair rp;
 | |
|         rp.objnum = (*it)->GetData(i);
 | |
| 
 | |
|         if (fIdentity == EC)
 | |
|           rp.rid = (*it)->GetRid(i);
 | |
| 
 | |
|         // DEBUG << rp.rid << " ";
 | |
|         rl.push_back(rp);
 | |
|         ColType ct;
 | |
|         ct.columnOID = rp.objnum;
 | |
|         ctList.push_back(ct);
 | |
|       }
 | |
| 
 | |
|       DEBUG << endl;
 | |
|     }
 | |
|     // table name
 | |
|     else if ((*it)->ColumnOID() == oid[11])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|       {
 | |
|         tableNames.push_back((*it)->GetStringData(i).safeString(""));
 | |
|         tbIter = tbInfo.find(tableNames[i]);
 | |
| 
 | |
|         if (tbIter == tbInfo.end())
 | |
|         {
 | |
|           tbInfo[tableNames[i]].numOfCols = 1;
 | |
|         }
 | |
|         else
 | |
|           tbInfo[tableNames[i]].numOfCols += 1;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   // loop 3rd time to populate col cache
 | |
|   for (it = sysDataList.begin(); it != sysDataList.end(); it++)
 | |
|   {
 | |
|     if ((*it)->ColumnOID() == oid[15])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|       {
 | |
|         ostringstream os;
 | |
|         os << (char)(*it)->GetData(i);
 | |
|         tbIter = tbInfo.find(tableNames[i]);
 | |
| 
 | |
|         if (tbIter == tbInfo.end())
 | |
|         {
 | |
|           if (os.str().compare("y") == 0)
 | |
|           {
 | |
|             tbInfo[tableNames[i]].tablewithautoincr = AUTOINCRCOL;
 | |
|           }
 | |
|           else
 | |
|           {
 | |
|             tbInfo[tableNames[i]].tablewithautoincr = NO_AUTOINCRCOL;
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|     // column name
 | |
|     else if ((*it)->ColumnOID() == oid[12])
 | |
|     {
 | |
|       // lk2.lock();
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|       {
 | |
|         TableColName tcn = make_tcn(schema, tableNames[i], (*it)->GetStringData(i).safeString(""));
 | |
|         fOIDmap[tcn] = rl[i].objnum;
 | |
| 
 | |
|         if (fIdentity == EC)
 | |
|           fColRIDmap[tcn] = rl[i].rid;
 | |
|       }
 | |
| 
 | |
|       // lk2.unlock();
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[0])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].colWidth = (*it)->GetData(i);
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[2])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].colDataType = (ColDataType)((*it)->GetData(i));
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[3])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].ddn.dictOID = ((*it)->GetData(i));
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[4])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].ddn.listOID = ((*it)->GetData(i));
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[5])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].ddn.treeOID = ((*it)->GetData(i));
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[6])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].colPosition = ((*it)->GetData(i));
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[7])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].scale = ((*it)->GetData(i));
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[8])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].precision = ((*it)->GetData(i));
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_DEFAULTVAL)
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|       {
 | |
|         ctList[i].defaultValue = ((*it)->GetStringData(i));
 | |
| 
 | |
|         if (!ctList[i].defaultValue.isNull())
 | |
|         {
 | |
|           if (ctList[i].constraintType != NOTNULL_CONSTRAINT)
 | |
|             ctList[i].constraintType = DEFAULT_CONSTRAINT;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[13])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         if ((*it)->GetData(i) == 0)
 | |
|           ctList[i].constraintType = NOTNULL_CONSTRAINT;
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[14])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].compressionType = ctList[i].ddn.compressionType = ((*it)->GetData(i));
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[15])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|       {
 | |
|         ostringstream os;
 | |
|         os << (char)(*it)->GetData(i);
 | |
| 
 | |
|         if (os.str().compare("y") == 0)
 | |
|           ctList[i].autoincrement = true;
 | |
|         else
 | |
|           ctList[i].autoincrement = false;
 | |
|       }
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[16])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].nextvalue = ((*it)->GetData(i));
 | |
|     }
 | |
|     else if ((*it)->ColumnOID() == oid[17])
 | |
|     {
 | |
|       for (int i = 0; i < (*it)->dataCount(); i++)
 | |
|         ctList[i].charsetNumber = ((*it)->GetData(i));
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   // populate colinfo cache
 | |
|   // boost::mutex::scoped_lock lk3(fColinfomapLock);
 | |
|   for (uint32_t i = 0; i < ctList.size(); i++)
 | |
|     fColinfomap[ctList[i].columnOID] = ctList[i];
 | |
| 
 | |
|   // lk3.unlock();
 | |
|   // populate tbinfomap
 | |
|   for (tbIter = tbInfo.begin(); tbIter != tbInfo.end(); ++tbIter)
 | |
|   {
 | |
|     TableName tn(schema, tbIter->first);
 | |
|     // ti.numOfCols = (tbIter->second).numOfCols;
 | |
|     // ti.tablewithautoincr = (tbIter->second).withAutoInc;
 | |
|     fTableInfoMap[tn] = tbIter->second;
 | |
|     DEBUG << tbIter->first << " " << tbIter->second.numOfCols << " " << (tbIter->second).tablewithautoincr
 | |
|           << endl;
 | |
|   }
 | |
| 
 | |
|   // delete col[9];
 | |
|   lk.lock();
 | |
|   fSchemaCache.insert(schema);
 | |
|   lk.unlock();
 | |
| }
 | |
| 
 | |
| #if 0
 | |
| ostream& operator<<(ostream& os, const CalpontSystemCatalog::TableName& rhs)
 | |
| {
 | |
|     os << rhs.schema << '.' << rhs.table;
 | |
|     return os;
 | |
| }
 | |
| #endif
 | |
| const string CalpontSystemCatalog::TableName::toString() const
 | |
| {
 | |
|   string str = schema + "." + table;
 | |
|   return str;
 | |
| }
 | |
| ostream& operator<<(ostream& os, const CalpontSystemCatalog::TableAliasName& rhs)
 | |
| {
 | |
|   os << rhs.schema << '.' << rhs.table << "(" << rhs.alias << "/" << rhs.view
 | |
|      << ") engineType=" << (rhs.fisColumnStore ? "ColumnStore" : "ForeignEngine");
 | |
|   return os;
 | |
| }
 | |
| 
 | |
| ostream& operator<<(ostream& os, const CalpontSystemCatalog::TableColName& rhs)
 | |
| {
 | |
|   os << rhs.toString();
 | |
|   return os;
 | |
| }
 | |
| 
 | |
| void CalpontSystemCatalog::flushCache()
 | |
| {
 | |
|   boost::mutex::scoped_lock lk1(fOIDmapLock);
 | |
|   fOIDmap.clear();
 | |
|   buildSysOIDmap();
 | |
|   lk1.unlock();
 | |
| 
 | |
|   boost::mutex::scoped_lock lk2(fColinfomapLock);
 | |
|   fColinfomap.clear();
 | |
|   buildSysColinfomap();
 | |
|   lk2.unlock();
 | |
| 
 | |
|   boost::mutex::scoped_lock lk3(fTableInfoMapLock);
 | |
|   fTableInfoMap.clear();
 | |
|   fTablemap.clear();
 | |
|   fTableRIDmap.clear();
 | |
|   buildSysTablemap();
 | |
|   lk3.unlock();
 | |
| 
 | |
|   boost::mutex::scoped_lock namemaplk(fTableNameMapLock);
 | |
|   fTableNameMap.clear();
 | |
|   namemaplk.unlock();
 | |
| 
 | |
|   boost::mutex::scoped_lock auxlk(fTableAUXColumnOIDMapLock);
 | |
|   fTableAUXColumnOIDMap.clear();
 | |
|   auxlk.unlock();
 | |
| 
 | |
|   boost::mutex::scoped_lock auxtotableoidlk(fAUXColumnOIDToTableOIDMapLock);
 | |
|   fAUXColumnOIDToTableOIDMap.clear();
 | |
|   auxtotableoidlk.unlock();
 | |
| 
 | |
|   boost::recursive_mutex::scoped_lock lk4(fDctTokenMapLock);
 | |
|   fDctTokenMap.clear();
 | |
|   buildSysDctmap();
 | |
|   lk4.unlock();
 | |
| 
 | |
|   fSyscatSCN = fSessionManager->sysCatVerID().currentScn;
 | |
|   // cout << "Cache flushed and current sysCatVerID is " << newScn << endl;
 | |
| }
 | |
| 
 | |
| void CalpontSystemCatalog::updateColinfoCache(CalpontSystemCatalog::OIDNextvalMap& oidNextvalMap)
 | |
| {
 | |
|   boost::mutex::scoped_lock lk(fColinfomapLock);
 | |
|   CalpontSystemCatalog::OIDNextvalMap::const_iterator iter = oidNextvalMap.begin();
 | |
|   OID oid = 0;
 | |
|   long long nextVal = 0;
 | |
| 
 | |
|   while (iter != oidNextvalMap.end())
 | |
|   {
 | |
|     oid = (*iter).first;
 | |
|     nextVal = (*iter).second;
 | |
|     fColinfomap[oid].nextvalue = nextVal;
 | |
|     iter++;
 | |
|   }
 | |
| }
 | |
| void CalpontSystemCatalog::buildSysColinfomap()
 | |
| {
 | |
|   int32_t scale = 0, precision = 10, compressionType = 0, colPosition = 0;
 | |
| 
 | |
|   ResourceManager* rm = ResourceManager::instance();
 | |
| 
 | |
|   if (rm->useHdfs())
 | |
|     compressionType = 2;
 | |
| 
 | |
|   DictOID notDict;
 | |
| 
 | |
|   // @bug 4433 - Increase object width from 64 to 128 for schema names, table names, and column names.
 | |
|   fColinfomap[OID_SYSTABLE_TABLENAME] =
 | |
|       ColType(129, scale, precision, NOTNULL_CONSTRAINT,
 | |
|               DictOID(DICTOID_SYSTABLE_TABLENAME, LISTOID_SYSTABLE_TABLENAME, TREEOID_SYSTABLE_TABLENAME,
 | |
|                       compressionType),
 | |
|               colPosition++, compressionType, OID_SYSTABLE_TABLENAME, VARCHAR);
 | |
| 
 | |
|   fColinfomap[OID_SYSTABLE_SCHEMA] = ColType(
 | |
|       129, scale, precision, NOTNULL_CONSTRAINT,
 | |
|       DictOID(DICTOID_SYSTABLE_SCHEMA, LISTOID_SYSTABLE_SCHEMA, TREEOID_SYSTABLE_SCHEMA, compressionType),
 | |
|       colPosition++, compressionType, OID_SYSTABLE_SCHEMA, VARCHAR);
 | |
| 
 | |
|   fColinfomap[OID_SYSTABLE_OBJECTID] = ColType(4, scale, precision, NOTNULL_CONSTRAINT, notDict,
 | |
|                                                colPosition++, compressionType, OID_SYSTABLE_OBJECTID, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSTABLE_CREATEDATE] =
 | |
|       ColType(4, scale, precision, NOTNULL_CONSTRAINT, notDict, colPosition++, compressionType,
 | |
|               OID_SYSTABLE_CREATEDATE, DATE);
 | |
| 
 | |
|   fColinfomap[OID_SYSTABLE_LASTUPDATE] =
 | |
|       ColType(4, scale, precision, NOTNULL_CONSTRAINT, notDict, colPosition++, compressionType,
 | |
|               OID_SYSTABLE_LASTUPDATE, DATE);
 | |
| 
 | |
|   fColinfomap[OID_SYSTABLE_INIT] = ColType(4, scale, precision, NO_CONSTRAINT, notDict, colPosition++,
 | |
|                                            compressionType, OID_SYSTABLE_INIT, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSTABLE_NEXT] = ColType(4, scale, precision, NO_CONSTRAINT, notDict, colPosition++,
 | |
|                                            compressionType, OID_SYSTABLE_NEXT, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSTABLE_NUMOFROWS] = ColType(4, scale, precision, NO_CONSTRAINT, notDict, colPosition++,
 | |
|                                                 compressionType, OID_SYSTABLE_NUMOFROWS, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSTABLE_AVGROWLEN] = ColType(4, scale, precision, NO_CONSTRAINT, notDict, colPosition++,
 | |
|                                                 compressionType, OID_SYSTABLE_AVGROWLEN, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSTABLE_NUMOFBLOCKS] = ColType(4, scale, precision, NO_CONSTRAINT, notDict, colPosition++,
 | |
|                                                   compressionType, OID_SYSTABLE_NUMOFBLOCKS, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSTABLE_AUTOINCREMENT] =
 | |
|       ColType(4, scale, precision, NO_CONSTRAINT, notDict, colPosition++, compressionType,
 | |
|               OID_SYSTABLE_AUTOINCREMENT, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSTABLE_AUXCOLUMNOID] =
 | |
|       ColType(4, scale, precision, NOTNULL_CONSTRAINT, notDict, colPosition++, compressionType,
 | |
|               OID_SYSTABLE_AUXCOLUMNOID, INT);
 | |
| 
 | |
|   fTablemap[make_table(CALPONT_SCHEMA, SYSCOLUMN_TABLE)] = SYSCOLUMN_BASE;
 | |
| 
 | |
|   colPosition = 0;
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_SCHEMA] = ColType(
 | |
|       129, scale, precision, NOTNULL_CONSTRAINT,
 | |
|       DictOID(DICTOID_SYSCOLUMN_SCHEMA, LISTOID_SYSCOLUMN_SCHEMA, TREEOID_SYSCOLUMN_SCHEMA, compressionType),
 | |
|       colPosition++, compressionType, OID_SYSCOLUMN_SCHEMA, VARCHAR);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_TABLENAME] =
 | |
|       ColType(129, scale, precision, NOTNULL_CONSTRAINT,
 | |
|               DictOID(DICTOID_SYSCOLUMN_TABLENAME, LISTOID_SYSCOLUMN_TABLENAME, TREEOID_SYSCOLUMN_TABLENAME,
 | |
|                       compressionType),
 | |
|               colPosition++, compressionType, OID_SYSCOLUMN_TABLENAME, VARCHAR);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_COLNAME] =
 | |
|       ColType(129, scale, precision, NOTNULL_CONSTRAINT,
 | |
|               DictOID(DICTOID_SYSCOLUMN_COLNAME, LISTOID_SYSCOLUMN_COLNAME, TREEOID_SYSCOLUMN_COLNAME,
 | |
|                       compressionType),
 | |
|               colPosition++, compressionType, OID_SYSCOLUMN_COLNAME, VARCHAR);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_OBJECTID] = ColType(4, scale, precision, NOTNULL_CONSTRAINT, notDict,
 | |
|                                                 colPosition++, compressionType, OID_SYSCOLUMN_OBJECTID, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_DICTOID] = ColType(4, scale, precision, NO_CONSTRAINT, notDict, colPosition++,
 | |
|                                                compressionType, OID_SYSCOLUMN_DICTOID, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_LISTOBJID] = ColType(4, scale, precision, NO_CONSTRAINT, notDict, colPosition++,
 | |
|                                                  compressionType, OID_SYSCOLUMN_LISTOBJID, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_TREEOBJID] = ColType(4, scale, precision, NO_CONSTRAINT, notDict, colPosition++,
 | |
|                                                  compressionType, OID_SYSCOLUMN_TREEOBJID, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_DATATYPE] = ColType(4, scale, precision, NOTNULL_CONSTRAINT, notDict,
 | |
|                                                 colPosition++, compressionType, OID_SYSCOLUMN_DATATYPE, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_COLUMNLEN] =
 | |
|       ColType(4, scale, precision, NOTNULL_CONSTRAINT, notDict, colPosition++, compressionType,
 | |
|               OID_SYSCOLUMN_COLUMNLEN, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_COLUMNPOS] =
 | |
|       ColType(4, scale, precision, NOTNULL_CONSTRAINT, notDict, colPosition++, compressionType,
 | |
|               OID_SYSCOLUMN_COLUMNPOS, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_LASTUPDATE] = ColType(4, scale, precision, NO_CONSTRAINT, notDict, colPosition++,
 | |
|                                                   compressionType, OID_SYSCOLUMN_LASTUPDATE, DATE);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_DEFAULTVAL] =
 | |
|       ColType(64, scale, precision, NO_CONSTRAINT,
 | |
|               DictOID(DICTOID_SYSCOLUMN_DEFAULTVAL, LISTOID_SYSCOLUMN_DEFAULTVAL,
 | |
|                       TREEOID_SYSCOLUMN_DEFAULTVAL, compressionType),
 | |
|               colPosition++, compressionType, OID_SYSCOLUMN_DEFAULTVAL, VARCHAR);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_NULLABLE] = ColType(4, scale, precision, NOTNULL_CONSTRAINT, notDict,
 | |
|                                                 colPosition++, compressionType, OID_SYSCOLUMN_NULLABLE, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_SCALE] = ColType(4, scale, precision, NOTNULL_CONSTRAINT, notDict, colPosition++,
 | |
|                                              compressionType, OID_SYSCOLUMN_SCALE, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_PRECISION] =
 | |
|       ColType(4, scale, precision, NOTNULL_CONSTRAINT, notDict, colPosition++, compressionType,
 | |
|               OID_SYSCOLUMN_PRECISION, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_AUTOINC] = ColType(1, scale, precision, NO_CONSTRAINT, notDict, colPosition++,
 | |
|                                                compressionType, OID_SYSCOLUMN_AUTOINC, CHAR);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_DISTCOUNT] = ColType(4, scale, precision, NO_CONSTRAINT, notDict, colPosition++,
 | |
|                                                  compressionType, OID_SYSCOLUMN_DISTCOUNT, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_NULLCOUNT] = ColType(4, scale, precision, NO_CONSTRAINT, notDict, colPosition++,
 | |
|                                                  compressionType, OID_SYSCOLUMN_NULLCOUNT, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_MINVALUE] =
 | |
|       ColType(65, scale, precision, NO_CONSTRAINT,
 | |
|               DictOID(DICTOID_SYSCOLUMN_MINVALUE, LISTOID_SYSCOLUMN_MINVALUE, TREEOID_SYSCOLUMN_MINVALUE,
 | |
|                       compressionType),
 | |
|               colPosition++, compressionType, OID_SYSCOLUMN_MINVALUE, VARCHAR);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_MAXVALUE] =
 | |
|       ColType(65, scale, precision, NO_CONSTRAINT,
 | |
|               DictOID(DICTOID_SYSCOLUMN_MAXVALUE, LISTOID_SYSCOLUMN_MAXVALUE, TREEOID_SYSCOLUMN_MAXVALUE,
 | |
|                       compressionType),
 | |
|               colPosition++, compressionType, OID_SYSCOLUMN_MAXVALUE, VARCHAR);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_COMPRESSIONTYPE] =
 | |
|       ColType(4, scale, precision, NOTNULL_CONSTRAINT, notDict, colPosition++, compressionType,
 | |
|               OID_SYSCOLUMN_COMPRESSIONTYPE, INT);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_NEXTVALUE] =
 | |
|       ColType(8, scale, precision, NOTNULL_CONSTRAINT, notDict, colPosition++, compressionType,
 | |
|               OID_SYSCOLUMN_NEXTVALUE, UBIGINT);
 | |
| 
 | |
|   fColinfomap[OID_SYSCOLUMN_CHARSETNUM] =
 | |
|       ColType(4, scale, precision, NOTNULL_CONSTRAINT, notDict, colPosition++, compressionType,
 | |
|               OID_SYSCOLUMN_CHARSETNUM, INT);
 | |
| }
 | |
| 
 | |
| void CalpontSystemCatalog::buildSysOIDmap()
 | |
| {
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, TABLENAME_COL)] = OID_SYSTABLE_TABLENAME;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, SCHEMA_COL)] = OID_SYSTABLE_SCHEMA;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, OBJECTID_COL)] = OID_SYSTABLE_OBJECTID;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, CREATEDATE_COL)] = OID_SYSTABLE_CREATEDATE;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, LASTUPDATE_COL)] = OID_SYSTABLE_LASTUPDATE;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, INIT_COL)] = OID_SYSTABLE_INIT;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, NEXT_COL)] = OID_SYSTABLE_NEXT;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, NUMOFROWS_COL)] = OID_SYSTABLE_NUMOFROWS;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, AVGROWLEN_COL)] = OID_SYSTABLE_AVGROWLEN;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, NUMOFBLOCKS_COL)] = OID_SYSTABLE_NUMOFBLOCKS;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, AUTOINC_COL)] = OID_SYSTABLE_AUTOINCREMENT;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, AUXCOLUMNOID_COL)] = OID_SYSTABLE_AUXCOLUMNOID;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, SCHEMA_COL)] = OID_SYSCOLUMN_SCHEMA;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, TABLENAME_COL)] = OID_SYSCOLUMN_TABLENAME;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, COLNAME_COL)] = OID_SYSCOLUMN_COLNAME;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, OBJECTID_COL)] = OID_SYSCOLUMN_OBJECTID;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, DICTOID_COL)] = OID_SYSCOLUMN_DICTOID;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, LISTOBJID_COL)] = OID_SYSCOLUMN_LISTOBJID;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, TREEOBJID_COL)] = OID_SYSCOLUMN_TREEOBJID;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, DATATYPE_COL)] = OID_SYSCOLUMN_DATATYPE;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, COLUMNLEN_COL)] = OID_SYSCOLUMN_COLUMNLEN;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, COLUMNPOS_COL)] = OID_SYSCOLUMN_COLUMNPOS;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, LASTUPDATE_COL)] = OID_SYSCOLUMN_LASTUPDATE;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, DEFAULTVAL_COL)] = OID_SYSCOLUMN_DEFAULTVAL;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, NULLABLE_COL)] = OID_SYSCOLUMN_NULLABLE;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, SCALE_COL)] = OID_SYSCOLUMN_SCALE;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, PRECISION_COL)] = OID_SYSCOLUMN_PRECISION;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, AUTOINC_COL)] = OID_SYSCOLUMN_AUTOINC;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, DISTCOUNT_COL)] = OID_SYSCOLUMN_DISTCOUNT;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, NULLCOUNT_COL)] = OID_SYSCOLUMN_NULLCOUNT;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, MINVALUE_COL)] = OID_SYSCOLUMN_MINVALUE;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, MAXVALUE_COL)] = OID_SYSCOLUMN_MAXVALUE;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, COMPRESSIONTYPE_COL)] = OID_SYSCOLUMN_COMPRESSIONTYPE;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, NEXTVALUE_COL)] = OID_SYSCOLUMN_NEXTVALUE;
 | |
|   fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, CHARSETNUM_COL)] = OID_SYSCOLUMN_CHARSETNUM;
 | |
| }
 | |
| 
 | |
| void CalpontSystemCatalog::buildSysTablemap()
 | |
| {
 | |
|   fTablemap[make_table(CALPONT_SCHEMA, SYSTABLE_TABLE)] = SYSTABLE_BASE;
 | |
|   fTablemap[make_table(CALPONT_SCHEMA, SYSCOLUMN_TABLE)] = SYSCOLUMN_BASE;
 | |
| }
 | |
| 
 | |
| void CalpontSystemCatalog::buildSysDctmap()
 | |
| {
 | |
|   fDctTokenMap[DICTOID_SYSTABLE_TABLENAME] = OID_SYSTABLE_TABLENAME;
 | |
|   fDctTokenMap[DICTOID_SYSTABLE_SCHEMA] = OID_SYSTABLE_SCHEMA;
 | |
| 
 | |
|   fDctTokenMap[DICTOID_SYSCOLUMN_SCHEMA] = OID_SYSCOLUMN_SCHEMA;
 | |
|   fDctTokenMap[DICTOID_SYSCOLUMN_TABLENAME] = OID_SYSCOLUMN_TABLENAME;
 | |
|   fDctTokenMap[DICTOID_SYSCOLUMN_COLNAME] = OID_SYSCOLUMN_COLNAME;
 | |
|   fDctTokenMap[DICTOID_SYSCOLUMN_DEFAULTVAL] = OID_SYSCOLUMN_DEFAULTVAL;
 | |
|   fDctTokenMap[DICTOID_SYSCOLUMN_MINVALUE] = OID_SYSCOLUMN_MINVALUE;
 | |
|   fDctTokenMap[DICTOID_SYSCOLUMN_MAXVALUE] = OID_SYSCOLUMN_MAXVALUE;
 | |
| }
 | |
| 
 | |
| void CalpontSystemCatalog::checkSysCatVer()
 | |
| {
 | |
|   SCN newScn = fSessionManager->sysCatVerID().currentScn;
 | |
| 
 | |
|   if (newScn < 0)
 | |
|   {
 | |
|     fSessionManager.reset(new SessionManager());
 | |
|     newScn = fSessionManager->sysCatVerID().currentScn;
 | |
|   }
 | |
| 
 | |
|   boost::mutex::scoped_lock sysCatLk(fSyscatSCNLock);
 | |
| 
 | |
|   if (fSyscatSCN != newScn)
 | |
|   {
 | |
|     flushCache();
 | |
|   }
 | |
| }
 | |
| 
 | |
| CalpontSystemCatalog::ColType::ColType(const ColType& rhs) : TypeHolderStd(rhs)
 | |
| {
 | |
|   constraintType = rhs.constraintType;
 | |
|   ddn = rhs.ddn;
 | |
|   defaultValue = rhs.defaultValue;
 | |
|   colPosition = rhs.colPosition;
 | |
|   compressionType = rhs.compressionType;
 | |
|   columnOID = rhs.columnOID;
 | |
|   autoincrement = rhs.autoincrement;
 | |
|   nextvalue = rhs.nextvalue;
 | |
|   charsetNumber = rhs.charsetNumber;
 | |
|   cs = rhs.cs;
 | |
| }
 | |
| 
 | |
| CalpontSystemCatalog::ColType::ColType(int32_t colWidth_, int32_t scale_, int32_t precision_,
 | |
|                                        const ConstraintType& constraintType_, const DictOID& ddn_,
 | |
|                                        int32_t colPosition_, int32_t compressionType_, OID columnOID_,
 | |
|                                        const ColDataType& colDataType_)
 | |
|  : constraintType(constraintType_)
 | |
|  , ddn(ddn_)
 | |
|  , colPosition(colPosition_)
 | |
|  , compressionType(compressionType_)
 | |
|  , columnOID(columnOID_)
 | |
| {
 | |
|   colWidth = colWidth_;
 | |
|   scale = scale_;
 | |
|   precision = precision_;
 | |
|   colDataType = colDataType_;
 | |
| }
 | |
| 
 | |
| CalpontSystemCatalog::ColType& CalpontSystemCatalog::ColType::operator=(const ColType& rhs)
 | |
| {
 | |
|   TypeHolderStd::operator=(rhs);
 | |
|   constraintType = rhs.constraintType;
 | |
|   ddn = rhs.ddn;
 | |
|   defaultValue = rhs.defaultValue;
 | |
|   colPosition = rhs.colPosition;
 | |
|   compressionType = rhs.compressionType;
 | |
|   columnOID = rhs.columnOID;
 | |
|   autoincrement = rhs.autoincrement;
 | |
|   nextvalue = rhs.nextvalue;
 | |
|   charsetNumber = rhs.charsetNumber;
 | |
|   cs = rhs.cs;
 | |
| 
 | |
|   return *this;
 | |
| }
 | |
| 
 | |
| CHARSET_INFO* CalpontSystemCatalog::ColType::getCharset() const
 | |
| {
 | |
|   if (!cs)
 | |
|     cs = &datatypes::Charset(charsetNumber).getCharset();
 | |
|   return cs;
 | |
| }
 | |
| 
 | |
| const string CalpontSystemCatalog::ColType::toString() const
 | |
| {
 | |
|   ostringstream output;
 | |
|   output << "cw: " << colWidth << " dt: " << colDataTypeToString(colDataType) << " do: " << ddn.dictOID
 | |
|          << " lo: " << ddn.listOID << " to: " << ddn.treeOID << " cp: " << colPosition << " sc: " << scale
 | |
|          << " pr: " << precision << " od: " << columnOID << " ct: " << compressionType
 | |
|          << " ai: " << autoincrement << " nv: " << nextvalue;
 | |
|   return output.str();
 | |
| }
 | |
| 
 | |
| boost::any CalpontSystemCatalog::ColType::convertColumnData(const std::string& data, bool& pushWarning,
 | |
|                                                             long timeZone, bool nulFlag, bool noRoundup,
 | |
|                                                             bool isUpdate) const
 | |
| {
 | |
|   pushWarning = false;
 | |
|   const datatypes::TypeHandler* h = typeHandler();
 | |
|   if (!h)
 | |
|     throw QueryDataExcept("convertColumnData: unknown column data type.", dataTypeErr);
 | |
| 
 | |
|   if (nulFlag)
 | |
|     return h->getNullValueForType(*this);
 | |
| 
 | |
|   const datatypes::ConvertFromStringParam prm(timeZone, noRoundup, isUpdate);
 | |
|   return h->convertFromString(*this, prm, data, pushWarning);
 | |
| }
 | |
| 
 | |
| boost::any CalpontSystemCatalog::ColType::convertColumnData(const NullString& data, bool& pushWarning,
 | |
|                                                             long timeZone, bool noRoundup,
 | |
|                                                             bool isUpdate) const
 | |
| {
 | |
|   pushWarning = false;
 | |
|   const datatypes::TypeHandler* h = typeHandler();
 | |
|   if (!h)
 | |
|     throw QueryDataExcept("convertColumnData: unknown column data type.", dataTypeErr);
 | |
| 
 | |
|   if (data.isNull())
 | |
|     return h->getNullValueForType(*this);
 | |
| 
 | |
|   const datatypes::ConvertFromStringParam prm(timeZone, noRoundup, isUpdate);
 | |
|   return h->convertFromString(*this, prm, data.unsafeStringRef(), pushWarning);
 | |
| }
 | |
| 
 | |
| CalpontSystemCatalog::ColType CalpontSystemCatalog::ColType::convertUnionColType(
 | |
|     vector<CalpontSystemCatalog::ColType>& types, unsigned int& rc)
 | |
| {
 | |
|   idbassert(types.size());
 | |
|   CalpontSystemCatalog::ColType unionedType = types[0];
 | |
|   for (uint64_t i = 1; i < types.size(); i++)
 | |
|     dataconvert::DataConvert::joinColTypeForUnion(unionedType, types[i], rc);
 | |
|   return unionedType;
 | |
| }
 | |
| 
 | |
| // format a session id that includes the module id
 | |
| // we want the top bit clear to use as a syscat flag, then we want 7 bits of module id, then 24 bits of thread
 | |
| // id
 | |
| /*static*/
 | |
| uint32_t CalpontSystemCatalog::idb_tid2sid(const uint32_t tid)
 | |
| {
 | |
|   // don't care about locking here...
 | |
|   if (fModuleID == numeric_limits<uint32_t>::max())
 | |
|   {
 | |
|     uint32_t tmid = 1;
 | |
|     oam::Oam oam;
 | |
|     oam::oamModuleInfo_t minfo;
 | |
| 
 | |
|     try
 | |
|     {
 | |
|       minfo = oam.getModuleInfo();
 | |
|       tmid = static_cast<uint32_t>(boost::get<2>(minfo));
 | |
| 
 | |
|       if (tmid == 0)
 | |
|         tmid = 1;
 | |
|     }
 | |
|     catch (...)
 | |
|     {
 | |
|       tmid = 1;
 | |
|     }
 | |
| 
 | |
|     fModuleID = tmid;
 | |
|   }
 | |
| 
 | |
|   uint32_t mid = fModuleID;
 | |
|   mid--;  // make module id zero-based
 | |
|   mid &= 0x0000007f;
 | |
|   uint32_t sid = (mid << 24) | (tid & 0x00ffffff);
 | |
|   return sid;
 | |
| }
 | |
| 
 | |
| ostream& operator<<(ostream& output, const CalpontSystemCatalog::ColType& rhs)
 | |
| {
 | |
|   output << rhs.toString();
 | |
|   return output;
 | |
| }
 | |
| 
 | |
| vector<CalpontSystemCatalog::OID> getAllSysCatOIDs()
 | |
| {
 | |
|   vector<CalpontSystemCatalog::OID> ret;
 | |
|   CalpontSystemCatalog::OID oid;
 | |
| 
 | |
|   for (oid = SYSTABLE_BASE + 1; oid < SYSTABLE_MAX; oid++)
 | |
|     ret.push_back(oid);
 | |
| 
 | |
|   for (oid = SYSCOLUMN_BASE + 1; oid < SYSCOLUMN_MAX; oid++)
 | |
|     ret.push_back(oid);
 | |
| 
 | |
|   for (oid = SYSTABLE_DICT_BASE + 1; oid < SYSTABLE_DICT_MAX; oid++)
 | |
|     ret.push_back(oid);
 | |
| 
 | |
|   for (oid = SYSCOLUMN_DICT_BASE + 1; oid < SYSCOLUMN_DICT_MAX; oid++)
 | |
|     ret.push_back(oid);
 | |
| 
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| bool ctListSort(const CalpontSystemCatalog::ColType& a, const CalpontSystemCatalog::ColType& b)
 | |
| {
 | |
|   return a.colPosition < b.colPosition;
 | |
| }
 | |
| 
 | |
| bool operator<(const Partitions& a, const Partitions& b)
 | |
| {
 | |
|   // lexicographic order.
 | |
|   uint32_t l = std::min(a.fPartNames.size(), b.fPartNames.size());
 | |
|   for (uint32_t i = 0; i < l; i++)
 | |
|   {
 | |
|     if (a.fPartNames[i] < b.fPartNames[i])
 | |
|     {
 | |
|       return true;
 | |
|     }
 | |
|     if (a.fPartNames[i] > b.fPartNames[i])
 | |
|     {
 | |
|       return false;
 | |
|     }
 | |
|   }
 | |
|   if (l < a.fPartNames.size())
 | |
|   {
 | |
|     return false;
 | |
|   }
 | |
|   if (l < b.fPartNames.size())
 | |
|   {
 | |
|     return true;
 | |
|   }
 | |
|   return false;
 | |
| }
 | |
| bool operator==(const Partitions& a, const Partitions& b)
 | |
| {
 | |
|   if (a.fPartNames.size() != b.fPartNames.size())
 | |
|   {
 | |
|     return false;
 | |
|   }
 | |
|   uint32_t l = a.fPartNames.size();
 | |
|   for (uint32_t i = 0; i < l; i++)
 | |
|   {
 | |
|     if (a.fPartNames[i] != b.fPartNames[i])
 | |
|     {
 | |
|       return false;
 | |
|     }
 | |
|   }
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| bool operator!=(const Partitions& a, const Partitions& b)
 | |
| {
 | |
|   return !(a == b);
 | |
| }
 | |
| 
 | |
| }  // namespace execplan
 | |
| // vim:sw=4 ts=4:
 |