PageRenderTime 89ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/dbcon/execplan/calpontsystemcatalog.cpp

https://github.com/byte/infinidb
C++ | 5693 lines | 4721 code | 668 blank | 304 comment | 932 complexity | 757b97d2e403fb6473c5e38e4f074531 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause
  1. /* Copyright (C) 2014 InfiniDB, Inc.
  2. This program is free software; you can redistribute it and/or
  3. modify it under the terms of the GNU General Public License
  4. as published by the Free Software Foundation; version 2 of
  5. the License.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  9. GNU General Public License for more details.
  10. You should have received a copy of the GNU General Public License
  11. along with this program; if not, write to the Free Software
  12. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  13. MA 02110-1301, USA. */
  14. /***********************************************************************
  15. * $Id: calpontsystemcatalog.cpp 9594 2013-06-04 18:19:21Z pleblanc $
  16. *
  17. *
  18. ***********************************************************************/
  19. #include <unistd.h>
  20. #include <stdexcept>
  21. #include <string>
  22. #include <iostream>
  23. using namespace std;
  24. #include "messagequeue.h"
  25. #include "calpontsystemcatalog.h"
  26. #include "ddlpkg.h"
  27. #include "expressionparser.h"
  28. #include "calpontselectexecutionplan.h"
  29. #include "calpontselectexecutionplan.h"
  30. #include "clientrotator.h"
  31. #include "simplefilter.h"
  32. #include "simplecolumn.h"
  33. #include "expressionparser.h"
  34. #include "constantcolumn.h"
  35. #include "treenode.h"
  36. #include "operator.h"
  37. #include "sessionmanager.h"
  38. #include "columnresult.h"
  39. #include "joblistfactory.h"
  40. #include "joblist.h"
  41. #include "distributedenginecomm.h"
  42. #include "resourcemanager.h"
  43. using namespace joblist;
  44. #include "bytestream.h"
  45. #include "messagequeue.h"
  46. using namespace messageqcpp;
  47. #include "configcpp.h"
  48. #include "liboamcpp.h"
  49. using namespace config;
  50. #include "exceptclasses.h"
  51. #include "idberrorinfo.h"
  52. #include "errorids.h"
  53. using namespace logging;
  54. #include "rowgroup.h"
  55. using namespace rowgroup;
  56. #include <boost/thread/thread.hpp>
  57. #include <boost/thread/mutex.hpp>
  58. #include <boost/version.hpp>
  59. #ifdef _MSC_VER
  60. #include "idbregistry.h"
  61. #endif
  62. #undef BAIL_IF_0
  63. #if 1
  64. //We are unlikely to ever get anything more out of this connection, so bail out
  65. #define BAIL_IF_0(m) \
  66. if ((m).length() == 0) \
  67. { \
  68. fExeMgr->shutdown(); \
  69. throw runtime_error("CALPONT_INTERNAL_ERROR"); \
  70. }
  71. #else
  72. #define BAIL_IF_0(m)
  73. #endif
  74. #undef CSC_DEBUG
  75. #define CSC_DEBUG 0
  76. #if CSC_DEBUG
  77. namespace {
  78. std::ofstream csclog("/tmp/csc.log", std::ios::app);
  79. }
  80. #define DEBUG csclog
  81. #else
  82. #define DEBUG if (false) cerr
  83. #endif
  84. namespace execplan
  85. {
  86. const SOP opeq(new Operator("="));
  87. const string colDataTypeToString(CalpontSystemCatalog::ColDataType cdt)
  88. {
  89. switch (cdt)
  90. {
  91. case CalpontSystemCatalog::BIT:
  92. return "bit";
  93. break;
  94. case CalpontSystemCatalog::TINYINT:
  95. return "tinyint";
  96. break;
  97. case CalpontSystemCatalog::CHAR:
  98. return "char";
  99. break;
  100. case CalpontSystemCatalog::SMALLINT:
  101. return "smallint";
  102. break;
  103. case CalpontSystemCatalog::DECIMAL:
  104. return "decimal";
  105. break;
  106. case CalpontSystemCatalog::MEDINT:
  107. return "medint";
  108. break;
  109. case CalpontSystemCatalog::INT:
  110. return "int";
  111. break;
  112. case CalpontSystemCatalog::FLOAT:
  113. return "float";
  114. break;
  115. case CalpontSystemCatalog::DATE:
  116. return "date";
  117. break;
  118. case CalpontSystemCatalog::BIGINT:
  119. return "bigint";
  120. break;
  121. case CalpontSystemCatalog::DOUBLE:
  122. return "double";
  123. break;
  124. case CalpontSystemCatalog::DATETIME:
  125. return "datetime";
  126. break;
  127. case CalpontSystemCatalog::VARCHAR:
  128. return "varchar";
  129. break;
  130. case CalpontSystemCatalog::VARBINARY:
  131. return "varbinary";
  132. break;
  133. case CalpontSystemCatalog::CLOB:
  134. return "clob";
  135. break;
  136. case CalpontSystemCatalog::BLOB:
  137. return "blob";
  138. break;
  139. case CalpontSystemCatalog::UTINYINT:
  140. return "utinyint";
  141. break;
  142. case CalpontSystemCatalog::USMALLINT:
  143. return "usmallint";
  144. break;
  145. case CalpontSystemCatalog::UDECIMAL:
  146. return "udecimal";
  147. break;
  148. case CalpontSystemCatalog::UMEDINT:
  149. return "umedint";
  150. break;
  151. case CalpontSystemCatalog::UINT:
  152. return "uint32_t";
  153. break;
  154. case CalpontSystemCatalog::UFLOAT:
  155. return "ufloat";
  156. break;
  157. case CalpontSystemCatalog::UBIGINT:
  158. return "ubigint";
  159. break;
  160. case CalpontSystemCatalog::UDOUBLE:
  161. return "udouble";
  162. break;
  163. default:
  164. break;
  165. }
  166. return "invalid!";
  167. }
  168. }
  169. namespace execplan
  170. {
  171. typedef CalpontSelectExecutionPlan::ColumnMap::value_type CMVT_;
  172. boost::shared_ptr<SessionManager> fSessionManager;
  173. CalpontSystemCatalog::NJLSysDataList::~NJLSysDataList()
  174. {
  175. NJLSysDataVector::iterator it;
  176. for (it = sysDataVec.begin(); it != sysDataVec.end(); it++)
  177. delete *it;
  178. }
  179. const CalpontSystemCatalog::TableColName make_tcn(const string& s, const string& t, const string& c)
  180. {
  181. CalpontSystemCatalog::TableColName tcns;
  182. tcns.schema = s;
  183. tcns.table = t;
  184. tcns.column = c;
  185. transform (tcns.schema.begin(), tcns.schema.end(), tcns.schema.begin(), to_lower());
  186. transform (tcns.table.begin(), tcns.table.end(), tcns.table.begin(), to_lower());
  187. transform (tcns.column.begin(), tcns.column.end(), tcns.column.begin(), to_lower());
  188. return tcns;
  189. }
  190. const CalpontSystemCatalog::TableName make_table(const string& s, const string& t)
  191. {
  192. CalpontSystemCatalog::TableName tn;
  193. tn.schema = s;
  194. tn.table = t;
  195. transform (tn.schema.begin(), tn.schema.end(), tn.schema.begin(), to_lower());
  196. transform (tn.table.begin(), tn.table.end(), tn.table.begin(), to_lower());
  197. return tn;
  198. }
  199. const CalpontSystemCatalog::TableAliasName make_aliastable(const string& s, const string& t, const string& a, const bool isInfiniDB)
  200. {
  201. CalpontSystemCatalog::TableAliasName tn;
  202. tn.schema = s;
  203. tn.table = t;
  204. tn.alias = a;
  205. tn.view = "";
  206. tn.fIsInfiniDB = isInfiniDB;
  207. transform (tn.schema.begin(), tn.schema.end(), tn.schema.begin(), to_lower());
  208. transform (tn.table.begin(), tn.table.end(), tn.table.begin(), to_lower());
  209. transform (tn.alias.begin(), tn.alias.end(), tn.alias.begin(), to_lower());
  210. return tn;
  211. }
  212. const CalpontSystemCatalog::TableAliasName make_aliasview(const string& s, const string& t, const string& a, const string& v, const bool isInfiniDB)
  213. {
  214. CalpontSystemCatalog::TableAliasName tn;
  215. tn.schema = s;
  216. tn.table = t;
  217. tn.alias = a;
  218. tn.view = v;
  219. tn.fIsInfiniDB = isInfiniDB;
  220. transform (tn.schema.begin(), tn.schema.end(), tn.schema.begin(), to_lower());
  221. transform (tn.table.begin(), tn.table.end(), tn.table.begin(), to_lower());
  222. transform (tn.alias.begin(), tn.alias.end(), tn.alias.begin(), to_lower());
  223. transform (tn.view.begin(), tn.view.end(), tn.view.begin(), to_lower());
  224. return tn;
  225. }
  226. bool CalpontSystemCatalog::TableColName::operator<(const TableColName& rhs) const
  227. {
  228. if (schema < rhs.schema)
  229. {
  230. return true;
  231. }
  232. else if (schema == rhs.schema)
  233. {
  234. if (table < rhs.table)
  235. {
  236. return true;
  237. }
  238. else if (table == rhs.table)
  239. {
  240. if (column < rhs.column)
  241. {
  242. return true;
  243. }
  244. }
  245. }
  246. return false;
  247. }
  248. const string CalpontSystemCatalog::TableColName::toString() const
  249. {
  250. string os;
  251. os = schema + '.' + table + '.' + column;
  252. return os;
  253. }
  254. bool CalpontSystemCatalog::TableName::operator<(const TableName& rhs) const
  255. {
  256. if (schema < rhs.schema)
  257. {
  258. return true;
  259. }
  260. else if (schema == rhs.schema)
  261. {
  262. if (table < rhs.table)
  263. {
  264. return true;
  265. }
  266. }
  267. return false;
  268. }
  269. void CalpontSystemCatalog::TableAliasName::clear()
  270. {
  271. schema.clear();
  272. table.clear();
  273. alias.clear();
  274. view.clear();
  275. }
  276. bool CalpontSystemCatalog::TableAliasName::operator<(const TableAliasName& rhs) const
  277. {
  278. if (schema < rhs.schema)
  279. {
  280. return true;
  281. }
  282. else if (schema == rhs.schema)
  283. {
  284. if (table < rhs.table)
  285. {
  286. return true;
  287. }
  288. else if (table == rhs.table)
  289. {
  290. if (alias < rhs.alias)
  291. {
  292. return true;
  293. }
  294. else if (alias == rhs.alias)
  295. {
  296. if (view < rhs.view)
  297. {
  298. return true;
  299. }
  300. else if (view == rhs.view)
  301. {
  302. if (fIsInfiniDB < rhs.fIsInfiniDB)
  303. return true;
  304. }
  305. }
  306. }
  307. }
  308. return false;
  309. }
  310. void CalpontSystemCatalog::TableAliasName::serialize(messageqcpp::ByteStream& b) const
  311. {
  312. b << schema;
  313. b << table;
  314. b << alias;
  315. b << view;
  316. b << static_cast<const ByteStream::doublebyte>(fIsInfiniDB);
  317. }
  318. void CalpontSystemCatalog::TableAliasName::unserialize(messageqcpp::ByteStream& b)
  319. {
  320. b >> schema;
  321. b >> table;
  322. b >> alias;
  323. b >> view;
  324. b >> reinterpret_cast< ByteStream::doublebyte&>(fIsInfiniDB);
  325. }
  326. /*static*/
  327. boost::mutex CalpontSystemCatalog::map_mutex;
  328. /*static*/
  329. CalpontSystemCatalog::CatalogMap CalpontSystemCatalog::fCatalogMap;
  330. /*static*/
  331. uint32_t CalpontSystemCatalog::fModuleID = numeric_limits<uint32_t>::max();
  332. const CalpontSystemCatalog::OID CalpontSystemCatalog::lookupOID(const TableColName& tableColName)
  333. {
  334. if (tableColName.schema.length() == 0 || tableColName.table.length() == 0 || tableColName.column.length() == 0)
  335. return -1;
  336. TableColName aTableColName;
  337. aTableColName.schema = tableColName.schema;
  338. aTableColName.table = tableColName.table;
  339. aTableColName.column = tableColName.column;
  340. transform( aTableColName.schema.begin(), aTableColName.schema.end(), aTableColName.schema.begin(), to_lower() );
  341. transform( aTableColName.table.begin(), aTableColName.table.end(), aTableColName.table.begin(), to_lower() );
  342. transform( aTableColName.column.begin(), aTableColName.column.end(), aTableColName.column.begin(), to_lower() );
  343. if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
  344. DEBUG << "Enter lookupOID: " << tableColName.schema << "|" << tableColName.table
  345. << "|" << tableColName.column << endl;
  346. //Check whether cache needs to be flushed
  347. if ( aTableColName.schema.compare(CALPONT_SCHEMA) != 0) {
  348. checkSysCatVer();
  349. }
  350. boost::mutex::scoped_lock lk2(fOIDmapLock);
  351. if ( fOIDmap.size() > 0 )
  352. {
  353. OIDmap::const_iterator iter = fOIDmap.find(aTableColName);
  354. // @bug 1358. double check fColRIDMap in case it's not filled with valid rid.
  355. if (iter != fOIDmap.end())
  356. {
  357. if (fIdentity == EC && aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
  358. {
  359. ColRIDmap::const_iterator iter1 = fColRIDmap.find(aTableColName);
  360. if ( iter1 != fColRIDmap.end() ) {
  361. return iter->second;
  362. }
  363. }
  364. else {
  365. return iter->second;
  366. }
  367. }
  368. }
  369. lk2.unlock();
  370. // select objectid,columnlength,datatype,dictobjectid,listobjectid,treeobjectid,columnposition,scale,prec,
  371. // defaultvalue from syscolumn where schema=schema and tablename=table and columnname=column;
  372. CalpontSelectExecutionPlan csep;
  373. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  374. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  375. CalpontSelectExecutionPlan::ColumnMap colMap;
  376. string columnlength = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COLUMNLEN_COL;
  377. string objectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+OBJECTID_COL;
  378. string datatype = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+DATATYPE_COL;
  379. string dictobjectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+DICTOID_COL;
  380. string listobjectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+LISTOBJID_COL;
  381. string treeobjectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TREEOBJID_COL;
  382. string columnposition = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COLUMNPOS_COL;
  383. string scale = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+SCALE_COL;
  384. string precision = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+PRECISION_COL;
  385. string defaultvalue = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+DEFAULTVAL_COL;
  386. // the following columns will be save in cache although it's not needed for now
  387. string columnname = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COLNAME_COL;
  388. string tablename = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TABLENAME_COL;
  389. string schemaname = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+SCHEMA_COL;
  390. string compressiontype = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COMPRESSIONTYPE_COL;
  391. string autoincrement = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+AUTOINC_COL;
  392. string nextVal = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+NEXTVALUE_COL;
  393. string nullable = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+NULLABLE_COL;
  394. SimpleColumn* col[17];
  395. col[0] = new SimpleColumn(columnlength, fSessionID);
  396. col[1] = new SimpleColumn(objectid, fSessionID);
  397. col[2] = new SimpleColumn(datatype, fSessionID);
  398. col[3] = new SimpleColumn(dictobjectid, fSessionID);
  399. col[4] = new SimpleColumn(listobjectid, fSessionID);
  400. col[5] = new SimpleColumn(treeobjectid, fSessionID);
  401. col[6] = new SimpleColumn(columnposition, fSessionID);
  402. col[7] = new SimpleColumn(scale, fSessionID);
  403. col[8] = new SimpleColumn(precision, fSessionID);
  404. col[9] = new SimpleColumn(defaultvalue, fSessionID);
  405. col[10] = new SimpleColumn(schemaname, fSessionID);
  406. col[11] = new SimpleColumn(tablename, fSessionID);
  407. col[12] = new SimpleColumn(columnname, fSessionID);
  408. col[13] = new SimpleColumn(compressiontype, fSessionID);
  409. col[14] = new SimpleColumn(autoincrement, fSessionID);
  410. col[15] = new SimpleColumn(nextVal, fSessionID);
  411. col[16] = new SimpleColumn(nullable, fSessionID);
  412. SRCP srcp;
  413. srcp.reset(col[0]);
  414. colMap.insert(CMVT_(columnlength, srcp));
  415. srcp.reset(col[1]);
  416. colMap.insert(CMVT_(objectid, srcp));
  417. srcp.reset(col[2]);
  418. colMap.insert(CMVT_(datatype, srcp));
  419. srcp.reset(col[3]);
  420. colMap.insert(CMVT_(dictobjectid, srcp));
  421. srcp.reset(col[4]);
  422. colMap.insert(CMVT_(listobjectid, srcp));
  423. srcp.reset(col[5]);
  424. colMap.insert(CMVT_(treeobjectid, srcp));
  425. srcp.reset(col[6]);
  426. colMap.insert(CMVT_(columnposition, srcp));
  427. srcp.reset(col[7]);
  428. colMap.insert(CMVT_(scale, srcp));
  429. srcp.reset(col[8]);
  430. colMap.insert(CMVT_(precision, srcp));
  431. // TODO: NULL value handling
  432. srcp.reset(col[9]);
  433. colMap.insert(CMVT_(defaultvalue, srcp));
  434. srcp.reset(col[10]);
  435. colMap.insert(CMVT_(schemaname, srcp));
  436. srcp.reset(col[11]);
  437. colMap.insert(CMVT_(tablename, srcp));
  438. srcp.reset(col[12]);
  439. colMap.insert(CMVT_(columnname, srcp));
  440. srcp.reset(col[13]);
  441. colMap.insert(CMVT_(compressiontype, srcp));
  442. srcp.reset(col[14]);
  443. colMap.insert(CMVT_(autoincrement, srcp));
  444. srcp.reset(col[15]);
  445. colMap.insert(CMVT_(nextVal, srcp));
  446. srcp.reset(col[16]);
  447. colMap.insert(CMVT_(nullable, srcp));
  448. csep.columnMapNonStatic(colMap);
  449. // ignore returnedcolumn, because it's not read by Joblist for now
  450. csep.returnedCols(returnedColumnList);
  451. OID oid[17];
  452. for (int i = 0; i < 17; i++)
  453. oid[i] = col[i]->oid();
  454. // Filters
  455. SimpleFilter *f1 = new SimpleFilter (opeq,
  456. col[10]->clone(),
  457. new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
  458. filterTokenList.push_back(f1);
  459. filterTokenList.push_back(new Operator("and"));
  460. SimpleFilter *f2 = new SimpleFilter (opeq,
  461. col[11]->clone(),
  462. new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
  463. filterTokenList.push_back(f2);
  464. filterTokenList.push_back(new Operator("and"));
  465. SimpleFilter *f3 = new SimpleFilter (opeq,
  466. col[12]->clone(),
  467. new ConstantColumn(aTableColName.column, ConstantColumn::LITERAL));
  468. filterTokenList.push_back(f3);
  469. csep.filterTokenList(filterTokenList);
  470. ostringstream oss;
  471. oss << "select objectid,columnlength,datatype,dictobjectid,listobjectid,treeobjectid,columnposition,scale,"
  472. "prec,defaultvalue from syscolumn where schema='" << aTableColName.schema << "' and tablename='" <<
  473. aTableColName.table << "' and columnname='" << aTableColName.column << "' --lookupOID/";
  474. if (fIdentity == EC) oss << "EC";
  475. else oss << "FE";
  476. csep.data(oss.str());
  477. NJLSysDataList sysDataList;
  478. TableColName tcn;
  479. ColType ct;
  480. OID coloid = -1;
  481. getSysData (csep, sysDataList, SYSCOLUMN_TABLE);
  482. vector<ColumnResult*>::const_iterator it;
  483. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  484. {
  485. if ((*it)->ColumnOID() == oid[1])
  486. {
  487. // populate cache
  488. coloid = (OID)((*it)->GetData(0));
  489. lk2.lock();
  490. fOIDmap[aTableColName] = coloid;
  491. if (fIdentity == EC)
  492. fColRIDmap[aTableColName] = (*it)->GetRid(0);
  493. // @bug 1358. do not insert this entry to map
  494. //else
  495. // fColRIDmap[aTableColName] = 0;
  496. lk2.unlock();
  497. }
  498. if ((*it)->ColumnOID() == oid[0])
  499. ct.colWidth = ((*it)->GetData(0));
  500. else if ((*it)->ColumnOID() == oid[2])
  501. ct.colDataType = (ColDataType)((*it)->GetData(0));
  502. else if ((*it)->ColumnOID() == oid[3])
  503. ct.ddn.dictOID = ((*it)->GetData(0));
  504. else if ((*it)->ColumnOID() == oid[4])
  505. ct.ddn.listOID = ((*it)->GetData(0));
  506. else if ((*it)->ColumnOID() == oid[5])
  507. ct.ddn.treeOID = ((*it)->GetData(0));
  508. else if ((*it)->ColumnOID() == oid[6])
  509. ct.colPosition = ((*it)->GetData(0));
  510. else if ((*it)->ColumnOID() == oid[7])
  511. ct.scale = ((*it)->GetData(0));
  512. else if ((*it)->ColumnOID() == oid[8])
  513. ct.precision = ((*it)->GetData(0));
  514. else if ((*it)->ColumnOID() == oid[13])
  515. ct.compressionType = ct.ddn.compressionType = ((*it)->GetData(0));
  516. else if ((*it)->ColumnOID() == oid[14])
  517. {
  518. ostringstream os;
  519. os << (char) (*it)->GetData(0);
  520. if (os.str().compare("y") == 0)
  521. ct.autoincrement = true;
  522. else
  523. ct.autoincrement = false;
  524. }
  525. else if ((*it)->ColumnOID() == oid[15])
  526. ct.nextvalue = ((*it)->GetData(0));
  527. else if ((*it)->ColumnOID() == oid[16])
  528. {
  529. if (static_cast<ConstraintType> ((*it)->GetData(0)) == 0)
  530. {
  531. ct.constraintType = NOTNULL_CONSTRAINT;
  532. }
  533. }
  534. else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_DEFAULTVAL)
  535. {
  536. ct.defaultValue = ((*it)->GetStringData(0));
  537. if ((!ct.defaultValue.empty()) || (ct.defaultValue.length() > 0))
  538. {
  539. if (ct.constraintType != NOTNULL_CONSTRAINT)
  540. ct.constraintType = DEFAULT_CONSTRAINT;
  541. }
  542. }
  543. else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_SCHEMA)
  544. tcn.schema = ((*it)->GetStringData(0));
  545. else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_TABLENAME)
  546. tcn.table = ((*it)->GetStringData(0));
  547. else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_COLNAME)
  548. tcn.column = ((*it)->GetStringData(0));
  549. }
  550. // temporialy memory leak fix until defaultvalue is added.
  551. // delete col[9];
  552. ct.columnOID = coloid;
  553. // populate colinfomap cache and oidbitmap
  554. boost::mutex::scoped_lock lk3(fColinfomapLock);
  555. fColinfomap[coloid] = ct;
  556. return coloid;
  557. }
  558. void CalpontSystemCatalog::getSysData (CalpontSelectExecutionPlan& csep,
  559. NJLSysDataList& sysDataList,
  560. const string& sysTableName)
  561. {
  562. // start up new transaction
  563. BRM::TxnID txnID;
  564. int oldTxnID;
  565. txnID = fSessionManager->getTxnID(fSessionID);
  566. if (!txnID.valid)
  567. {
  568. txnID.id = 0;
  569. txnID.valid = true;
  570. }
  571. BRM::QueryContext verID, oldVerID;
  572. verID = fSessionManager->verID();
  573. oldTxnID = csep.txnID();
  574. csep.txnID(txnID.id);
  575. oldVerID = csep.verID();
  576. csep.verID(verID);
  577. //We need to use a session ID that's separate from the actual query SID, because the dbcon runs queries
  578. // in the middle of receiving data bands for the real query.
  579. //TODO: we really need a flag or something to identify this as a syscat query: there are assumptions made
  580. // in joblist that a high-bit-set session id is always a syscat query. This will be okay for a long time,
  581. // but not forever...
  582. csep.sessionID(fSessionID | 0x80000000);
  583. int tryCnt = 0;
  584. // add the tableList to csep for tuple joblist to use
  585. CalpontSelectExecutionPlan::TableList tablelist;
  586. tablelist.push_back(make_aliastable("calpontsys", sysTableName, ""));
  587. csep.tableList(tablelist);
  588. // populate the returned column list as column map
  589. csep.returnedCols().clear();
  590. CalpontSelectExecutionPlan::ColumnMap::const_iterator it;
  591. for (it = csep.columnMap().begin(); it != csep.columnMap().end(); ++it)
  592. {
  593. csep.returnedCols().push_back(it->second);
  594. }
  595. if (fIdentity == EC)
  596. {
  597. try {
  598. getSysData_EC(csep, sysDataList, sysTableName);
  599. }
  600. catch ( IDBExcept& ){
  601. throw;
  602. }
  603. catch ( runtime_error& e ) {
  604. throw runtime_error ( e.what() );
  605. }
  606. }
  607. else
  608. {
  609. while (tryCnt < 5)
  610. {
  611. tryCnt++;
  612. try {
  613. getSysData_FE(csep, sysDataList, sysTableName);
  614. break;
  615. }
  616. catch(IDBExcept&) // error already occured. this is not a broken pipe
  617. {
  618. throw;
  619. }
  620. catch(...)
  621. {
  622. // may be a broken pipe. re-establish exeMgr and send the message
  623. delete fExeMgr;
  624. fExeMgr = new ClientRotator(0, "ExeMgr");
  625. try {
  626. fExeMgr->connect(5);
  627. } catch (...) {
  628. throw IDBExcept(ERR_LOST_CONN_EXEMGR);
  629. }
  630. }
  631. }
  632. if (tryCnt >= 5)
  633. //throw runtime_error("Error occured when calling system catalog. ExeMgr is not functioning.");
  634. throw IDBExcept(ERR_SYSTEM_CATALOG);
  635. }
  636. csep.sessionID(fSessionID);
  637. csep.txnID(oldTxnID);
  638. csep.verID(oldVerID);
  639. }
  640. void CalpontSystemCatalog::getSysData_EC(CalpontSelectExecutionPlan& csep,
  641. NJLSysDataList& sysDataList,
  642. const string& sysTableName)
  643. {
  644. DEBUG << "Enter getSysData_EC " << fSessionID << endl;
  645. uint32_t tableOID = IDB_VTABLE_ID;
  646. ByteStream bs;
  647. uint32_t status;
  648. ResourceManager rm(true);
  649. DistributedEngineComm* fEc = DistributedEngineComm::instance(rm);
  650. SJLP jl = JobListFactory::makeJobList(&csep, rm, true);
  651. //@bug 2221. Work around to prevent DMLProc crash.
  652. int retryNum = 0;
  653. while ( jl->status() != 0 )
  654. {
  655. if ( retryNum >= 6 )
  656. throw runtime_error("Error occured when calling makeJobList");
  657. #ifdef _MSC_VER
  658. Sleep(1 * 1000);
  659. #else
  660. sleep(1);
  661. #endif
  662. jl = JobListFactory::makeJobList(&csep, rm, true);
  663. retryNum++;
  664. }
  665. if (jl->status() != 0 || jl->putEngineComm(fEc) != 0)
  666. {
  667. string emsg = jl->errMsg();
  668. throw runtime_error("Error occured when calling system catalog (1). " + emsg);
  669. }
  670. if ( jl->doQuery() != 0)
  671. {
  672. throw runtime_error("Error occured when calling system catalog (2). Make sure all processes are running.");
  673. }
  674. TupleJobList* tjlp = dynamic_cast<TupleJobList*>(jl.get());
  675. idbassert(tjlp);
  676. RowGroup rowGroup = tjlp->getOutputRowGroup();
  677. RGData rgData;
  678. while (true)
  679. {
  680. bs.restart();
  681. uint32_t rowCount = jl->projectTable(tableOID, bs);
  682. // XXXST: take out the 'true' when all jobsteps have been made st-compatible.
  683. rgData.deserialize(bs, true);
  684. rowGroup.setData(&rgData);
  685. //rowGroup.setData(const_cast<uint8_t*>(bs.buf()));
  686. if ((status = rowGroup.getStatus()) != 0)
  687. {
  688. if (status >= 1000) // new error system
  689. throw IDBExcept(status);
  690. else
  691. throw IDBExcept(ERR_SYSTEM_CATALOG);
  692. }
  693. if (rowCount > 0)
  694. rowGroup.addToSysDataList(sysDataList);
  695. else
  696. break;
  697. }
  698. }
  699. void CalpontSystemCatalog::getSysData_FE(const CalpontSelectExecutionPlan& csep,
  700. NJLSysDataList& sysDataList,
  701. const string& sysTableName)
  702. {
  703. DEBUG << "Enter getSysData_FE " << fSessionID << endl;
  704. ByteStream msg;
  705. // send code to indicat tuple
  706. ByteStream::quadbyte qb = 4;
  707. msg << qb;
  708. fExeMgr->write(msg);
  709. msg.restart();
  710. // Send the CalpontSelectExecutionPlan to ExeMgr.
  711. csep.serialize(msg);
  712. fExeMgr->write(msg);
  713. // Get the table oid for the system table being queried.
  714. TableName tableName;
  715. tableName.schema = CALPONT_SCHEMA;
  716. tableName.table = sysTableName;
  717. uint32_t tableOID = IDB_VTABLE_ID;
  718. uint16_t status = 0;
  719. // Send the request for the table.
  720. qb = static_cast<ByteStream::quadbyte>(tableOID);
  721. ByteStream bs;
  722. bs << qb;
  723. fExeMgr->write(bs);
  724. boost::scoped_ptr<rowgroup::RowGroup> rowGroup;
  725. RGData rgData;
  726. msg.restart();
  727. bs.restart();
  728. msg = fExeMgr->read();
  729. bs = fExeMgr->read();
  730. if (bs.length() == 0)
  731. {
  732. throw IDBExcept(ERR_LOST_CONN_EXEMGR);
  733. }
  734. string emsgStr;
  735. bs >> emsgStr;
  736. bool err = false;
  737. if (msg.length() == 4)
  738. {
  739. msg >> qb;
  740. if (qb != 0)
  741. err = true;
  742. }
  743. else
  744. {
  745. err = true;
  746. }
  747. if (err)
  748. {
  749. throw runtime_error(emsgStr);
  750. }
  751. while(true)
  752. {
  753. bs.restart();
  754. bs = fExeMgr->read();
  755. // @bug 1782. check ExeMgr connection lost
  756. if (bs.length() == 0)
  757. throw IDBExcept(ERR_LOST_CONN_EXEMGR);
  758. if (!rowGroup)
  759. {
  760. rowGroup.reset(new RowGroup());
  761. rowGroup->deserialize(bs);
  762. continue;
  763. }
  764. else
  765. {
  766. // XXXST
  767. rgData.deserialize(bs, true);
  768. rowGroup->setData(&rgData);
  769. //rowGroup->setData(const_cast<uint8_t*>(bs.buf()));
  770. }
  771. if ((status = rowGroup->getStatus()) != 0)
  772. {
  773. if (status >= 1000) // new error system
  774. {
  775. //bs.advance(rowGroup->getDataSize());
  776. bs >> emsgStr;
  777. throw IDBExcept(emsgStr, rowGroup->getStatus()); }
  778. else
  779. {
  780. throw IDBExcept(ERR_SYSTEM_CATALOG);
  781. }
  782. }
  783. if (rowGroup->getRowCount() > 0)
  784. rowGroup->addToSysDataList(sysDataList);
  785. else
  786. break;
  787. }
  788. bs.reset();
  789. qb = 0;
  790. bs << qb;
  791. fExeMgr->write(bs);
  792. }
  793. const CalpontSystemCatalog::ColType CalpontSystemCatalog::colType(const OID& Oid)
  794. {
  795. if ( Oid >= 3000)
  796. DEBUG << "Enter colType: " << Oid << endl;
  797. ColType ct;
  798. // invalid oid
  799. if (Oid < 1000)
  800. return ct;
  801. //Check whether cache needs to be flushed
  802. if ( Oid >= 3000) {
  803. checkSysCatVer();
  804. }
  805. // check colinfomap first for system table column or cached column type
  806. boost::mutex::scoped_lock lk3(fColinfomapLock);
  807. if ( fColinfomap.size() > 0 )
  808. {
  809. Colinfomap::const_iterator iter = fColinfomap.find(Oid);
  810. if (iter != fColinfomap.end())
  811. {
  812. return iter->second;
  813. }
  814. }
  815. lk3.unlock();
  816. /* SQL statement: select columnlength, datatype, dictobjectid,listobjectid,treeobjectid,
  817. * columnposition, scale, prec, defaultvalue, schema, tablename, columnname
  818. * from syscolumn where objectid = Oid;
  819. */
  820. CalpontSelectExecutionPlan csep;
  821. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  822. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  823. CalpontSelectExecutionPlan::ColumnMap colMap;
  824. string columnlength = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COLUMNLEN_COL;
  825. string objectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+OBJECTID_COL;
  826. string datatype = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+DATATYPE_COL;
  827. string dictobjectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+DICTOID_COL;
  828. string listobjectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+LISTOBJID_COL;
  829. string treeobjectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TREEOBJID_COL;
  830. string columnposition = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COLUMNPOS_COL;
  831. string scale = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+SCALE_COL;
  832. string precision = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+PRECISION_COL;
  833. string defaultvalue = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+DEFAULTVAL_COL;
  834. // the following columns will be save in cache although it's not needed for now
  835. string columnname = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COLNAME_COL;
  836. string tablename = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TABLENAME_COL;
  837. string schemaname = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+SCHEMA_COL;
  838. string nullable = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+NULLABLE_COL;
  839. string compressionType = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COMPRESSIONTYPE_COL;
  840. string autoincrement = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+AUTOINC_COL;
  841. string nextvalue = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+NEXTVALUE_COL;
  842. SimpleColumn* col[17];
  843. col[0] = new SimpleColumn(columnlength, fSessionID);
  844. col[1] = new SimpleColumn(objectid, fSessionID);
  845. col[2] = new SimpleColumn(datatype, fSessionID);
  846. col[3] = new SimpleColumn(dictobjectid, fSessionID);
  847. col[4] = new SimpleColumn(listobjectid, fSessionID);
  848. col[5] = new SimpleColumn(treeobjectid, fSessionID);
  849. col[6] = new SimpleColumn(columnposition, fSessionID);
  850. col[7] = new SimpleColumn(scale, fSessionID);
  851. col[8] = new SimpleColumn(precision, fSessionID);
  852. col[9] = new SimpleColumn(defaultvalue, fSessionID);
  853. col[10] = new SimpleColumn(schemaname, fSessionID);
  854. col[11] = new SimpleColumn(tablename, fSessionID);
  855. col[12] = new SimpleColumn(columnname, fSessionID);
  856. col[13] = new SimpleColumn(nullable, fSessionID);
  857. col[14] = new SimpleColumn(compressionType, fSessionID);
  858. col[15] = new SimpleColumn(autoincrement, fSessionID);
  859. col[16] = new SimpleColumn(nextvalue, fSessionID);
  860. SRCP srcp;
  861. srcp.reset(col[0]);
  862. colMap.insert(CMVT_(columnlength, srcp));
  863. srcp.reset(col[1]);
  864. colMap.insert(CMVT_(objectid, srcp));
  865. srcp.reset(col[2]);
  866. colMap.insert(CMVT_(datatype, srcp));
  867. srcp.reset(col[3]);
  868. colMap.insert(CMVT_(dictobjectid, srcp));
  869. srcp.reset(col[4]);
  870. colMap.insert(CMVT_(listobjectid, srcp));
  871. srcp.reset(col[5]);
  872. colMap.insert(CMVT_(treeobjectid, srcp));
  873. srcp.reset(col[6]);
  874. colMap.insert(CMVT_(columnposition, srcp));
  875. srcp.reset(col[7]);
  876. colMap.insert(CMVT_(scale, srcp));
  877. srcp.reset(col[8]);
  878. colMap.insert(CMVT_(precision, srcp));
  879. // TODO: NULL value handling & convert to boost::any
  880. // delete this manually at fcn exit
  881. srcp.reset(col[9]);
  882. colMap.insert(CMVT_(defaultvalue, srcp));
  883. srcp.reset(col[10]);
  884. colMap.insert(CMVT_(schemaname, srcp));
  885. srcp.reset(col[11]);
  886. colMap.insert(CMVT_(tablename, srcp));
  887. srcp.reset(col[12]);
  888. colMap.insert(CMVT_(columnname, srcp));
  889. srcp.reset(col[13]);
  890. colMap.insert(CMVT_(nullable, srcp));
  891. srcp.reset(col[14]);
  892. colMap.insert(CMVT_(compressionType, srcp));
  893. srcp.reset(col[15]);
  894. colMap.insert(CMVT_(autoincrement, srcp));
  895. srcp.reset(col[16]);
  896. colMap.insert(CMVT_(nextvalue, srcp));
  897. csep.columnMapNonStatic(colMap);
  898. // ignore returnedcolumn, because it's not read by Joblist for now
  899. csep.returnedCols(returnedColumnList);
  900. OID oid[17];
  901. for (int i = 0; i < 17; i++)
  902. oid[i] = col[i]->oid();
  903. // Filters
  904. SimpleFilter *f1 = new SimpleFilter (opeq,
  905. col[1]->clone(),
  906. new ConstantColumn((int64_t)Oid, ConstantColumn::NUM));
  907. filterTokenList.push_back(f1);
  908. csep.filterTokenList(filterTokenList);
  909. ostringstream oss;
  910. oss << "select columnlength,datatype,dictobjectid,listobjectid,treeobjectid,columnposition,scale,compressiontype"
  911. "prec,defaultvalue,schema,tablename,columnname from syscolumn where objectid=" << Oid <<
  912. " --colType/";
  913. if (fIdentity == EC) oss << "EC";
  914. else oss << "FE";
  915. csep.data(oss.str());
  916. NJLSysDataList sysDataList;
  917. getSysData(csep, sysDataList, SYSCOLUMN_TABLE);
  918. TableColName tcn;
  919. vector<ColumnResult*>::const_iterator it;
  920. RID rid = std::numeric_limits<RID>::max();
  921. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  922. {
  923. if ((*it)->ColumnOID() == oid[0])
  924. {
  925. ct.colWidth = ((*it)->GetData(0));
  926. if (fIdentity == EC)
  927. rid = (*it)->GetRid(0);
  928. }
  929. else if ((*it)->ColumnOID() == oid[2])
  930. ct.colDataType = (ColDataType)((*it)->GetData(0));
  931. else if ((*it)->ColumnOID() == oid[3])
  932. ct.ddn.dictOID = ((*it)->GetData(0));
  933. else if ((*it)->ColumnOID() == oid[4])
  934. ct.ddn.listOID = ((*it)->GetData(0));
  935. else if ((*it)->ColumnOID() == oid[5])
  936. ct.ddn.treeOID = ((*it)->GetData(0));
  937. else if ((*it)->ColumnOID() == oid[6])
  938. ct.colPosition = ((*it)->GetData(0));
  939. else if ((*it)->ColumnOID() == oid[7])
  940. ct.scale = ((*it)->GetData(0));
  941. else if ((*it)->ColumnOID() == oid[8])
  942. ct.precision = ((*it)->GetData(0));
  943. else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_DEFAULTVAL)
  944. {
  945. ct.defaultValue = ((*it)->GetStringData(0));
  946. if ((!ct.defaultValue.empty()) || (ct.defaultValue.length() > 0))
  947. {
  948. if (ct.constraintType != NOTNULL_CONSTRAINT)
  949. ct.constraintType = DEFAULT_CONSTRAINT;
  950. }
  951. }
  952. // NJL fix. The schema, table, and column now return the oids for the dictionary columns
  953. // on schema, table, and column.
  954. else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_SCHEMA)
  955. tcn.schema = ((*it)->GetStringData(0));
  956. else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_TABLENAME)
  957. tcn.table = ((*it)->GetStringData(0));
  958. else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_COLNAME)
  959. tcn.column = ((*it)->GetStringData(0));
  960. else if ((*it)->ColumnOID() == oid[13])
  961. {
  962. if (static_cast<ConstraintType> ((*it)->GetData(0)) == 0)
  963. {
  964. ct.constraintType = NOTNULL_CONSTRAINT;
  965. }
  966. }
  967. else if ((*it)->ColumnOID() == oid[14])
  968. ct.compressionType = ct.ddn.compressionType = ((*it)->GetData(0));
  969. else if ((*it)->ColumnOID() == oid[15])
  970. {
  971. ostringstream os;
  972. os << (char) (*it)->GetData(0);
  973. if (os.str().compare("y") == 0)
  974. ct.autoincrement = true;
  975. else
  976. ct.autoincrement = false;
  977. }
  978. else if ((*it)->ColumnOID() == oid[16])
  979. ct.nextvalue = ((*it)->GetData(0));
  980. ct.columnOID = Oid;
  981. }
  982. // populate colinfomap cache and oidbitmap
  983. lk3.lock();
  984. boost::mutex::scoped_lock lk2(fOIDmapLock);
  985. fColinfomap[Oid] = ct;
  986. fOIDmap[tcn] = Oid;
  987. if (fIdentity == EC)
  988. fColRIDmap[tcn] = rid;
  989. //Prevent mem leak
  990. //delete col[9];
  991. return ct;
  992. }
  993. const CalpontSystemCatalog::ColType CalpontSystemCatalog::colTypeDct(const OID& dictOid)
  994. {
  995. if ( dictOid >= 3000)
  996. DEBUG << "Enter colType: " << dictOid << endl;
  997. ColType ct;
  998. // invalid oid
  999. if (dictOid < 1000)
  1000. return ct;
  1001. //Check whether cache needs to be flushed
  1002. if ( dictOid >= 3000) {
  1003. checkSysCatVer();
  1004. }
  1005. // check map first cached column type
  1006. boost::mutex::scoped_lock lk3(fDctTokenMapLock);
  1007. DctTokenMap::const_iterator iter = fDctTokenMap.find(dictOid);
  1008. if (iter != fDctTokenMap.end())
  1009. return colType(iter->second);
  1010. lk3.unlock();
  1011. /* SQL statement: select objectid from syscolumn where dictobjectid = dictOid;
  1012. */
  1013. CalpontSelectExecutionPlan csep;
  1014. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  1015. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  1016. CalpontSelectExecutionPlan::ColumnMap colMap;
  1017. string objectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+OBJECTID_COL;
  1018. string dictobjectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+DICTOID_COL;
  1019. SimpleColumn* col[2];
  1020. col[0] = new SimpleColumn(objectid, fSessionID);
  1021. col[1] = new SimpleColumn(dictobjectid, fSessionID);
  1022. SRCP srcp;
  1023. srcp.reset(col[0]);
  1024. colMap.insert(CMVT_(objectid, srcp));
  1025. srcp.reset(col[1]);
  1026. colMap.insert(CMVT_(dictobjectid, srcp));
  1027. csep.columnMapNonStatic(colMap);
  1028. // ignore returnedcolumn, because it's not read by Joblist for now
  1029. csep.returnedCols(returnedColumnList);
  1030. OID oid[2];
  1031. for (int i = 0; i < 2; i++)
  1032. oid[i] = col[i]->oid();
  1033. // Filters
  1034. SimpleFilter *f1 = new SimpleFilter (opeq,
  1035. col[1]->clone(),
  1036. new ConstantColumn((int64_t)dictOid, ConstantColumn::NUM));
  1037. filterTokenList.push_back(f1);
  1038. csep.filterTokenList(filterTokenList);
  1039. ostringstream oss;
  1040. oss << "select objectid from syscolumn where dictobjectid=" << dictOid << " --colTypeDct/";
  1041. if (fIdentity == EC) oss << "EC";
  1042. else oss << "FE";
  1043. csep.data(oss.str());
  1044. NJLSysDataList sysDataList;
  1045. getSysData(csep, sysDataList, SYSCOLUMN_TABLE);
  1046. vector<ColumnResult*>::const_iterator it;
  1047. OID tokenOID = 0;
  1048. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  1049. {
  1050. if ((*it)->ColumnOID() == oid[0])
  1051. tokenOID = ((*it)->GetData(0));
  1052. }
  1053. // populate cache
  1054. lk3.lock();
  1055. fDctTokenMap[dictOid] = tokenOID;
  1056. return colType(tokenOID);
  1057. }
  1058. const CalpontSystemCatalog::TableColName CalpontSystemCatalog::colName(const OID& oid)
  1059. {
  1060. if (oid >= 3000)
  1061. DEBUG << "Enter colName: " << oid;
  1062. TableColName tableColName;
  1063. // invalid oid
  1064. if (oid < 1000)
  1065. return tableColName;
  1066. //Check whether cache needs to be flushed
  1067. if ( oid >= 3000) {
  1068. checkSysCatVer();
  1069. }
  1070. // check oidmap for system table columns and cached columns
  1071. boost::mutex::scoped_lock lk2(fOIDmapLock);
  1072. OIDmap::const_iterator iter = fOIDmap.begin();
  1073. while ( iter != fOIDmap.end() )
  1074. {
  1075. if (oid == (*iter).second )
  1076. {
  1077. tableColName = (*iter).first;
  1078. DEBUG << "|in cache|" << tableColName.schema << "|" << tableColName.table << "|" << tableColName.column << endl;
  1079. return tableColName;
  1080. }
  1081. ++iter;
  1082. }
  1083. lk2.unlock();
  1084. // SQL statement: select schema, tablename, columnname from syscolumn where objectid = oid;
  1085. CalpontSelectExecutionPlan csep;
  1086. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  1087. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  1088. CalpontSelectExecutionPlan::ColumnMap colMap;
  1089. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+OBJECTID_COL, fSessionID);
  1090. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+SCHEMA_COL, fSessionID);
  1091. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TABLENAME_COL, fSessionID);
  1092. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COLNAME_COL, fSessionID);
  1093. SRCP srcp;
  1094. srcp.reset(c1);
  1095. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+OBJECTID_COL, srcp));
  1096. srcp.reset(c2);
  1097. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+SCHEMA_COL, srcp));
  1098. srcp.reset(c3);
  1099. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TABLENAME_COL, srcp));
  1100. srcp.reset(c4);
  1101. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COLNAME_COL, srcp));
  1102. csep.columnMapNonStatic(colMap);
  1103. srcp.reset(c2->clone());
  1104. returnedColumnList.push_back(srcp);
  1105. srcp.reset(c3->clone());
  1106. returnedColumnList.push_back(srcp);
  1107. srcp.reset(c4->clone());
  1108. returnedColumnList.push_back(srcp);
  1109. csep.returnedCols(returnedColumnList);
  1110. // NJL fix. The dictionary column OID is now returned from getSysData.
  1111. // OID oid2 = c2->oid();
  1112. // OID oid3 = c3->oid();
  1113. // OID oid4 = c4->oid();
  1114. OID oid2 = DICTOID_SYSCOLUMN_SCHEMA;
  1115. OID oid3 = DICTOID_SYSCOLUMN_TABLENAME;
  1116. OID oid4 = DICTOID_SYSCOLUMN_COLNAME;
  1117. // Filters
  1118. SimpleFilter *f1 = new SimpleFilter (opeq,
  1119. c1->clone(),
  1120. new ConstantColumn((int64_t)oid, ConstantColumn::NUM));
  1121. filterTokenList.push_back(f1);
  1122. csep.filterTokenList(filterTokenList);
  1123. ostringstream oss;
  1124. oss << "select schema,tablename,columnname from syscolumn where objectid=" << oid <<
  1125. " --colName/";
  1126. if (fIdentity == EC) oss << "EC";
  1127. else oss << "FE";
  1128. csep.data(oss.str());
  1129. NJLSysDataList sysDataList;
  1130. getSysData (csep, sysDataList, SYSCOLUMN_TABLE);
  1131. vector<ColumnResult*>::const_iterator it;
  1132. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  1133. {
  1134. if ((*it)->ColumnOID() == oid2)
  1135. tableColName.schema = (*it)->GetStringData(0);
  1136. else if ((*it)->ColumnOID() == oid3)
  1137. tableColName.table = (*it)->GetStringData(0);
  1138. else if ((*it)->ColumnOID() == oid4)
  1139. tableColName.column = (*it)->GetStringData(0);
  1140. }
  1141. if (oid > 3000)
  1142. DEBUG << "|" << tableColName.schema << "|" << tableColName.table << "|" << tableColName.column << endl;
  1143. #if BOOST_VERSION < 103800
  1144. if (!lk2.locked()) lk2.lock();
  1145. #else
  1146. if (!lk2.owns_lock()) lk2.lock();
  1147. #endif
  1148. fOIDmap[tableColName] = oid;
  1149. return tableColName;
  1150. }
  1151. const CalpontSystemCatalog::TableColName CalpontSystemCatalog::dictColName(const OID& oid)
  1152. {
  1153. if (oid >= 3000)
  1154. DEBUG << "Enter dictColName: " << oid;
  1155. TableColName tableColName;
  1156. // invalid oid
  1157. if (oid < 1000)
  1158. return tableColName;
  1159. //Check whether cache needs to be flushed
  1160. if ( oid >= 3000) {
  1161. checkSysCatVer();
  1162. }
  1163. // SQL statement: select schema, tablename, columnname from syscolumn where dictobjectid = oid;
  1164. CalpontSelectExecutionPlan csep;
  1165. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  1166. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  1167. CalpontSelectExecutionPlan::ColumnMap colMap;
  1168. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+DICTOID_COL, fSessionID);
  1169. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+SCHEMA_COL, fSessionID);
  1170. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TABLENAME_COL, fSessionID);
  1171. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COLNAME_COL, fSessionID);
  1172. SRCP srcp;
  1173. srcp.reset(c1);
  1174. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+DICTOID_COL, srcp));
  1175. srcp.reset(c2);
  1176. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+SCHEMA_COL, srcp));
  1177. srcp.reset(c3);
  1178. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TABLENAME_COL, srcp));
  1179. srcp.reset(c4);
  1180. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COLNAME_COL, srcp));
  1181. csep.columnMapNonStatic(colMap);
  1182. srcp.reset(c2->clone());
  1183. returnedColumnList.push_back(srcp);
  1184. srcp.reset(c3->clone());
  1185. returnedColumnList.push_back(srcp);
  1186. srcp.reset(c4->clone());
  1187. returnedColumnList.push_back(srcp);
  1188. csep.returnedCols(returnedColumnList);
  1189. OID oid2 = DICTOID_SYSCOLUMN_SCHEMA;
  1190. OID oid3 = DICTOID_SYSCOLUMN_TABLENAME;
  1191. OID oid4 = DICTOID_SYSCOLUMN_COLNAME;
  1192. // Filters
  1193. SimpleFilter *f1 = new SimpleFilter (opeq,
  1194. c1->clone(),
  1195. new ConstantColumn((int64_t)oid, ConstantColumn::NUM));
  1196. filterTokenList.push_back(f1);
  1197. csep.filterTokenList(filterTokenList);
  1198. ostringstream oss;
  1199. oss << "select schema,tablename,columnname from syscolumn where dictobjectid=" << oid <<
  1200. " --colName/";
  1201. if (fIdentity == EC) oss << "EC";
  1202. else oss << "FE";
  1203. csep.data(oss.str());
  1204. NJLSysDataList sysDataList;
  1205. getSysData (csep, sysDataList, SYSCOLUMN_TABLE);
  1206. vector<ColumnResult*>::const_iterator it;
  1207. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  1208. {
  1209. if ((*it)->ColumnOID() == oid2)
  1210. tableColName.schema = (*it)->GetStringData(0);
  1211. else if ((*it)->ColumnOID() == oid3)
  1212. tableColName.table = (*it)->GetStringData(0);
  1213. else if ((*it)->ColumnOID() == oid4)
  1214. tableColName.column = (*it)->GetStringData(0);
  1215. }
  1216. if (oid > 3000)
  1217. DEBUG << "|" << tableColName.schema << "|" << tableColName.table << "|" << tableColName.column << endl;
  1218. return tableColName;
  1219. }
  1220. const uint64_t CalpontSystemCatalog::nextAutoIncrValue ( TableName aTableName)
  1221. {
  1222. transform( aTableName.schema.begin(), aTableName.schema.end(), aTableName.schema.begin(), to_lower() );
  1223. transform( aTableName.table.begin(), aTableName.table.end(), aTableName.table.begin(), to_lower() );
  1224. TableInfo tbInfo;
  1225. try {
  1226. tbInfo = tableInfo (aTableName);
  1227. }
  1228. catch (runtime_error& /*ex*/)
  1229. {
  1230. throw;
  1231. }
  1232. if (tbInfo.tablewithautoincr == NO_AUTOINCRCOL)
  1233. return AUTOINCR_SATURATED;
  1234. //Build a plan to get current nextvalue: select nextvalue from syscolumn where schema = tableName.schema and tablename = tableName.table and autoincrement='y';
  1235. CalpontSelectExecutionPlan csep;
  1236. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  1237. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  1238. CalpontSelectExecutionPlan::ColumnMap colMap;
  1239. string tablename = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TABLENAME_COL;
  1240. string schemaname = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+SCHEMA_COL;
  1241. string autoincrement = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+AUTOINC_COL;
  1242. string nextvalue = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+NEXTVALUE_COL;
  1243. SimpleColumn* col[5];
  1244. col[0] = new SimpleColumn(tablename, fSessionID);
  1245. col[1] = new SimpleColumn(schemaname, fSessionID);
  1246. col[2] = new SimpleColumn(autoincrement, fSessionID);
  1247. col[3] = new SimpleColumn(nextvalue, fSessionID);
  1248. SRCP srcp;
  1249. srcp.reset(col[0]);
  1250. colMap.insert(CMVT_(tablename, srcp));
  1251. srcp.reset(col[1]);
  1252. colMap.insert(CMVT_(schemaname, srcp));
  1253. srcp.reset(col[2]);
  1254. colMap.insert(CMVT_(autoincrement, srcp));
  1255. srcp.reset(col[3]);
  1256. colMap.insert(CMVT_(nextvalue, srcp));
  1257. csep.columnMapNonStatic(colMap);
  1258. csep.returnedCols(returnedColumnList);
  1259. OID oid[4];
  1260. for (int i = 0; i < 4; i++)
  1261. oid[i] = col[i]->oid();
  1262. // Filters
  1263. SimpleFilter *f1 = new SimpleFilter (opeq,
  1264. col[1]->clone(),
  1265. new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
  1266. filterTokenList.push_back(f1);
  1267. filterTokenList.push_back(new Operator("and"));
  1268. SimpleFilter *f2 = new SimpleFilter (opeq,
  1269. col[0]->clone(),
  1270. new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
  1271. filterTokenList.push_back(f2);
  1272. filterTokenList.push_back(new Operator("and"));
  1273. SimpleFilter *f3 = new SimpleFilter (opeq,
  1274. col[2]->clone(),
  1275. new ConstantColumn("y", ConstantColumn::LITERAL));
  1276. filterTokenList.push_back(f3);
  1277. csep.filterTokenList(filterTokenList);
  1278. ostringstream oss;
  1279. oss << "select nextvalue from syscolumn where schema = aTableName.schema and tablename = aTableName.table and autoincrement='y'";
  1280. if (fIdentity == EC) oss << "EC";
  1281. else oss << "FE";
  1282. csep.data(oss.str());
  1283. NJLSysDataList sysDataList;
  1284. try {
  1285. getSysData(csep, sysDataList, SYSCOLUMN_TABLE);
  1286. }
  1287. catch (runtime_error& e)
  1288. {
  1289. throw runtime_error ( e.what() );
  1290. }
  1291. uint64_t nextVal = AUTOINCR_SATURATED;
  1292. vector<ColumnResult*>::const_iterator it;
  1293. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  1294. {
  1295. if ((*it)->ColumnOID() == oid[3])
  1296. {
  1297. nextVal = static_cast<uint64_t>(((*it)->GetData(0)));
  1298. }
  1299. }
  1300. return (nextVal);
  1301. }
  1302. int32_t CalpontSystemCatalog::autoColumOid ( TableName aTableName)
  1303. {
  1304. transform( aTableName.schema.begin(), aTableName.schema.end(), aTableName.schema.begin(), to_lower() );
  1305. transform( aTableName.table.begin(), aTableName.table.end(), aTableName.table.begin(), to_lower() );
  1306. TableInfo tbInfo;
  1307. try {
  1308. tbInfo = tableInfo (aTableName);
  1309. }
  1310. catch (runtime_error& /*ex*/)
  1311. {
  1312. return -2;
  1313. }
  1314. if (tbInfo.tablewithautoincr == NO_AUTOINCRCOL)
  1315. return 0;
  1316. //Build a plan to get column oid: select objectid from syscolumn where schema = tableName.schema and tablename = tableName.table and autoincrement='y';
  1317. CalpontSelectExecutionPlan csep;
  1318. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  1319. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  1320. CalpontSelectExecutionPlan::ColumnMap colMap;
  1321. string tablename = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TABLENAME_COL;
  1322. string schemaname = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+SCHEMA_COL;
  1323. string autoincrement = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+AUTOINC_COL;
  1324. string objectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+OBJECTID_COL;
  1325. SimpleColumn* col[5];
  1326. col[0] = new SimpleColumn(tablename, fSessionID);
  1327. col[1] = new SimpleColumn(schemaname, fSessionID);
  1328. col[2] = new SimpleColumn(autoincrement, fSessionID);
  1329. col[3] = new SimpleColumn(objectid, fSessionID);
  1330. SRCP srcp;
  1331. srcp.reset(col[0]);
  1332. colMap.insert(CMVT_(tablename, srcp));
  1333. srcp.reset(col[1]);
  1334. colMap.insert(CMVT_(schemaname, srcp));
  1335. srcp.reset(col[2]);
  1336. colMap.insert(CMVT_(autoincrement, srcp));
  1337. srcp.reset(col[3]);
  1338. colMap.insert(CMVT_(objectid, srcp));
  1339. csep.columnMapNonStatic(colMap);
  1340. csep.returnedCols(returnedColumnList);
  1341. OID oid[4];
  1342. for (int i = 0; i < 4; i++)
  1343. oid[i] = col[i]->oid();
  1344. // Filters
  1345. SimpleFilter *f1 = new SimpleFilter (opeq,
  1346. col[1]->clone(),
  1347. new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
  1348. filterTokenList.push_back(f1);
  1349. filterTokenList.push_back(new Operator("and"));
  1350. SimpleFilter *f2 = new SimpleFilter (opeq,
  1351. col[0]->clone(),
  1352. new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
  1353. filterTokenList.push_back(f2);
  1354. filterTokenList.push_back(new Operator("and"));
  1355. SimpleFilter *f3 = new SimpleFilter (opeq,
  1356. col[2]->clone(),
  1357. new ConstantColumn("y", ConstantColumn::LITERAL));
  1358. filterTokenList.push_back(f3);
  1359. csep.filterTokenList(filterTokenList);
  1360. ostringstream oss;
  1361. oss << "select nextvalue from syscolumn where schema = aTableName.schema and tablename = aTableName.table and autoincrement='y'";
  1362. if (fIdentity == EC) oss << "EC";
  1363. else oss << "FE";
  1364. csep.data(oss.str());
  1365. NJLSysDataList sysDataList;
  1366. try {
  1367. getSysData(csep, sysDataList, SYSCOLUMN_TABLE);
  1368. }
  1369. catch (runtime_error& e)
  1370. {
  1371. throw runtime_error ( e.what() );
  1372. }
  1373. int32_t columnOid = 0;
  1374. vector<ColumnResult*>::const_iterator it;
  1375. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  1376. {
  1377. if ((*it)->ColumnOID() == oid[3])
  1378. {
  1379. columnOid = ((*it)->GetData(0));
  1380. }
  1381. }
  1382. return (columnOid);
  1383. }
  1384. const CalpontSystemCatalog::ROPair CalpontSystemCatalog::nextAutoIncrRid ( const OID& columnoid)
  1385. {
  1386. //Build a plan to get rid of nextvalue: select nextvalue from syscolumn where objectid = columnoid;
  1387. CalpontSelectExecutionPlan csep;
  1388. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  1389. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  1390. CalpontSelectExecutionPlan::ColumnMap colMap;
  1391. string objectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+OBJECTID_COL;
  1392. string nextvalue = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+NEXTVALUE_COL;
  1393. SimpleColumn* col[2];
  1394. col[0] = new SimpleColumn(objectid, fSessionID);
  1395. col[1] = new SimpleColumn(nextvalue, fSessionID);
  1396. SRCP srcp;
  1397. srcp.reset(col[0]);
  1398. colMap.insert(CMVT_(objectid, srcp));
  1399. srcp.reset(col[1]);
  1400. colMap.insert(CMVT_(nextvalue, srcp));
  1401. csep.columnMapNonStatic(colMap);
  1402. csep.returnedCols(returnedColumnList);
  1403. OID oid[2];
  1404. for (int i = 0; i < 2; i++)
  1405. oid[i] = col[i]->oid();
  1406. // Filters
  1407. SimpleFilter *f1 = new SimpleFilter (opeq,
  1408. col[0]->clone(),
  1409. new ConstantColumn((int64_t)columnoid, ConstantColumn::LITERAL));
  1410. filterTokenList.push_back(f1);
  1411. csep.filterTokenList(filterTokenList);
  1412. ostringstream oss;
  1413. oss << "select nextvalue from syscolumn objectid = columnoid";
  1414. if (fIdentity == EC) oss << "EC";
  1415. else oss << "FE";
  1416. csep.data(oss.str());
  1417. NJLSysDataList sysDataList;
  1418. try {
  1419. getSysData(csep, sysDataList, SYSCOLUMN_TABLE);
  1420. }
  1421. catch (runtime_error& e)
  1422. {
  1423. throw runtime_error ( e.what() );
  1424. }
  1425. vector<ColumnResult*>::const_iterator it;
  1426. ROPair roPair;
  1427. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  1428. {
  1429. if ((*it)->ColumnOID() == oid[1])
  1430. {
  1431. roPair.rid = ((*it)->GetRid(0));
  1432. roPair.objnum = oid[1];
  1433. return roPair;
  1434. }
  1435. }
  1436. return roPair;
  1437. }
  1438. #if 0 //Not implemented
  1439. const CalpontSystemCatalog::OID CalpontSystemCatalog::colBitmap(const OID& oid) const
  1440. {
  1441. return oid;
  1442. DEBUG << "Enter colBitmap: Not implemented" << endl;
  1443. }
  1444. const CalpontSystemCatalog::SCN CalpontSystemCatalog::scn(void) const
  1445. {
  1446. DEBUG << "Enter scn: Not implemented" << endl;
  1447. SCN scn;
  1448. scn = 1;
  1449. return scn;
  1450. }
  1451. #endif
  1452. /* static */
  1453. boost::shared_ptr<CalpontSystemCatalog> CalpontSystemCatalog::makeCalpontSystemCatalog(uint32_t sessionID)
  1454. {
  1455. boost::mutex::scoped_lock lock(map_mutex);
  1456. boost::shared_ptr<CalpontSystemCatalog> instance;
  1457. CatalogMap::const_iterator it = fCatalogMap.find(sessionID);
  1458. if (sessionID == 0)
  1459. {
  1460. if (it == fCatalogMap.end())
  1461. {
  1462. instance.reset(new CalpontSystemCatalog());
  1463. fCatalogMap[0] = instance;
  1464. return instance;
  1465. }
  1466. #if 0
  1467. //Is it really an error for a non-sessionid-0 catalog to be present at this point?
  1468. if (fCatalogMap.size() != 1)
  1469. {
  1470. //throw runtime_error ("No calpont system catalog instance found.");
  1471. ostringstream oss;
  1472. oss << "Preposterous number of system catalog instances found when looking for "
  1473. "session 0: " << fCatalogMap.size();
  1474. throw runtime_error(oss.str());
  1475. }
  1476. #endif
  1477. return it->second;
  1478. }
  1479. if (it == fCatalogMap.end())
  1480. {
  1481. instance.reset(new CalpontSystemCatalog());
  1482. instance->sessionID(sessionID);
  1483. instance->fExeMgr->setSessionId(sessionID);
  1484. fCatalogMap[sessionID] = instance;
  1485. return instance;
  1486. }
  1487. return it->second;
  1488. }
  1489. /* static */
  1490. void CalpontSystemCatalog::removeCalpontSystemCatalog(uint32_t sessionID)
  1491. {
  1492. boost::mutex::scoped_lock lock(map_mutex);
  1493. DEBUG << "remove calpont system catalog for session " << sessionID << endl;
  1494. fCatalogMap.erase(sessionID);
  1495. /*
  1496. CatalogMap::iterator it = fCatalogMap.find(sessionID);
  1497. if (it != fCatalogMap.end())
  1498. {
  1499. delete (*it).second;
  1500. fCatalogMap.erase(it);
  1501. }
  1502. */
  1503. }
  1504. CalpontSystemCatalog::CalpontSystemCatalog():
  1505. fExeMgr (new ClientRotator(0, "ExeMgr")),
  1506. fSessionID (0)
  1507. {
  1508. // Set fIdentity based on the module on which we are running.
  1509. fIdentity = EC;
  1510. if ( fSessionManager.get() == 0 )
  1511. fSessionManager.reset(new SessionManager());
  1512. try
  1513. {
  1514. string localModuleType;
  1515. const char* p = 0;
  1516. //see if env is set to override identity lookup
  1517. #ifdef _MSC_VER
  1518. p = "EC";
  1519. string cfStr = IDBreadRegistry("SyscatIdent");
  1520. if (!cfStr.empty())
  1521. p = cfStr.c_str();
  1522. #else
  1523. p = getenv("CALPONT_CSC_IDENT");
  1524. #endif
  1525. if (p && *p)
  1526. {
  1527. localModuleType = p;
  1528. }
  1529. else
  1530. {
  1531. oam::Oam oam;
  1532. oam::oamModuleInfo_t t = oam.getModuleInfo();
  1533. localModuleType = boost::get<1>(t);
  1534. }
  1535. // If dm (director module), set the identity to FE (Front End).
  1536. // @bug 1029. set "FE" for beetlejuice (xm)
  1537. if (localModuleType == "dm" || localModuleType == "xm")
  1538. {
  1539. fIdentity = FE;
  1540. }
  1541. }
  1542. catch(exception&)
  1543. {
  1544. // If not in an environment with OAM set up, default to Front End.
  1545. fIdentity = FE;
  1546. }
  1547. buildSysColinfomap();
  1548. buildSysOIDmap();
  1549. buildSysTablemap();
  1550. buildSysDctmap();
  1551. fSyscatSCN = fSessionManager->sysCatVerID().currentScn;
  1552. }
  1553. CalpontSystemCatalog::~CalpontSystemCatalog()
  1554. {
  1555. delete fExeMgr;
  1556. }
  1557. #if 0
  1558. const CalpontSystemCatalog::RIDList CalpontSystemCatalog::indexRIDs(const TableName& tableName)
  1559. {
  1560. /* SQL statement: select indexname from sysindex where schema=tableName.schema and tablename=tableName.table;*/
  1561. ROPair rid;
  1562. TableColName aTableName;
  1563. aTableName.schema = tableName.schema;
  1564. aTableName.table = tableName.table;
  1565. transform( aTableName.schema.begin(), aTableName.schema.end(), aTableName.schema.begin(), to_lower() );
  1566. transform( aTableName.table.begin(), aTableName.table.end(), aTableName.table.begin(), to_lower() );
  1567. if (aTableName.schema.compare(CALPONT_SCHEMA) != 0)
  1568. DEBUG << "Enter constraintRIDs: " << tableName.schema << "|" << tableName.table << endl;
  1569. RIDList rl;
  1570. CalpontSelectExecutionPlan csep;
  1571. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  1572. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  1573. CalpontSelectExecutionPlan::ColumnMap colMap;
  1574. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+INDEXNAME_COL, fSessionID);
  1575. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+SCHEMA_COL, fSessionID);
  1576. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+TABLENAME_COL, fSessionID);
  1577. SRCP srcp;
  1578. srcp.reset(c1);
  1579. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+INDEXNAME_COL, srcp));
  1580. srcp.reset(c2);
  1581. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+SCHEMA_COL, srcp));
  1582. srcp.reset(c3);
  1583. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+TABLENAME_COL, srcp));
  1584. csep.columnMapNonStatic(colMap);
  1585. srcp.reset(c1->clone());
  1586. returnedColumnList.push_back(srcp);
  1587. csep.returnedCols(returnedColumnList);
  1588. OID oid = DICTOID_SYSINDEX_INDEXNAME;
  1589. // Filters
  1590. SimpleFilter *f1 = new SimpleFilter (opeq,
  1591. c2->clone(),
  1592. new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
  1593. filterTokenList.push_back(f1);
  1594. filterTokenList.push_back(new Operator("and"));
  1595. SimpleFilter *f2 = new SimpleFilter (opeq,
  1596. c3->clone(),
  1597. new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
  1598. filterTokenList.push_back(f2);
  1599. csep.filterTokenList(filterTokenList);
  1600. NJLSysDataList sysDataList;
  1601. getSysData (csep, sysDataList, SYSINDEX_TABLE);
  1602. vector<ColumnResult*>::const_iterator it;
  1603. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  1604. {
  1605. if ((*it)->ColumnOID() == oid)
  1606. {
  1607. // TODO: get rowid from columnresult. new feather of columnresult
  1608. for (int i = 0; i < (*it)->dataCount(); i++)
  1609. {
  1610. if (fIdentity == EC)
  1611. rid.rid = (*it)->GetRid(i);
  1612. else
  1613. rid.rid = 0;
  1614. rl.push_back(rid);
  1615. }
  1616. return rl;
  1617. }
  1618. }
  1619. return rl;
  1620. }
  1621. const CalpontSystemCatalog::RIDList CalpontSystemCatalog::indexColRIDs(const TableName& tableName)
  1622. {
  1623. /* SQL statement: select indexname from sysindexcol where schema=tableColName.schema and
  1624. * tablename=tableColName.table;
  1625. */
  1626. RIDList ridlist;
  1627. TableName aTableColName;
  1628. aTableColName.schema = tableName.schema;
  1629. aTableColName.table = tableName.table;
  1630. transform( aTableColName.schema.begin(), aTableColName.schema.end(), aTableColName.schema.begin(), to_lower() );
  1631. transform( aTableColName.table.begin(), aTableColName.table.end(), aTableColName.table.begin(), to_lower() );
  1632. if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
  1633. DEBUG << "Enter indexColRIDs: " << tableName.schema << "|"
  1634. << tableName.table << endl;
  1635. CalpontSelectExecutionPlan csep;
  1636. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  1637. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  1638. CalpontSelectExecutionPlan::ColumnMap colMap;
  1639. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+INDEXNAME_COL, fSessionID);
  1640. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+SCHEMA_COL, fSessionID);
  1641. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+TABLENAME_COL, fSessionID);
  1642. SRCP srcp;
  1643. srcp.reset(c1);
  1644. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+INDEXNAME_COL, srcp));
  1645. srcp.reset(c2);
  1646. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+SCHEMA_COL, srcp));
  1647. srcp.reset(c3);
  1648. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+TABLENAME_COL, srcp));
  1649. csep.columnMapNonStatic(colMap);
  1650. srcp.reset(c1->clone());
  1651. returnedColumnList.push_back(srcp);
  1652. csep.returnedCols(returnedColumnList);
  1653. OID oid = DICTOID_SYSINDEXCOL_INDEXNAME;
  1654. // Filters
  1655. SimpleFilter *f1 = new SimpleFilter (opeq,
  1656. c2->clone(),
  1657. new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
  1658. filterTokenList.push_back(f1);
  1659. filterTokenList.push_back(new Operator("and"));
  1660. SimpleFilter *f2 = new SimpleFilter (opeq,
  1661. c3->clone(),
  1662. new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
  1663. filterTokenList.push_back(f2);
  1664. csep.filterTokenList(filterTokenList);
  1665. NJLSysDataList sysDataList;
  1666. getSysData (csep, sysDataList, SYSINDEXCOL_TABLE);
  1667. vector<ColumnResult*>::const_iterator it;
  1668. ROPair rid;
  1669. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  1670. {
  1671. if ((*it)->ColumnOID() == oid)
  1672. {
  1673. for (int i = 0; i < (*it)->dataCount(); i++)
  1674. {
  1675. if (fIdentity == EC)
  1676. rid.rid = (*it)->GetRid(i);
  1677. ridlist.push_back(rid);
  1678. }
  1679. return ridlist;
  1680. }
  1681. }
  1682. return ridlist;
  1683. }
  1684. const CalpontSystemCatalog::RIDList CalpontSystemCatalog::indexColRIDs(const IndexName& indexName)
  1685. {
  1686. /* SQL statement: select indexname from sysindexcol where schema=indexName.schema and
  1687. * tablename=indexName.table and indexname=indexName.index;
  1688. */
  1689. RIDList ridlist;
  1690. IndexName aIndexName;
  1691. aIndexName.schema = indexName.schema;
  1692. aIndexName.table = indexName.table;
  1693. aIndexName.index = indexName.index;
  1694. transform( aIndexName.schema.begin(), aIndexName.schema.end(), aIndexName.schema.begin(), to_lower() );
  1695. transform( aIndexName.table.begin(), aIndexName.table.end(), aIndexName.table.begin(), to_lower() );
  1696. transform( aIndexName.index.begin(), aIndexName.index.end(), aIndexName.index.begin(), to_lower() );
  1697. if (aIndexName.schema.compare(CALPONT_SCHEMA) != 0)
  1698. DEBUG << "Enter indexColRIDs: " << aIndexName.schema << "|"
  1699. << aIndexName.table << aIndexName.index << endl;
  1700. CalpontSelectExecutionPlan csep;
  1701. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  1702. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  1703. CalpontSelectExecutionPlan::ColumnMap colMap;
  1704. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+INDEXNAME_COL, fSessionID);
  1705. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+SCHEMA_COL, fSessionID);
  1706. SRCP srcp;
  1707. srcp.reset(c1);
  1708. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+INDEXNAME_COL, srcp));
  1709. srcp.reset(c2);
  1710. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+SCHEMA_COL, srcp));
  1711. csep.columnMapNonStatic(colMap);
  1712. srcp.reset(c1->clone());
  1713. returnedColumnList.push_back(srcp);
  1714. csep.returnedCols(returnedColumnList);
  1715. OID oid = DICTOID_SYSINDEXCOL_INDEXNAME;
  1716. // Filters
  1717. SimpleFilter *f1 = new SimpleFilter (opeq,
  1718. c2->clone(),
  1719. new ConstantColumn(aIndexName.schema, ConstantColumn::LITERAL));
  1720. filterTokenList.push_back(f1);
  1721. filterTokenList.push_back(new Operator("and"));
  1722. SimpleFilter *f3 = new SimpleFilter (opeq,
  1723. c1->clone(),
  1724. new ConstantColumn(aIndexName.index, ConstantColumn::LITERAL));
  1725. filterTokenList.push_back(f3);
  1726. csep.filterTokenList(filterTokenList);
  1727. NJLSysDataList sysDataList;
  1728. getSysData (csep, sysDataList, SYSINDEXCOL_TABLE);
  1729. vector<ColumnResult*>::const_iterator it;
  1730. ROPair rid;
  1731. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  1732. {
  1733. if ((*it)->ColumnOID() == oid)
  1734. {
  1735. for (int i = 0; i < (*it)->dataCount(); i++)
  1736. {
  1737. if (fIdentity == EC)
  1738. rid.rid = (*it)->GetRid(i);
  1739. ridlist.push_back(rid);
  1740. }
  1741. return ridlist;
  1742. }
  1743. }
  1744. return ridlist;
  1745. }
  1746. const CalpontSystemCatalog::RIDList CalpontSystemCatalog::constraintRIDs(const TableName& tableName)
  1747. {
  1748. /* SQL statement: select constraintname from sysconstraint where schema=tableName.schema and tablename=tableName.table;*/
  1749. ROPair rid;
  1750. TableColName aTableName;
  1751. aTableName.schema = tableName.schema;
  1752. aTableName.table = tableName.table;
  1753. transform( aTableName.schema.begin(), aTableName.schema.end(), aTableName.schema.begin(), to_lower() );
  1754. transform( aTableName.table.begin(), aTableName.table.end(), aTableName.table.begin(), to_lower() );
  1755. if (aTableName.schema.compare(CALPONT_SCHEMA) != 0)
  1756. DEBUG << "Enter constraintRIDs: " << tableName.schema << "|" << tableName.table << endl;
  1757. RIDList rl;
  1758. CalpontSelectExecutionPlan csep;
  1759. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  1760. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  1761. CalpontSelectExecutionPlan::ColumnMap colMap;
  1762. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTNAME_COL, fSessionID);
  1763. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+SCHEMA_COL, fSessionID);
  1764. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+TABLENAME_COL, fSessionID);
  1765. SRCP srcp;
  1766. srcp.reset(c1);
  1767. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTNAME_COL, srcp));
  1768. srcp.reset(c2);
  1769. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+SCHEMA_COL, srcp));
  1770. srcp.reset(c3);
  1771. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+TABLENAME_COL, srcp));
  1772. csep.columnMapNonStatic(colMap);
  1773. srcp.reset(c1->clone());
  1774. returnedColumnList.push_back(srcp);
  1775. csep.returnedCols(returnedColumnList);
  1776. OID oid = DICTOID_SYSCONSTRAINT_CONSTRAINTNAME;
  1777. // Filters
  1778. SimpleFilter *f1 = new SimpleFilter (opeq,
  1779. c2->clone(),
  1780. new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
  1781. filterTokenList.push_back(f1);
  1782. filterTokenList.push_back(new Operator("and"));
  1783. SimpleFilter *f2 = new SimpleFilter (opeq,
  1784. c3->clone(),
  1785. new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
  1786. filterTokenList.push_back(f2);
  1787. csep.filterTokenList(filterTokenList);
  1788. NJLSysDataList sysDataList;
  1789. getSysData (csep, sysDataList, SYSCONSTRAINT_TABLE);
  1790. vector<ColumnResult*>::const_iterator it;
  1791. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  1792. {
  1793. if ((*it)->ColumnOID() == oid)
  1794. {
  1795. // TODO: get rowid from columnresult. new feather of columnresult
  1796. for (int i = 0; i < (*it)->dataCount(); i++)
  1797. {
  1798. if (fIdentity == EC)
  1799. rid.rid = (*it)->GetRid(i);
  1800. rl.push_back(rid);
  1801. }
  1802. return rl;
  1803. }
  1804. }
  1805. return rl;
  1806. }
  1807. const CalpontSystemCatalog::IndexNameList CalpontSystemCatalog::colValueSysconstraint (const TableColName& tableColName, bool useCache)
  1808. {
  1809. /* SQL statement: select constraintname from sysconstraint where schema = schema and table=table and column=column;*/
  1810. IndexNameList indexNameList;
  1811. TableColName aTableColName;
  1812. aTableColName.schema = tableColName.schema;
  1813. aTableColName.table = tableColName.table;
  1814. aTableColName.column = tableColName.column;
  1815. transform( aTableColName.schema.begin(), aTableColName.schema.end(), aTableColName.schema.begin(), to_lower() );
  1816. transform( aTableColName.table.begin(), aTableColName.table.end(), aTableColName.table.begin(), to_lower() );
  1817. transform( aTableColName.column.begin(), aTableColName.column.end(), aTableColName.column.begin(), to_lower() );
  1818. #if BOOST_VERSION < 104000
  1819. boost::mutex::scoped_lock lk1(fColIndexListmapLock, false);
  1820. #else
  1821. boost::mutex::scoped_lock lk1(fColIndexListmapLock, boost::defer_lock);
  1822. #endif
  1823. if(useCache)
  1824. {
  1825. lk1.lock();
  1826. ColIndexListmap::const_iterator iter = fColIndexListmap.find(aTableColName);
  1827. if (iter != fColIndexListmap.end())
  1828. {
  1829. indexNameList = iter->second;
  1830. return indexNameList;
  1831. }
  1832. lk1.unlock();
  1833. }
  1834. if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
  1835. DEBUG << "Enter colValueSysconstraint: " << tableColName.schema << "|"
  1836. << tableColName.table << "|"
  1837. << tableColName.column << endl;
  1838. CalpontSelectExecutionPlan csep;
  1839. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  1840. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  1841. CalpontSelectExecutionPlan::ColumnMap colMap;
  1842. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+CONSTRAINTNAME_COL, fSessionID);
  1843. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+SCHEMA_COL, fSessionID);
  1844. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+TABLENAME_COL, fSessionID);
  1845. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+COLNAME_COL, fSessionID);
  1846. SRCP srcp;
  1847. srcp.reset(c1);
  1848. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+CONSTRAINTNAME_COL, srcp));
  1849. srcp.reset(c2);
  1850. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+SCHEMA_COL, srcp));
  1851. srcp.reset(c3);
  1852. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+TABLENAME_COL, srcp));
  1853. srcp.reset(c4);
  1854. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+COLNAME_COL, srcp));
  1855. csep.columnMapNonStatic(colMap);
  1856. srcp.reset(c1->clone());
  1857. returnedColumnList.push_back(srcp);
  1858. csep.returnedCols(returnedColumnList);
  1859. OID oid = DICTOID_SYSCONSTRAINTCOL_CONSTRAINTNAME;
  1860. // Filters
  1861. SimpleFilter *f1 = new SimpleFilter (opeq,
  1862. c2->clone(),
  1863. new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
  1864. filterTokenList.push_back(f1);
  1865. filterTokenList.push_back(new Operator("and"));
  1866. SimpleFilter *f2 = new SimpleFilter (opeq,
  1867. c3->clone(),
  1868. new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
  1869. filterTokenList.push_back(f2);
  1870. filterTokenList.push_back(new Operator("and"));
  1871. SimpleFilter *f3 = new SimpleFilter (opeq,
  1872. c4->clone(),
  1873. new ConstantColumn(aTableColName.column, ConstantColumn::LITERAL));
  1874. filterTokenList.push_back(f3);
  1875. csep.filterTokenList(filterTokenList);
  1876. NJLSysDataList sysDataList;
  1877. getSysData (csep, sysDataList, SYSCONSTRAINTCOL_TABLE);
  1878. vector<ColumnResult*>::const_iterator it;
  1879. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  1880. {
  1881. if ((*it)->ColumnOID() == oid)
  1882. {
  1883. for (int i = 0; i < (*it)->dataCount(); i++)
  1884. {
  1885. IndexName indexName;
  1886. indexName.schema = aTableColName.schema;
  1887. indexName.table = aTableColName.table;
  1888. indexName.index = ((*it)->GetStringData(0));
  1889. indexNameList.push_back(indexName);
  1890. }
  1891. }
  1892. }
  1893. lk1.lock();
  1894. fColIndexListmap[aTableColName] = indexNameList;
  1895. lk1.unlock();
  1896. return indexNameList;
  1897. }
  1898. // TODO: should take index name as parameter and filter on schema name and table name also
  1899. const CalpontSystemCatalog::RID CalpontSystemCatalog::constraintRID(const std::string constraintName)
  1900. {
  1901. DEBUG << "Enter constraintRID: " << constraintName << endl;
  1902. /* SQL statement: select constraintname from sysconstraint where constraintname=constraintName;
  1903. */
  1904. RID rid = std::numeric_limits<RID>::max();
  1905. string aConstraintName = constraintName;
  1906. transform( aConstraintName.begin(), aConstraintName.end(), aConstraintName.begin(), to_lower() );
  1907. CalpontSelectExecutionPlan csep;
  1908. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  1909. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  1910. CalpontSelectExecutionPlan::ColumnMap colMap;
  1911. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTNAME_COL, fSessionID);
  1912. SRCP srcp;
  1913. srcp.reset(c1);
  1914. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTNAME_COL, srcp));
  1915. csep.columnMapNonStatic(colMap);
  1916. srcp.reset(c1->clone());
  1917. returnedColumnList.push_back(srcp);
  1918. csep.returnedCols(returnedColumnList);
  1919. OID oid = DICTOID_SYSCONSTRAINT_CONSTRAINTNAME;
  1920. // Filters
  1921. SimpleFilter *f1 = new SimpleFilter (opeq,
  1922. c1->clone(),
  1923. new ConstantColumn(aConstraintName, ConstantColumn::LITERAL));
  1924. filterTokenList.push_back(f1);
  1925. csep.filterTokenList(filterTokenList);
  1926. NJLSysDataList sysDataList;
  1927. getSysData (csep, sysDataList, SYSCONSTRAINT_TABLE);
  1928. vector<ColumnResult*>::const_iterator it;
  1929. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  1930. {
  1931. if ((*it)->ColumnOID() == oid)
  1932. {
  1933. if (fIdentity == EC)
  1934. rid = (*it)->GetRid(0);
  1935. return rid;
  1936. }
  1937. }
  1938. string msg("CalpontSystemCatalog::constraintRID: no RID found for ");
  1939. msg += constraintName;
  1940. throw runtime_error(msg);
  1941. }
  1942. const CalpontSystemCatalog::RIDList CalpontSystemCatalog::constraintColRID(const std::string constraintName)
  1943. {
  1944. DEBUG << "Enter constraintColRID: " << constraintName << endl;
  1945. /* SQL statement: select constraintname from sysconstraintcol where constraintname=constraintName;
  1946. */
  1947. RIDList ridlist;
  1948. string aConstraintName = constraintName;
  1949. transform( aConstraintName.begin(), aConstraintName.end(), aConstraintName.begin(), to_lower() );
  1950. CalpontSelectExecutionPlan csep;
  1951. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  1952. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  1953. CalpontSelectExecutionPlan::ColumnMap colMap;
  1954. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+CONSTRAINTNAME_COL, fSessionID);
  1955. SRCP srcp;
  1956. srcp.reset(c1);
  1957. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+CONSTRAINTNAME_COL, srcp));
  1958. csep.columnMapNonStatic(colMap);
  1959. srcp.reset(c1->clone());
  1960. returnedColumnList.push_back(srcp);
  1961. csep.returnedCols(returnedColumnList);
  1962. OID oid = DICTOID_SYSCONSTRAINTCOL_CONSTRAINTNAME;
  1963. // Filters
  1964. SimpleFilter *f1 = new SimpleFilter (opeq,
  1965. c1->clone(),
  1966. new ConstantColumn(aConstraintName, ConstantColumn::LITERAL));
  1967. filterTokenList.push_back(f1);
  1968. csep.filterTokenList(filterTokenList);
  1969. NJLSysDataList sysDataList;
  1970. getSysData (csep, sysDataList, SYSCONSTRAINTCOL_TABLE);
  1971. vector<ColumnResult*>::const_iterator it;
  1972. CalpontSystemCatalog::ROPair ropair;
  1973. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  1974. {
  1975. if ((*it)->ColumnOID() == oid)
  1976. {
  1977. for (int i = 0; i < (*it)->dataCount(); i++)
  1978. {
  1979. if (fIdentity == EC)
  1980. {
  1981. ropair.rid = (*it)->GetRid(i);
  1982. ropair.objnum = 0;
  1983. }
  1984. ridlist.push_back(ropair);
  1985. }
  1986. return ridlist;
  1987. }
  1988. }
  1989. return ridlist;
  1990. }
  1991. const std::string CalpontSystemCatalog::colValueSysconstraintCol (const TableColName& tableColName)
  1992. {
  1993. /* SQL statement: select constraintname from sysconstraintcol where schema = schema and table=table and column=column;*/
  1994. TableColName aTableColName;
  1995. aTableColName.schema = tableColName.schema;
  1996. aTableColName.table = tableColName.table;
  1997. aTableColName.column = tableColName.column;
  1998. transform( aTableColName.schema.begin(), aTableColName.schema.end(), aTableColName.schema.begin(), to_lower() );
  1999. transform( aTableColName.table.begin(), aTableColName.table.end(), aTableColName.table.begin(), to_lower() );
  2000. transform( aTableColName.column.begin(), aTableColName.column.end(), aTableColName.column.begin(), to_lower() );
  2001. if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
  2002. DEBUG << "Enter colValueSysconstraintCol: " << tableColName.schema << "|"
  2003. << tableColName.table << "|"
  2004. << tableColName.column << endl;
  2005. CalpontSelectExecutionPlan csep;
  2006. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  2007. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  2008. CalpontSelectExecutionPlan::ColumnMap colMap;
  2009. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+CONSTRAINTNAME_COL, fSessionID);
  2010. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+SCHEMA_COL, fSessionID);
  2011. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+TABLENAME_COL, fSessionID);
  2012. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+COLNAME_COL, fSessionID);
  2013. SRCP srcp;
  2014. srcp.reset(c1);
  2015. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+CONSTRAINTNAME_COL, srcp));
  2016. srcp.reset(c2);
  2017. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+SCHEMA_COL, srcp));
  2018. srcp.reset(c3);
  2019. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+TABLENAME_COL, srcp));
  2020. srcp.reset(c4);
  2021. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+COLNAME_COL, srcp));
  2022. csep.columnMapNonStatic(colMap);
  2023. srcp.reset(c1->clone());
  2024. returnedColumnList.push_back(srcp);
  2025. csep.returnedCols(returnedColumnList);
  2026. OID oid = DICTOID_SYSCONSTRAINTCOL_CONSTRAINTNAME;
  2027. // Filters
  2028. SimpleFilter *f1 = new SimpleFilter (opeq,
  2029. c2->clone(),
  2030. new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
  2031. filterTokenList.push_back(f1);
  2032. filterTokenList.push_back(new Operator("and"));
  2033. SimpleFilter *f2 = new SimpleFilter (opeq,
  2034. c3->clone(),
  2035. new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
  2036. filterTokenList.push_back(f2);
  2037. filterTokenList.push_back(new Operator("and"));
  2038. SimpleFilter *f3 = new SimpleFilter (opeq,
  2039. c4->clone(),
  2040. new ConstantColumn(aTableColName.column, ConstantColumn::LITERAL));
  2041. filterTokenList.push_back(f3);
  2042. csep.filterTokenList(filterTokenList);
  2043. NJLSysDataList sysDataList;
  2044. getSysData (csep, sysDataList, SYSCONSTRAINTCOL_TABLE);
  2045. vector<ColumnResult*>::const_iterator it;
  2046. string constraintname = "";
  2047. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  2048. {
  2049. if ((*it)->dataCount() == 0)
  2050. return constraintname;
  2051. if ((*it)->ColumnOID() == oid)
  2052. return (*it)->GetStringData(0);
  2053. }
  2054. return constraintname;
  2055. }
  2056. const CalpontSystemCatalog::RIDList CalpontSystemCatalog::constraintColRIDs(const TableName& tableName)
  2057. {
  2058. /* SQL statement: select constraintname from sysconstraintcol where schema=tableColName.schema and
  2059. * tablename=tableColName.table;
  2060. */
  2061. RIDList ridlist;
  2062. TableColName aTableColName;
  2063. aTableColName.schema = tableName.schema;
  2064. aTableColName.table = tableName.table;
  2065. transform( aTableColName.schema.begin(), aTableColName.schema.end(), aTableColName.schema.begin(), to_lower() );
  2066. transform( aTableColName.table.begin(), aTableColName.table.end(), aTableColName.table.begin(), to_lower() );
  2067. if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
  2068. DEBUG << "Enter constraintColRIDs: " << tableName.schema << "|"
  2069. << tableName.table << endl;
  2070. CalpontSelectExecutionPlan csep;
  2071. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  2072. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  2073. CalpontSelectExecutionPlan::ColumnMap colMap;
  2074. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+CONSTRAINTNAME_COL, fSessionID);
  2075. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+SCHEMA_COL, fSessionID);
  2076. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+TABLENAME_COL, fSessionID);
  2077. SRCP srcp;
  2078. srcp.reset(c1);
  2079. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+CONSTRAINTNAME_COL, srcp));
  2080. srcp.reset(c2);
  2081. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+SCHEMA_COL, srcp));
  2082. srcp.reset(c3);
  2083. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+TABLENAME_COL, srcp));
  2084. csep.columnMapNonStatic(colMap);
  2085. srcp.reset(c1->clone());
  2086. returnedColumnList.push_back(srcp);
  2087. csep.returnedCols(returnedColumnList);
  2088. OID oid = DICTOID_SYSCONSTRAINTCOL_CONSTRAINTNAME;
  2089. // Filters
  2090. SimpleFilter *f1 = new SimpleFilter (opeq,
  2091. c2->clone(),
  2092. new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
  2093. filterTokenList.push_back(f1);
  2094. filterTokenList.push_back(new Operator("and"));
  2095. SimpleFilter *f2 = new SimpleFilter (opeq,
  2096. c3->clone(),
  2097. new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
  2098. filterTokenList.push_back(f2);
  2099. csep.filterTokenList(filterTokenList);
  2100. NJLSysDataList sysDataList;
  2101. getSysData (csep, sysDataList, SYSCONSTRAINTCOL_TABLE);
  2102. vector<ColumnResult*>::const_iterator it;
  2103. ROPair rid;
  2104. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  2105. {
  2106. if ((*it)->ColumnOID() == oid)
  2107. {
  2108. for (int i = 0; i < (*it)->dataCount(); i++)
  2109. {
  2110. if (fIdentity == EC)
  2111. rid.rid = (*it)->GetRid(i);
  2112. ridlist.push_back(rid);
  2113. }
  2114. return ridlist;
  2115. }
  2116. }
  2117. return ridlist;
  2118. }
  2119. const CalpontSystemCatalog::RID CalpontSystemCatalog::constraintColRID(const TableColName& tableColName)
  2120. {
  2121. /* SQL statement: select constraintname from sysconstraintcol where schema=tableColName.schema and
  2122. * tablename=tableColName.table and columnname=tableColName.column;
  2123. */
  2124. RID rid = 0;
  2125. TableColName aTableColName;
  2126. aTableColName.schema = tableColName.schema;
  2127. aTableColName.table = tableColName.table;
  2128. aTableColName.column = tableColName.column;
  2129. transform( aTableColName.schema.begin(), aTableColName.schema.end(), aTableColName.schema.begin(), to_lower() );
  2130. transform( aTableColName.table.begin(), aTableColName.table.end(), aTableColName.table.begin(), to_lower() );
  2131. transform( aTableColName.column.begin(), aTableColName.column.end(), aTableColName.column.begin(), to_lower() );
  2132. if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
  2133. DEBUG << "Enter constraintColRID: " << tableColName.schema << "|"
  2134. << tableColName.table << "|"
  2135. << tableColName.column << "(note: rowid not fully implemented)" << endl;
  2136. CalpontSelectExecutionPlan csep;
  2137. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  2138. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  2139. CalpontSelectExecutionPlan::ColumnMap colMap;
  2140. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+CONSTRAINTNAME_COL, fSessionID);
  2141. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+SCHEMA_COL, fSessionID);
  2142. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+TABLENAME_COL, fSessionID);
  2143. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+COLNAME_COL, fSessionID);
  2144. SRCP srcp;
  2145. srcp.reset(c1);
  2146. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+CONSTRAINTNAME_COL, srcp));
  2147. srcp.reset(c2);
  2148. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+SCHEMA_COL, srcp));
  2149. srcp.reset(c3);
  2150. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+TABLENAME_COL, srcp));
  2151. srcp.reset(c4);
  2152. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+COLNAME_COL, srcp));
  2153. csep.columnMapNonStatic(colMap);
  2154. srcp.reset(c1->clone());
  2155. returnedColumnList.push_back(srcp);
  2156. csep.returnedCols(returnedColumnList);
  2157. OID oid = DICTOID_SYSCONSTRAINTCOL_CONSTRAINTNAME;
  2158. // Filters
  2159. SimpleFilter *f1 = new SimpleFilter (opeq,
  2160. c2->clone(),
  2161. new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
  2162. filterTokenList.push_back(f1);
  2163. filterTokenList.push_back(new Operator("and"));
  2164. SimpleFilter *f2 = new SimpleFilter (opeq,
  2165. c3->clone(),
  2166. new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
  2167. filterTokenList.push_back(f2);
  2168. filterTokenList.push_back(new Operator("and"));
  2169. SimpleFilter *f3 = new SimpleFilter (opeq,
  2170. c4->clone(),
  2171. new ConstantColumn(aTableColName.column, ConstantColumn::LITERAL));
  2172. filterTokenList.push_back(f3);
  2173. csep.filterTokenList(filterTokenList);
  2174. NJLSysDataList sysDataList;
  2175. getSysData (csep, sysDataList, SYSCONSTRAINTCOL_TABLE);
  2176. vector<ColumnResult*>::const_iterator it;
  2177. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  2178. {
  2179. if ((*it)->ColumnOID() == oid)
  2180. {
  2181. if (fIdentity == EC)
  2182. rid = (*it)->GetRid(0);
  2183. return rid;
  2184. }
  2185. }
  2186. return std::numeric_limits<RID>::max();
  2187. }
  2188. #endif
  2189. const vector< pair<CalpontSystemCatalog::OID, CalpontSystemCatalog::TableName> > CalpontSystemCatalog::getTables (const std::string schema)
  2190. {
  2191. string schemaname = schema;
  2192. vector < pair<OID, TableName> > tables;
  2193. transform( schemaname.begin(), schemaname.end(), schemaname.begin(), to_lower() );
  2194. if (schemaname == CALPONT_SCHEMA)
  2195. {
  2196. // systables
  2197. tables.push_back( make_pair(SYSTABLE_BASE, make_table(CALPONT_SCHEMA, SYSTABLE_TABLE)));
  2198. tables.push_back( make_pair(SYSCOLUMN_BASE, make_table(CALPONT_SCHEMA, SYSCOLUMN_TABLE)));
  2199. return tables;
  2200. }
  2201. DEBUG << "Enter getTables" << endl;
  2202. // SQL statement: select tablename from systable where schemaname = schema;
  2203. CalpontSelectExecutionPlan csep;
  2204. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  2205. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  2206. CalpontSelectExecutionPlan::ColumnMap colMap;
  2207. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+TABLENAME_COL, fSessionID);
  2208. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+SCHEMA_COL, fSessionID);
  2209. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+OBJECTID_COL, fSessionID);
  2210. SRCP srcp;
  2211. srcp.reset(c1);
  2212. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+TABLENAME_COL, srcp));
  2213. srcp.reset(c2);
  2214. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+SCHEMA_COL, srcp));
  2215. srcp.reset(c3);
  2216. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+OBJECTID_COL, srcp));
  2217. csep.columnMapNonStatic(colMap);
  2218. srcp.reset(c1->clone());
  2219. returnedColumnList.push_back(srcp);
  2220. srcp.reset(c2->clone());
  2221. returnedColumnList.push_back(srcp);
  2222. csep.returnedCols(returnedColumnList);
  2223. OID oid1 = DICTOID_SYSTABLE_TABLENAME;
  2224. OID oid2 = DICTOID_SYSTABLE_SCHEMA;
  2225. if (!schema.empty())
  2226. {
  2227. // Filters
  2228. SimpleFilter *f1 = new SimpleFilter (opeq,
  2229. c2->clone(),
  2230. new ConstantColumn(schemaname, ConstantColumn::LITERAL));
  2231. filterTokenList.push_back(f1);
  2232. csep.filterTokenList(filterTokenList);
  2233. }
  2234. NJLSysDataList sysDataList;
  2235. getSysData (csep, sysDataList, SYSTABLE_TABLE);
  2236. vector<ColumnResult*>::const_iterator it;
  2237. vector<string> tnl;
  2238. ROPair rp;
  2239. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  2240. {
  2241. if ((*it)->ColumnOID() == oid1)
  2242. {
  2243. for (int i = 0; i < (*it)->dataCount(); i++)
  2244. {
  2245. tables.push_back( make_pair(0, make_table("", (*it)->GetStringData(i))));
  2246. tnl.push_back((*it)->GetStringData(i));
  2247. }
  2248. }
  2249. }
  2250. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  2251. {
  2252. if ((*it)->ColumnOID() == oid2)
  2253. {
  2254. for (int i = 0; i < (*it)->dataCount(); i++)
  2255. tables[i].second.schema = (*it)->GetStringData(i);
  2256. }
  2257. }
  2258. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  2259. {
  2260. if ((*it)->ColumnOID() == c3->oid())
  2261. {
  2262. for (int i = 0; i < (*it)->dataCount(); i++)
  2263. {
  2264. rp.objnum = (OID)((*it)->GetData(i));
  2265. if (fIdentity == EC)
  2266. rp.rid = (*it)->GetRid(i);
  2267. fTablemap[tables[i].second] = rp.objnum;
  2268. fTableRIDmap[tables[i].second] = rp.rid;
  2269. tables[i].first = rp.objnum;
  2270. }
  2271. }
  2272. }
  2273. return tables;
  2274. }
  2275. /* SQL statement: select objectid from systable */
  2276. const int CalpontSystemCatalog::getTableCount ()
  2277. {
  2278. int tableCnt = 0;
  2279. DEBUG << "Enter getTableCount" << endl;
  2280. CalpontSelectExecutionPlan csep;
  2281. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  2282. CalpontSelectExecutionPlan::ColumnMap colMap;
  2283. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+OBJECTID_COL, fSessionID);
  2284. SRCP srcp;
  2285. srcp.reset(c1);
  2286. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+OBJECTID_COL, srcp));
  2287. csep.columnMapNonStatic(colMap);
  2288. srcp.reset(c1->clone());
  2289. returnedColumnList.push_back(srcp);
  2290. csep.returnedCols(returnedColumnList);
  2291. OID oid1 = OID_SYSTABLE_OBJECTID;
  2292. NJLSysDataList sysDataList;
  2293. getSysData (csep, sysDataList, SYSTABLE_TABLE);
  2294. vector<ColumnResult*>::const_iterator it;
  2295. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  2296. {
  2297. if ((*it)->ColumnOID() == oid1)
  2298. {
  2299. tableCnt = (*it)->dataCount();
  2300. }
  2301. }
  2302. return tableCnt;
  2303. }
  2304. /* SQL statement: select objectid from syscolumn where schema=tableColName.schema and
  2305. * tablename=tableColName.table and columnname=tableColName.column;*/
  2306. const CalpontSystemCatalog::ROPair CalpontSystemCatalog::columnRID(const TableColName& tableColName)
  2307. {
  2308. ROPair rp;
  2309. TableColName aTableColName;
  2310. aTableColName.schema = tableColName.schema;
  2311. aTableColName.table = tableColName.table;
  2312. aTableColName.column = tableColName.column;
  2313. transform( aTableColName.schema.begin(), aTableColName.schema.end(), aTableColName.schema.begin(), to_lower() );
  2314. transform( aTableColName.table.begin(), aTableColName.table.end(), aTableColName.table.begin(), to_lower() );
  2315. transform( aTableColName.column.begin(), aTableColName.column.end(), aTableColName.column.begin(), to_lower() );
  2316. if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
  2317. DEBUG << "Enter columnRID: " << tableColName.schema << "|" << tableColName.table
  2318. << "|" << tableColName.column << endl;
  2319. //Check whether cache needs to be flushed
  2320. if ( aTableColName.schema.compare(CALPONT_SCHEMA) ) {
  2321. checkSysCatVer();
  2322. }
  2323. /* SQL statement: select objectid from syscolumn where schema=tableColName.schema and
  2324. tablename=tableColName.table and columnname=tableColName.column;*/
  2325. // this function is duplicate to lookupOID() and will be deprecated soon
  2326. rp.objnum = lookupOID(tableColName);
  2327. boost::mutex::scoped_lock lk2(fOIDmapLock);
  2328. ColRIDmap::const_iterator iter = fColRIDmap.find(aTableColName);
  2329. if (iter != fColRIDmap.end())
  2330. rp.rid = (*iter).second;
  2331. return rp;
  2332. }
  2333. const CalpontSystemCatalog::RIDList CalpontSystemCatalog::columnRIDs(const TableName& tableName, bool useCache)
  2334. {
  2335. TableName aTableName(tableName);
  2336. transform( aTableName.schema.begin(), aTableName.schema.end(), aTableName.schema.begin(), to_lower() );
  2337. transform( aTableName.table.begin(), aTableName.table.end(), aTableName.table.begin(), to_lower() );
  2338. if (aTableName.schema.empty() || aTableName.table.empty())
  2339. throw runtime_error("ColumnRIDs: Invalid table name");
  2340. if (aTableName.schema != CALPONT_SCHEMA)
  2341. DEBUG << "Enter columnRIDs: " << tableName.schema << "|" << tableName.table << endl;
  2342. RIDList rl;
  2343. //Check whether cache needs to be flushed
  2344. if ( aTableName.schema != CALPONT_SCHEMA) {
  2345. checkSysCatVer();
  2346. }
  2347. boost::mutex::scoped_lock lk1(fTableInfoMapLock);
  2348. TableInfoMap::const_iterator ti_iter = fTableInfoMap.find(aTableName);
  2349. // search fOIDmap for system catalog tables
  2350. // or if fTableInfoMap has entry for this table, column oids are cached.
  2351. // because columnRIDs(), colType() and tableInfo() are actually binded.
  2352. #if BOOST_VERSION < 103800
  2353. boost::mutex::scoped_lock lk2(fOIDmapLock, false);
  2354. #else
  2355. boost::mutex::scoped_lock lk2(fOIDmapLock, boost::defer_lock);
  2356. #endif
  2357. boost::mutex::scoped_lock lk3(fColinfomapLock);
  2358. if (aTableName.schema == CALPONT_SCHEMA || (useCache && ti_iter != fTableInfoMap.end()))
  2359. {
  2360. if (aTableName.schema == CALPONT_SCHEMA)
  2361. lk3.unlock();
  2362. else
  2363. rl.resize(ti_iter->second.numOfCols);
  2364. lk2.lock();
  2365. if (aTableName.schema != CALPONT_SCHEMA)
  2366. DEBUG << "for " << aTableName << ", searching " << fOIDmap.size() << " oids" << endl;
  2367. OIDmap::const_iterator iter = fOIDmap.begin();
  2368. while ( iter != fOIDmap.end() )
  2369. {
  2370. TableColName tableColName = (*iter).first;
  2371. if ( tableColName.schema == aTableName.schema
  2372. && tableColName.table == aTableName.table )
  2373. {
  2374. ROPair rp;
  2375. rp.objnum = (*iter).second;
  2376. ColRIDmap::const_iterator rid_iter = fColRIDmap.find(tableColName);
  2377. if (rid_iter != fColRIDmap.end())
  2378. rp.rid = (*rid_iter).second;
  2379. // @bug 1584. make sure the columns are in position order
  2380. if (aTableName.schema == CALPONT_SCHEMA)
  2381. {
  2382. rl.push_back(rp);
  2383. }
  2384. else
  2385. {
  2386. Colinfomap::const_iterator ct_iter = fColinfomap.find(rp.objnum);
  2387. rl[ct_iter->second.colPosition] = rp;
  2388. }
  2389. }
  2390. ++iter;
  2391. }
  2392. if (aTableName.schema != CALPONT_SCHEMA)
  2393. DEBUG << aTableName << " was cached: " << rl.size() << " rows" << endl;
  2394. return rl;
  2395. }
  2396. lk1.unlock();
  2397. lk3.unlock();
  2398. if (aTableName.schema != CALPONT_SCHEMA)
  2399. DEBUG << aTableName << " was not cached, fetching..." << endl;
  2400. // get real data from system catalog for all user tables. don't check cache
  2401. // because cache may not have complete columns for this table
  2402. // SQL statement: select objectid,columnname from syscolumn where schema=tableName.schema and
  2403. // tablename=tableName.table;
  2404. CalpontSelectExecutionPlan csep;
  2405. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  2406. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  2407. CalpontSelectExecutionPlan::ColumnMap colMap;
  2408. string columnlength = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COLUMNLEN_COL;
  2409. string objectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+OBJECTID_COL;
  2410. string datatype = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+DATATYPE_COL;
  2411. string dictobjectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+DICTOID_COL;
  2412. string listobjectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+LISTOBJID_COL;
  2413. string treeobjectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TREEOBJID_COL;
  2414. string columnposition = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COLUMNPOS_COL;
  2415. string scale = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+SCALE_COL;
  2416. string precision = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+PRECISION_COL;
  2417. string defaultvalue = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+DEFAULTVAL_COL;
  2418. // the following columns will be save in cache although it's not needed for now
  2419. string columnname = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COLNAME_COL;
  2420. string tablename = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TABLENAME_COL;
  2421. string schemaname = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+SCHEMA_COL;
  2422. string nullable = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+NULLABLE_COL;
  2423. string compressiontype = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COMPRESSIONTYPE_COL;
  2424. string autoIncrement = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+AUTOINC_COL;
  2425. string nextVal = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+NEXTVALUE_COL;
  2426. SimpleColumn* col[17];
  2427. col[0] = new SimpleColumn(columnlength, fSessionID);
  2428. col[1] = new SimpleColumn(objectid, fSessionID);
  2429. col[2] = new SimpleColumn(datatype, fSessionID);
  2430. col[3] = new SimpleColumn(dictobjectid, fSessionID);
  2431. col[4] = new SimpleColumn(listobjectid, fSessionID);
  2432. col[5] = new SimpleColumn(treeobjectid, fSessionID);
  2433. col[6] = new SimpleColumn(columnposition, fSessionID);
  2434. col[7] = new SimpleColumn(scale, fSessionID);
  2435. col[8] = new SimpleColumn(precision, fSessionID);
  2436. col[9] = new SimpleColumn(defaultvalue, fSessionID);
  2437. col[10] = new SimpleColumn(schemaname, fSessionID);
  2438. col[11] = new SimpleColumn(tablename, fSessionID);
  2439. col[12] = new SimpleColumn(columnname, fSessionID);
  2440. col[13] = new SimpleColumn(nullable, fSessionID);
  2441. col[14] = new SimpleColumn(compressiontype, fSessionID);
  2442. col[15] = new SimpleColumn(autoIncrement, fSessionID);
  2443. col[16] = new SimpleColumn(nextVal, fSessionID);
  2444. SRCP srcp;
  2445. srcp.reset(col[0]);
  2446. colMap.insert(CMVT_(columnlength, srcp));
  2447. srcp.reset(col[1]);
  2448. colMap.insert(CMVT_(objectid, srcp));
  2449. srcp.reset(col[2]);
  2450. colMap.insert(CMVT_(datatype, srcp));
  2451. srcp.reset(col[3]);
  2452. colMap.insert(CMVT_(dictobjectid, srcp));
  2453. srcp.reset(col[4]);
  2454. colMap.insert(CMVT_(listobjectid, srcp));
  2455. srcp.reset(col[5]);
  2456. colMap.insert(CMVT_(treeobjectid, srcp));
  2457. srcp.reset(col[6]);
  2458. colMap.insert(CMVT_(columnposition, srcp));
  2459. srcp.reset(col[7]);
  2460. colMap.insert(CMVT_(scale, srcp));
  2461. srcp.reset(col[8]);
  2462. colMap.insert(CMVT_(precision, srcp));
  2463. srcp.reset(col[9]);
  2464. colMap.insert(CMVT_(defaultvalue, srcp));
  2465. srcp.reset(col[10]);
  2466. colMap.insert(CMVT_(schemaname, srcp));
  2467. srcp.reset(col[11]);
  2468. colMap.insert(CMVT_(tablename, srcp));
  2469. srcp.reset(col[12]);
  2470. colMap.insert(CMVT_(columnname, srcp));
  2471. srcp.reset(col[13]);
  2472. colMap.insert(CMVT_(nullable, srcp));
  2473. srcp.reset(col[14]);
  2474. colMap.insert(CMVT_(compressiontype, srcp));
  2475. srcp.reset(col[15]);
  2476. colMap.insert(CMVT_(autoIncrement, srcp));
  2477. srcp.reset(col[16]);
  2478. colMap.insert(CMVT_(nextVal, srcp));
  2479. csep.columnMapNonStatic(colMap);
  2480. srcp.reset(col[1]->clone());
  2481. returnedColumnList.push_back(srcp);
  2482. csep.returnedCols(returnedColumnList);
  2483. OID oid[17];
  2484. for (int i = 0; i < 17; i++)
  2485. oid[i] = col[i]->oid();
  2486. oid[12] = DICTOID_SYSCOLUMN_COLNAME;
  2487. // Filters
  2488. SimpleFilter *f1 = new SimpleFilter (opeq,
  2489. col[10]->clone(),
  2490. new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
  2491. filterTokenList.push_back(f1);
  2492. filterTokenList.push_back(new Operator("and"));
  2493. SimpleFilter *f2 = new SimpleFilter (opeq,
  2494. col[11]->clone(),
  2495. new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
  2496. filterTokenList.push_back(f2);
  2497. csep.filterTokenList(filterTokenList);
  2498. ostringstream oss;
  2499. oss << "select objectid,columnname from syscolumn where schema='" << aTableName.schema << "' and tablename='" <<
  2500. aTableName.table << "' --columnRIDs/";
  2501. if (fIdentity == EC) oss << "EC";
  2502. else oss << "FE";
  2503. csep.data(oss.str());
  2504. NJLSysDataList sysDataList;
  2505. getSysData (csep, sysDataList, SYSCOLUMN_TABLE);
  2506. vector<ColumnResult*>::const_iterator it;
  2507. ColType ct;
  2508. ColType *ctList = NULL;
  2509. TableInfo ti;
  2510. ti.tablewithautoincr = NO_AUTOINCRCOL;
  2511. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  2512. {
  2513. if ((*it)->ColumnOID() == oid[1]) // objectid
  2514. {
  2515. DEBUG << "column count: " << (*it)->dataCount() << endl;
  2516. // populate tableinfo cache for numOfCols
  2517. ti.numOfCols = (*it)->dataCount();
  2518. // ti.tablewithautoincr = NO_AUTOINCRCOL;
  2519. ctList = new ColType[ti.numOfCols];
  2520. for (int i = 0 ; i < (*it)->dataCount(); i++)
  2521. {
  2522. ROPair rp;
  2523. // rp.rid = -1;
  2524. rp.objnum = (*it)->GetData(i);
  2525. if (fIdentity == EC)
  2526. rp.rid = (*it)->GetRid(i);
  2527. DEBUG << rp.rid << " ";
  2528. rl.push_back(rp);
  2529. ColType ct;
  2530. ct.columnOID = rp.objnum;
  2531. ctList[i] = ct;
  2532. }
  2533. DEBUG << endl;
  2534. }
  2535. else if ((*it)->ColumnOID() == oid[15]) //autoincrement
  2536. {
  2537. for (int i = 0 ; i < (*it)->dataCount(); i++)
  2538. {
  2539. ostringstream os;
  2540. os << (char) (*it)->GetData(i);
  2541. if (os.str().compare("y") == 0)
  2542. {
  2543. ti.tablewithautoincr = AUTOINCRCOL;
  2544. break;
  2545. }
  2546. }
  2547. }
  2548. lk1.lock();
  2549. fTableInfoMap[aTableName] = ti;
  2550. lk1.unlock();
  2551. }
  2552. // loop 2nd time to make sure rl has been populated.
  2553. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  2554. {
  2555. if ((*it)->ColumnOID() == oid[12])
  2556. {
  2557. lk2.lock();
  2558. for (int i = 0; i < (*it)->dataCount(); i++)
  2559. {
  2560. TableColName tcn = make_tcn(aTableName.schema, aTableName.table, (*it)->GetStringData(i));
  2561. fOIDmap[tcn] = rl[i].objnum;
  2562. if (fIdentity == EC)
  2563. fColRIDmap[tcn] = rl[i].rid;
  2564. }
  2565. lk2.unlock();
  2566. }
  2567. else if ((*it)->ColumnOID() == oid[0])
  2568. {
  2569. for (int i = 0; i < (*it)->dataCount(); i++)
  2570. ctList[i].colWidth = (*it)->GetData(i);
  2571. }
  2572. else if ((*it)->ColumnOID() == oid[2])
  2573. {
  2574. for (int i = 0; i < (*it)->dataCount(); i++)
  2575. ctList[i].colDataType = (ColDataType)((*it)->GetData(i));
  2576. }
  2577. else if ((*it)->ColumnOID() == oid[3])
  2578. {
  2579. for (int i = 0; i < (*it)->dataCount(); i++)
  2580. ctList[i].ddn.dictOID = ((*it)->GetData(i));
  2581. }
  2582. else if ((*it)->ColumnOID() == oid[4])
  2583. {
  2584. for (int i = 0; i < (*it)->dataCount(); i++)
  2585. ctList[i].ddn.listOID = ((*it)->GetData(i));
  2586. }
  2587. else if ((*it)->ColumnOID() == oid[5])
  2588. {
  2589. for (int i = 0; i < (*it)->dataCount(); i++)
  2590. ctList[i].ddn.treeOID = ((*it)->GetData(i));
  2591. }
  2592. else if ((*it)->ColumnOID() == oid[6])
  2593. {
  2594. for (int i = 0; i < (*it)->dataCount(); i++)
  2595. ctList[i].colPosition = ((*it)->GetData(i));
  2596. }
  2597. else if ((*it)->ColumnOID() == oid[7])
  2598. {
  2599. for (int i = 0; i < (*it)->dataCount(); i++)
  2600. ctList[i].scale = ((*it)->GetData(i));
  2601. }
  2602. else if ((*it)->ColumnOID() == oid[8])
  2603. {
  2604. for (int i = 0; i < (*it)->dataCount(); i++)
  2605. ctList[i].precision = ((*it)->GetData(i));
  2606. }
  2607. // TODO: check datatype to call GetData() or GetStringData()
  2608. else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_DEFAULTVAL)
  2609. {
  2610. for (int i = 0; i < (*it)->dataCount(); i++)
  2611. {
  2612. ctList[i].defaultValue = ((*it)->GetStringData(i));
  2613. if ((!ctList[i].defaultValue.empty()) || (ctList[i].defaultValue.length() > 0))
  2614. {
  2615. if (ctList[i].constraintType != NOTNULL_CONSTRAINT)
  2616. ctList[i].constraintType = DEFAULT_CONSTRAINT;
  2617. }
  2618. }
  2619. }
  2620. else if ((*it)->ColumnOID() == oid[13])
  2621. {
  2622. for (int i = 0; i < (*it)->dataCount(); i++)
  2623. if ((*it)->GetData(i) == 0)
  2624. ctList[i].constraintType = NOTNULL_CONSTRAINT;
  2625. }
  2626. else if ((*it)->ColumnOID() == oid[14])
  2627. {
  2628. for (int i = 0; i < (*it)->dataCount(); i++)
  2629. ctList[i].compressionType = ctList[i].ddn.compressionType = ((*it)->GetData(i));
  2630. }
  2631. else if ((*it)->ColumnOID() == oid[15])
  2632. {
  2633. for (int i = 0; i < (*it)->dataCount(); i++)
  2634. {
  2635. ostringstream os;
  2636. os << (char) (*it)->GetData(i);
  2637. if (os.str().compare("y") == 0)
  2638. ctList[i].autoincrement = true;
  2639. else
  2640. ctList[i].autoincrement = false;
  2641. }
  2642. }
  2643. else if ((*it)->ColumnOID() == oid[16])
  2644. {
  2645. for (int i = 0; i < (*it)->dataCount(); i++)
  2646. ctList[i].nextvalue = ((*it)->GetData(i));
  2647. }
  2648. }
  2649. // populate colinfo cache
  2650. lk3.lock();
  2651. for (int i = 0; i < ti.numOfCols; i++)
  2652. fColinfomap[ctList[i].columnOID] = ctList[i];
  2653. lk3.unlock();
  2654. delete [] ctList;
  2655. // delete col[9];
  2656. if (rl.size() != 0)
  2657. {
  2658. return rl;
  2659. }
  2660. Message::Args args;
  2661. args.add("'" + tableName.schema + "." + tableName.table + "'");
  2662. throw IDBExcept(ERR_TABLE_NOT_IN_CATALOG, args);
  2663. }
  2664. const CalpontSystemCatalog::TableName CalpontSystemCatalog::tableName(const OID& tableoid)
  2665. {
  2666. //Check whether cache needs to be flushed
  2667. if ( tableoid >= 3000)
  2668. {
  2669. checkSysCatVer();
  2670. }
  2671. // check cache
  2672. boost::mutex::scoped_lock lk(fTableNameMapLock);
  2673. if ( fTableNameMap.size() > 0 )
  2674. {
  2675. TableNameMap::const_iterator iter = fTableNameMap.find(tableoid);
  2676. if (iter != fTableNameMap.end())
  2677. return iter->second;
  2678. }
  2679. lk.unlock();
  2680. //select schema, tablename from systable where objectid = tableoid
  2681. TableName tableName;
  2682. CalpontSelectExecutionPlan csep;
  2683. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  2684. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  2685. CalpontSelectExecutionPlan::ColumnMap colMap;
  2686. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+OBJECTID_COL, fSessionID);
  2687. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+SCHEMA_COL, fSessionID);
  2688. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+TABLENAME_COL, fSessionID);
  2689. SRCP srcp;
  2690. srcp.reset(c1);
  2691. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+OBJECTID_COL, srcp));
  2692. srcp.reset(c2);
  2693. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+SCHEMA_COL, srcp));
  2694. srcp.reset(c3);
  2695. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+TABLENAME_COL, srcp));
  2696. csep.columnMapNonStatic(colMap);
  2697. srcp.reset(c2->clone());
  2698. returnedColumnList.push_back(srcp);
  2699. srcp.reset(c3->clone());
  2700. returnedColumnList.push_back(srcp);
  2701. csep.returnedCols(returnedColumnList);
  2702. OID oid2 = DICTOID_SYSTABLE_SCHEMA;
  2703. OID oid3 = DICTOID_SYSTABLE_TABLENAME;
  2704. // Filters
  2705. SimpleFilter *f1 = new SimpleFilter (opeq,
  2706. c1->clone(),
  2707. new ConstantColumn((int64_t)tableoid, ConstantColumn::NUM));
  2708. filterTokenList.push_back(f1);
  2709. csep.filterTokenList(filterTokenList);
  2710. ostringstream oss;
  2711. oss << "select schema,tablename,columnname from syscolumn where objectid=" << tableoid <<
  2712. " --colName/";
  2713. if (fIdentity == EC) oss << "EC";
  2714. else oss << "FE";
  2715. csep.data(oss.str());
  2716. NJLSysDataList sysDataList;
  2717. try {
  2718. getSysData (csep, sysDataList, SYSTABLE_TABLE);
  2719. }
  2720. catch (runtime_error& e)
  2721. {
  2722. throw runtime_error ( e.what() );
  2723. }
  2724. vector<ColumnResult*>::const_iterator it;
  2725. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  2726. {
  2727. if ((*it)->dataCount() == 0)
  2728. {
  2729. Message::Args args;
  2730. oss <<tableoid;
  2731. args.add("'" + oss.str() + "'");
  2732. throw IDBExcept(ERR_TABLE_NOT_IN_CATALOG, args);
  2733. }
  2734. if ((*it)->ColumnOID() == oid2)
  2735. tableName.schema = (*it)->GetStringData(0);
  2736. else if ((*it)->ColumnOID() == oid3)
  2737. tableName.table = (*it)->GetStringData(0);
  2738. }
  2739. //@Bug 2682. datacount 0 sometimes does not mean the table is not found.
  2740. if ( (tableName.schema.length() == 0) || (tableName.table.length() == 0) )
  2741. {
  2742. Message::Args args;
  2743. oss <<tableoid;
  2744. args.add("'" + oss.str() + "'");
  2745. throw IDBExcept(ERR_TABLE_NOT_IN_CATALOG, args);
  2746. }
  2747. // populate cache
  2748. lk.lock();
  2749. fTableNameMap[tableoid] = tableName;
  2750. lk.unlock();
  2751. return tableName;
  2752. }
  2753. const CalpontSystemCatalog::ROPair CalpontSystemCatalog::tableRID(const TableName& tableName)
  2754. {
  2755. TableName aTableName;
  2756. aTableName.schema = tableName.schema;
  2757. aTableName.table = tableName.table;
  2758. transform( aTableName.schema.begin(), aTableName.schema.end(), aTableName.schema.begin(), to_lower() );
  2759. transform( aTableName.table.begin(), aTableName.table.end(), aTableName.table.begin(), to_lower() );
  2760. if (aTableName.schema.compare(CALPONT_SCHEMA) != 0)
  2761. DEBUG << "Enter tableRID: " << tableName.schema << "|" << tableName.table << endl;
  2762. // look up cache first for system table and cached table
  2763. ROPair rp;
  2764. // rp.rid = -1; @bug1866 use default
  2765. // calpontsys only needs oid
  2766. boost::mutex::scoped_lock lk1(fTableInfoMapLock);
  2767. Tablemap::const_iterator iter = fTablemap.find(aTableName);
  2768. if (aTableName.schema.compare("calpontsys") == 0 && iter != fTablemap.end() )
  2769. {
  2770. rp.objnum = (*iter).second;
  2771. return rp;
  2772. }
  2773. lk1.unlock();
  2774. checkSysCatVer();
  2775. lk1.lock();
  2776. iter = fTablemap.find(aTableName);
  2777. TableRIDmap::const_iterator rid_iter = fTableRIDmap.find(aTableName);
  2778. if (iter != fTablemap.end() && rid_iter != fTableRIDmap.end())
  2779. {
  2780. rp.objnum = (*iter).second;
  2781. rp.rid = (*rid_iter).second;
  2782. return rp;
  2783. }
  2784. lk1.unlock();
  2785. // select objectid from systable where schema = tableName.schema and tablename = tableName.table;
  2786. CalpontSelectExecutionPlan csep;
  2787. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  2788. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  2789. CalpontSelectExecutionPlan::ColumnMap colMap;
  2790. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+OBJECTID_COL, fSessionID);
  2791. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+SCHEMA_COL, fSessionID);
  2792. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+TABLENAME_COL, fSessionID);
  2793. SRCP srcp;
  2794. srcp.reset(c1);
  2795. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+OBJECTID_COL, srcp));
  2796. srcp.reset(c2);
  2797. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+SCHEMA_COL, srcp));
  2798. srcp.reset(c3);
  2799. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSTABLE_TABLE+"."+TABLENAME_COL, srcp));
  2800. csep.columnMapNonStatic(colMap);
  2801. srcp.reset(c1->clone());
  2802. returnedColumnList.push_back(srcp);
  2803. csep.returnedCols(returnedColumnList);
  2804. OID oid = c1->oid();
  2805. // Filters
  2806. SimpleFilter *f1 = new SimpleFilter (opeq,
  2807. c2->clone(),
  2808. new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
  2809. filterTokenList.push_back(f1);
  2810. filterTokenList.push_back(new Operator("and"));
  2811. SimpleFilter *f2 = new SimpleFilter (opeq,
  2812. c3->clone(),
  2813. new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
  2814. filterTokenList.push_back(f2);
  2815. csep.filterTokenList(filterTokenList);
  2816. ostringstream oss;
  2817. oss << "select objectid from systable where schema='" << aTableName.schema << "' and tablename='" <<
  2818. aTableName.table << "' --tableRID/";
  2819. csep.data(oss.str()); //@bug 6078. Log the statement
  2820. if (fIdentity == EC) oss << "EC";
  2821. else oss << "FE";
  2822. NJLSysDataList sysDataList;
  2823. try {
  2824. getSysData (csep, sysDataList, SYSTABLE_TABLE);
  2825. }
  2826. catch ( IDBExcept& ){
  2827. throw;
  2828. }
  2829. catch ( runtime_error& e ) {
  2830. throw runtime_error ( e.what() );
  2831. }
  2832. vector<ColumnResult*>::const_iterator it;
  2833. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  2834. {
  2835. if ((*it)->dataCount() == 0)
  2836. {
  2837. Message::Args args;
  2838. args.add("'" + tableName.schema + "." + tableName.table + "'");
  2839. //throw logging::NoTableExcept(msg);
  2840. throw IDBExcept(ERR_TABLE_NOT_IN_CATALOG, args);
  2841. }
  2842. if ((*it)->ColumnOID() == oid)
  2843. {
  2844. rp.objnum = (OID)((*it)->GetData(0));
  2845. if (fIdentity == EC) {
  2846. rp.rid = (*it)->GetRid(0);
  2847. }
  2848. // populate cache
  2849. lk1.lock();
  2850. fTablemap[aTableName] = rp.objnum;
  2851. fTableRIDmap[aTableName] = rp.rid;
  2852. return rp;
  2853. }
  2854. }
  2855. //string msg("CalpontSystemCatalog::tableRID: no OID found for ");
  2856. //msg += tableName.schema;
  2857. //msg += ".";
  2858. //msg += tableName.table;
  2859. Message::Args args;
  2860. args.add("'" + tableName.schema + "." + tableName.table + "'");
  2861. //throw logging::NoTableExcept(msg);
  2862. throw IDBExcept(ERR_TABLE_NOT_IN_CATALOG, args);
  2863. }
  2864. #if 0
  2865. const CalpontSystemCatalog::IndexNameList CalpontSystemCatalog::indexNames(const TableName& tableName)
  2866. {
  2867. DEBUG << "Enter indexNames: " << tableName.schema << "|" << tableName.table << endl;
  2868. IndexNameList indexlist;
  2869. TableName aTableName;
  2870. aTableName.schema = tableName.schema;
  2871. aTableName.table = tableName.table;
  2872. transform( aTableName.schema.begin(), aTableName.schema.end(), aTableName.schema.begin(), to_lower() );
  2873. transform( aTableName.table.begin(), aTableName.table.end(), aTableName.table.begin(), to_lower() );
  2874. /* SQL statement: select indexname from sysindex where schema=indexName.schema and
  2875. * tablename=indexName.table and indexname=indexName.index;
  2876. */
  2877. CalpontSelectExecutionPlan csep;
  2878. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  2879. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  2880. CalpontSelectExecutionPlan::ColumnMap colMap;
  2881. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+MULTICOLFLAG_COL, fSessionID);
  2882. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+SCHEMA_COL, fSessionID);
  2883. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+TABLENAME_COL, fSessionID);
  2884. SimpleColumn *c5 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+INDEXNAME_COL, fSessionID);
  2885. SRCP srcp;
  2886. srcp.reset(c2);
  2887. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+MULTICOLFLAG_COL, srcp));
  2888. srcp.reset(c3);
  2889. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+SCHEMA_COL, srcp));
  2890. srcp.reset(c4);
  2891. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+TABLENAME_COL, srcp));
  2892. srcp.reset(c5);
  2893. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+INDEXNAME_COL, srcp));
  2894. csep.columnMapNonStatic(colMap);
  2895. srcp.reset(c5->clone());
  2896. returnedColumnList.push_back(srcp);
  2897. srcp.reset(c2->clone());
  2898. returnedColumnList.push_back(srcp);
  2899. csep.returnedCols(returnedColumnList);
  2900. OID oid5 = DICTOID_SYSINDEX_INDEXNAME;
  2901. OID oid2 = c2->oid();
  2902. // Filters
  2903. SimpleFilter *f1 = new SimpleFilter (opeq,
  2904. c3->clone(),
  2905. new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
  2906. filterTokenList.push_back(f1);
  2907. filterTokenList.push_back(new Operator("and"));
  2908. SimpleFilter *f2 = new SimpleFilter (opeq,
  2909. c4->clone(),
  2910. new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
  2911. filterTokenList.push_back(f2);
  2912. csep.filterTokenList(filterTokenList);
  2913. NJLSysDataList sysDataList;
  2914. getSysData (csep, sysDataList, SYSINDEX_TABLE);
  2915. vector<ColumnResult*>::const_iterator it;
  2916. IndexName indexName;
  2917. indexName.schema = tableName.schema;
  2918. indexName.table = tableName.table;
  2919. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  2920. {
  2921. if ((*it)->ColumnOID() == oid5)
  2922. {
  2923. if (indexlist.size() != 0)
  2924. {
  2925. for (int i = 0; i < (*it)->dataCount(); i++)
  2926. indexlist[i].index = (*it)->GetStringData(i);
  2927. }
  2928. else
  2929. {
  2930. for (int i = 0; i < (*it)->dataCount(); i++)
  2931. {
  2932. indexName.index = (*it)->GetStringData(i);
  2933. indexlist.push_back(indexName);
  2934. }
  2935. }
  2936. }
  2937. else if ((*it)->ColumnOID() == oid2)
  2938. {
  2939. if (indexlist.size() != 0)
  2940. {
  2941. for (int i = 0; i < (*it)->dataCount(); i++)
  2942. indexlist[i].multiColFlag = ((*it)->GetData(i) == 't'? true : false);
  2943. }
  2944. else
  2945. {
  2946. for (int i = 0; i < (*it)->dataCount(); i++)
  2947. {
  2948. indexName.multiColFlag = ((*it)->GetData(i) == 't'? true : false);
  2949. indexlist.push_back(indexName);
  2950. }
  2951. }
  2952. }
  2953. }
  2954. return indexlist;
  2955. }
  2956. const CalpontSystemCatalog::TableColNameList CalpontSystemCatalog::indexColNames ( const IndexName& indexName)
  2957. {
  2958. DEBUG << "Enter indexColNames: " << indexName.schema << "|" << indexName.table << "|" << indexName.index << endl;
  2959. // not cached yet
  2960. CalpontSystemCatalog::TableColNameList tableColNameList;
  2961. IndexName aIndexName;
  2962. aIndexName.schema = indexName.schema;
  2963. aIndexName.table = indexName.table;
  2964. aIndexName.index = indexName.index;
  2965. transform( aIndexName.schema.begin(), aIndexName.schema.end(), aIndexName.schema.begin(), to_lower() );
  2966. transform( aIndexName.table.begin(), aIndexName.table.end(), aIndexName.table.begin(), to_lower() );
  2967. transform( aIndexName.index.begin(), aIndexName.index.end(), aIndexName.index.begin(), to_lower() );
  2968. /* SQL statement: select columnname, columnposition from sysindexcol where schema=indexname.schema and
  2969. * tablename=indexName.table and indexname=indexName.index;
  2970. */
  2971. CalpontSelectExecutionPlan csep;
  2972. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  2973. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  2974. CalpontSelectExecutionPlan::ColumnMap colMap;
  2975. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+COLNAME_COL, fSessionID);
  2976. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+COLUMNPOS_COL, fSessionID);
  2977. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+SCHEMA_COL, fSessionID);
  2978. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+TABLENAME_COL, fSessionID);
  2979. SimpleColumn *c5 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+INDEXNAME_COL, fSessionID);
  2980. SRCP srcp;
  2981. srcp.reset(c1);
  2982. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+COLNAME_COL, srcp));
  2983. srcp.reset(c2);
  2984. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+COLUMNPOS_COL, srcp));
  2985. srcp.reset(c3);
  2986. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+SCHEMA_COL, srcp));
  2987. srcp.reset(c4);
  2988. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+TABLENAME_COL, srcp));
  2989. srcp.reset(c5);
  2990. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+INDEXNAME_COL, srcp));
  2991. csep.columnMapNonStatic(colMap);
  2992. srcp.reset(c1->clone());
  2993. returnedColumnList.push_back(srcp);
  2994. srcp.reset(c2->clone());
  2995. returnedColumnList.push_back(srcp);
  2996. csep.returnedCols(returnedColumnList);
  2997. OID oid1 = DICTOID_SYSINDEXCOL_COLNAME;
  2998. OID oid2 = c2->oid();
  2999. // Filters
  3000. SimpleFilter *f1 = new SimpleFilter (opeq,
  3001. c3->clone(),
  3002. new ConstantColumn(aIndexName.schema, ConstantColumn::LITERAL));
  3003. filterTokenList.push_back(f1);
  3004. filterTokenList.push_back(new Operator("and"));
  3005. SimpleFilter *f2 = new SimpleFilter (opeq,
  3006. c4->clone(),
  3007. new ConstantColumn(aIndexName.table, ConstantColumn::LITERAL));
  3008. filterTokenList.push_back(f2);
  3009. filterTokenList.push_back(new Operator("and"));
  3010. SimpleFilter *f3 = new SimpleFilter (opeq,
  3011. c5->clone(),
  3012. new ConstantColumn(aIndexName.index, ConstantColumn::LITERAL));
  3013. filterTokenList.push_back(f3);
  3014. csep.filterTokenList(filterTokenList);
  3015. NJLSysDataList sysDataList;
  3016. getSysData (csep, sysDataList, SYSINDEXCOL_TABLE);
  3017. vector<ColumnResult*>::const_iterator it;
  3018. // help arrays. assume max index in a table. for sorting purpose
  3019. int dataCount = (*sysDataList.begin())->dataCount();
  3020. TableColName result[dataCount];
  3021. vector<int> colPos;
  3022. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  3023. {
  3024. if ((*it)->ColumnOID() == oid1)
  3025. {
  3026. TableColName tcn;
  3027. tcn.schema = indexName.schema;
  3028. tcn.table = indexName.table;
  3029. for (int i = 0; i < dataCount; i++)
  3030. {
  3031. tcn.column = (*it)->GetStringData(i);
  3032. tableColNameList.push_back(tcn);
  3033. }
  3034. }
  3035. else if ((*it)->ColumnOID() == oid2)
  3036. {
  3037. for (int i = 0; i < dataCount; i++)
  3038. colPos.push_back((*it)->GetData(i));
  3039. }
  3040. }
  3041. // sorting tableColName based on columnPosition
  3042. vector<int>::iterator iter = colPos.begin();
  3043. TableColNameList::iterator iter1 = tableColNameList.begin();
  3044. for (; iter != colPos.end(); iter++)
  3045. {
  3046. result[(*iter)] = (*iter1);
  3047. tableColNameList.erase(iter1);
  3048. }
  3049. for (int i = 0; i < dataCount; i++)
  3050. tableColNameList.push_back(result[i]);
  3051. return tableColNameList;
  3052. }
  3053. const CalpontSystemCatalog::TableColNameList CalpontSystemCatalog::constraintColNames ( const std::string constraintName)
  3054. {
  3055. DEBUG << "Enter constraintColNames: " << constraintName << endl;
  3056. std::string aConstraintName( constraintName );
  3057. transform( aConstraintName.begin(), aConstraintName.end(), aConstraintName.begin(), to_lower() );
  3058. /* SQL statement: select columnname from sysconstraintcol where constraintname = aConstraintName
  3059. */
  3060. CalpontSelectExecutionPlan csep;
  3061. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  3062. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  3063. CalpontSelectExecutionPlan::ColumnMap colMap;
  3064. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+COLNAME_COL, fSessionID);
  3065. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+CONSTRAINTNAME_COL, fSessionID);
  3066. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+SCHEMA_COL, fSessionID);
  3067. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+TABLENAME_COL, fSessionID);
  3068. SRCP srcp;
  3069. srcp.reset(c1);
  3070. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+COLNAME_COL, srcp));
  3071. srcp.reset(c2);
  3072. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+CONSTRAINTNAME_COL, srcp));
  3073. srcp.reset(c3);
  3074. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+SCHEMA_COL, srcp));
  3075. srcp.reset(c4);
  3076. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINTCOL_TABLE+"."+TABLENAME_COL, srcp));
  3077. csep.columnMapNonStatic(colMap);
  3078. srcp.reset(c1->clone());
  3079. returnedColumnList.push_back(srcp);
  3080. srcp.reset(c3->clone());
  3081. returnedColumnList.push_back(srcp);
  3082. srcp.reset(c4->clone());
  3083. returnedColumnList.push_back(srcp);
  3084. csep.returnedCols(returnedColumnList);
  3085. OID oid1 = DICTOID_SYSCONSTRAINTCOL_COLNAME;
  3086. OID oid3 = DICTOID_SYSCONSTRAINTCOL_SCHEMA;
  3087. OID oid4 = DICTOID_SYSCONSTRAINTCOL_TABLENAME;
  3088. // Filters
  3089. SimpleFilter *f1 = new SimpleFilter (opeq,
  3090. c2->clone(),
  3091. new ConstantColumn(aConstraintName, ConstantColumn::LITERAL));
  3092. filterTokenList.push_back(f1);
  3093. csep.filterTokenList(filterTokenList);
  3094. NJLSysDataList sysDataList;
  3095. getSysData (csep, sysDataList, SYSCONSTRAINTCOL_TABLE);
  3096. vector<ColumnResult*>::const_iterator it;
  3097. // help arrays. assume max index in a table. for sorting purpose
  3098. //int dataCount = (*sysDataList.begin())->dataCount();
  3099. vector<TableColName> colNameList;
  3100. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  3101. {
  3102. if ((*it)->ColumnOID() == oid1)
  3103. {
  3104. for (int i = 0; i < (*it)->dataCount(); i++)
  3105. {
  3106. TableColName tableColName;
  3107. tableColName.column = (*it)->GetStringData(i);
  3108. colNameList.push_back(tableColName);
  3109. }
  3110. break;
  3111. }
  3112. }
  3113. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  3114. {
  3115. if ((*it)->ColumnOID() == oid3)
  3116. {
  3117. for (int i = 0; i < (*it)->dataCount(); i++)
  3118. {
  3119. colNameList[i].schema = (*it)->GetStringData(i);
  3120. }
  3121. continue;
  3122. }
  3123. if ((*it)->ColumnOID() == oid4)
  3124. {
  3125. for (int i = 0; i < (*it)->dataCount(); i++)
  3126. {
  3127. colNameList[i].table = (*it)->GetStringData(i);
  3128. }
  3129. continue;
  3130. }
  3131. }
  3132. return colNameList;
  3133. }
  3134. const CalpontSystemCatalog::ROPair CalpontSystemCatalog::indexRID(const IndexName& indexName)
  3135. {
  3136. DEBUG << "Enter indexRID: " << indexName.schema << "|" << indexName.table << indexName.index << endl;
  3137. ROPair rp;
  3138. IndexName aIndexName;
  3139. aIndexName.schema = indexName.schema;
  3140. aIndexName.table = indexName.table;
  3141. aIndexName.index = indexName.index;
  3142. transform( aIndexName.schema.begin(), aIndexName.schema.end(), aIndexName.schema.begin(), to_lower() );
  3143. transform( aIndexName.table.begin(), aIndexName.table.end(), aIndexName.table.begin(), to_lower() );
  3144. transform( aIndexName.index.begin(), aIndexName.index.end(), aIndexName.index.begin(), to_lower() );
  3145. /* SQL statement: select indexname from sysindex where schema=indexName.schema and indexname=indexName.index;
  3146. */
  3147. CalpontSelectExecutionPlan csep;
  3148. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  3149. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  3150. CalpontSelectExecutionPlan::ColumnMap colMap;
  3151. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+SCHEMA_COL, fSessionID);
  3152. SimpleColumn *c5 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+INDEXNAME_COL, fSessionID);
  3153. SRCP srcp;
  3154. srcp.reset(c3);
  3155. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+SCHEMA_COL, srcp));
  3156. srcp.reset(c5);
  3157. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+INDEXNAME_COL, srcp));
  3158. csep.columnMapNonStatic(colMap);
  3159. csep.returnedCols(returnedColumnList);
  3160. OID oid5 = DICTOID_SYSINDEX_INDEXNAME;
  3161. // Filters
  3162. SimpleFilter *f1 = new SimpleFilter (opeq,
  3163. c3->clone(),
  3164. new ConstantColumn(aIndexName.schema, ConstantColumn::LITERAL));
  3165. filterTokenList.push_back(f1);
  3166. filterTokenList.push_back(new Operator("and"));
  3167. SimpleFilter *f2 = new SimpleFilter (opeq,
  3168. c5->clone(),
  3169. new ConstantColumn(aIndexName.index, ConstantColumn::LITERAL));
  3170. filterTokenList.push_back(f2);
  3171. csep.filterTokenList(filterTokenList);
  3172. NJLSysDataList sysDataList;
  3173. getSysData (csep, sysDataList, SYSINDEX_TABLE);
  3174. vector<ColumnResult*>::const_iterator it;
  3175. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  3176. {
  3177. if ((*it)->dataCount() == 0)
  3178. return rp;
  3179. if ((*it)->ColumnOID() == oid5)
  3180. {
  3181. if (fIdentity == EC)
  3182. rp.rid = (*it)->GetRid(0);
  3183. }
  3184. }
  3185. return rp;
  3186. }
  3187. #endif
  3188. const int CalpontSystemCatalog::colNumbers(const TableName& tableName)
  3189. {
  3190. DEBUG << "Enter colNumbers: " << tableName.schema << "|" << tableName.table << endl;
  3191. TableInfo ti = tableInfo(tableName);
  3192. return ti.numOfCols;
  3193. }
  3194. #if 0
  3195. const std::string CalpontSystemCatalog::colValueSysindex (const TableColName& tableColName)
  3196. {
  3197. /* SQL statement: select indexname from sysindex where schema = schema and table=table and column=column;*/
  3198. TableColName aTableColName;
  3199. aTableColName.schema = tableColName.schema;
  3200. aTableColName.table = tableColName.table;
  3201. aTableColName.column = tableColName.column;
  3202. transform( aTableColName.schema.begin(), aTableColName.schema.end(), aTableColName.schema.begin(), to_lower() );
  3203. transform( aTableColName.table.begin(), aTableColName.table.end(), aTableColName.table.begin(), to_lower() );
  3204. transform( aTableColName.column.begin(), aTableColName.column.end(), aTableColName.column.begin(), to_lower() );
  3205. if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
  3206. DEBUG << "Enter colValueSysindex: " << tableColName.schema << "|"
  3207. << tableColName.table << "|"
  3208. << tableColName.column << endl;
  3209. CalpontSelectExecutionPlan csep;
  3210. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  3211. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  3212. CalpontSelectExecutionPlan::ColumnMap colMap;
  3213. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+INDEXNAME_COL, fSessionID);
  3214. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+SCHEMA_COL, fSessionID);
  3215. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+TABLENAME_COL, fSessionID);
  3216. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+COLNAME_COL, fSessionID);
  3217. SRCP srcp;
  3218. srcp.reset(c1);
  3219. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+INDEXNAME_COL, srcp));
  3220. srcp.reset(c2);
  3221. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+SCHEMA_COL, srcp));
  3222. srcp.reset(c3);
  3223. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+TABLENAME_COL, srcp));
  3224. srcp.reset(c4);
  3225. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+COLNAME_COL, srcp));
  3226. csep.columnMapNonStatic(colMap);
  3227. srcp.reset(c1->clone());
  3228. returnedColumnList.push_back(srcp);
  3229. csep.returnedCols(returnedColumnList);
  3230. OID oid = DICTOID_SYSINDEXCOL_INDEXNAME;
  3231. // Filters
  3232. SimpleFilter *f1 = new SimpleFilter (opeq,
  3233. c2->clone(),
  3234. new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
  3235. filterTokenList.push_back(f1);
  3236. filterTokenList.push_back(new Operator("and"));
  3237. SimpleFilter *f2 = new SimpleFilter (opeq,
  3238. c3->clone(),
  3239. new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
  3240. filterTokenList.push_back(f2);
  3241. filterTokenList.push_back(new Operator("and"));
  3242. SimpleFilter *f3 = new SimpleFilter (opeq,
  3243. c4->clone(),
  3244. new ConstantColumn(aTableColName.column, ConstantColumn::LITERAL));
  3245. filterTokenList.push_back(f3);
  3246. csep.filterTokenList(filterTokenList);
  3247. NJLSysDataList sysDataList;
  3248. getSysData (csep, sysDataList, SYSINDEXCOL_TABLE);
  3249. vector<ColumnResult*>::const_iterator it;
  3250. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  3251. {
  3252. if ((*it)->dataCount() == 0)
  3253. {
  3254. string msg("CalpontSystemCatalog::colValueSysindex: no indexname found for ");
  3255. msg += tableColName.schema;
  3256. msg += ".";
  3257. msg += tableColName.table;
  3258. msg += ".";
  3259. msg += tableColName.column;
  3260. throw runtime_error(msg);
  3261. }
  3262. if ((*it)->ColumnOID() == oid)
  3263. return (*it)->GetStringData(0);
  3264. }
  3265. string msg("CalpontSystemCatalog::colValueSysindex: no indexname found for ");
  3266. msg += tableColName.schema;
  3267. msg += ".";
  3268. msg += tableColName.table;
  3269. msg += ".";
  3270. msg += tableColName.column;
  3271. throw runtime_error(msg);
  3272. }
  3273. const CalpontSystemCatalog::RIDList CalpontSystemCatalog::indexColRID(const IndexName& indexName)
  3274. {
  3275. /* SQL statement: select indexname from sysindexcol where schema=tableColName.schema and
  3276. * tablename=tableColName.table and columnname = tableColName.column;
  3277. */
  3278. IndexName aIndexName;
  3279. aIndexName.schema = indexName.schema;
  3280. aIndexName.table = indexName.table;
  3281. aIndexName.index = indexName.index;
  3282. transform( aIndexName.schema.begin(), aIndexName.schema.end(), aIndexName.schema.begin(), to_lower() );
  3283. transform( aIndexName.table.begin(), aIndexName.table.end(), aIndexName.table.begin(), to_lower() );
  3284. transform( aIndexName.index.begin(), aIndexName.index.end(), aIndexName.index.begin(), to_lower() );
  3285. if (aIndexName.schema.compare(CALPONT_SCHEMA) != 0)
  3286. DEBUG << "Enter indexColRID: " << aIndexName.schema << "|"
  3287. << aIndexName.table << "|" << aIndexName.index << endl;
  3288. CalpontSelectExecutionPlan csep;
  3289. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  3290. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  3291. CalpontSelectExecutionPlan::ColumnMap colMap;
  3292. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+INDEXNAME_COL, fSessionID);
  3293. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+SCHEMA_COL, fSessionID);
  3294. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+TABLENAME_COL, fSessionID);
  3295. SRCP srcp;
  3296. srcp.reset(c1);
  3297. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+INDEXNAME_COL, srcp));
  3298. srcp.reset(c2);
  3299. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+SCHEMA_COL, srcp));
  3300. srcp.reset(c3);
  3301. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+TABLENAME_COL, srcp));
  3302. csep.columnMapNonStatic(colMap);
  3303. srcp.reset(c1->clone());
  3304. returnedColumnList.push_back(srcp);
  3305. csep.returnedCols(returnedColumnList);
  3306. // Filters
  3307. SimpleFilter *f1 = new SimpleFilter (opeq,
  3308. c2->clone(),
  3309. new ConstantColumn(aIndexName.schema, ConstantColumn::LITERAL));
  3310. filterTokenList.push_back(f1);
  3311. filterTokenList.push_back(new Operator("and"));
  3312. SimpleFilter *f2 = new SimpleFilter (opeq,
  3313. c3->clone(),
  3314. new ConstantColumn(aIndexName.table, ConstantColumn::LITERAL));
  3315. filterTokenList.push_back(f2);
  3316. filterTokenList.push_back(new Operator("and"));
  3317. SimpleFilter *f3 = new SimpleFilter (opeq,
  3318. c1->clone(),
  3319. new ConstantColumn(aIndexName.index, ConstantColumn::LITERAL));
  3320. filterTokenList.push_back(f3);
  3321. csep.filterTokenList(filterTokenList);
  3322. NJLSysDataList sysDataList;
  3323. getSysData (csep, sysDataList, SYSINDEXCOL_TABLE);
  3324. vector<ColumnResult*>::const_iterator it;
  3325. RIDList ridlist;
  3326. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  3327. {
  3328. for (int i = 0; i < (*it)->dataCount(); i++)
  3329. {
  3330. ROPair rp;
  3331. if (fIdentity == EC)
  3332. rp.rid = (*it)->GetRid(i);
  3333. ridlist.push_back(rp);
  3334. }
  3335. }
  3336. return ridlist;
  3337. }
  3338. const CalpontSystemCatalog::ROPair CalpontSystemCatalog::indexColRID(const TableColName& tableColName)
  3339. {
  3340. /* SQL statement: select indexname from sysindexcol where schema=tableColName.schema and
  3341. * tablename=tableColName.table and columnname = tableColName.column;
  3342. */
  3343. TableColName aTableColName;
  3344. aTableColName.schema = tableColName.schema;
  3345. aTableColName.table = tableColName.table;
  3346. aTableColName.column = tableColName.column;
  3347. transform( aTableColName.schema.begin(), aTableColName.schema.end(), aTableColName.schema.begin(), to_lower() );
  3348. transform( aTableColName.table.begin(), aTableColName.table.end(), aTableColName.table.begin(), to_lower() );
  3349. transform( aTableColName.column.begin(), aTableColName.column.end(), aTableColName.column.begin(), to_lower() );
  3350. if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
  3351. DEBUG << "Enter indexColRID: " << tableColName.schema << "|"
  3352. << tableColName.table << "|" << tableColName.column << endl;
  3353. CalpontSelectExecutionPlan csep;
  3354. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  3355. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  3356. CalpontSelectExecutionPlan::ColumnMap colMap;
  3357. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+INDEXNAME_COL, fSessionID);
  3358. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+SCHEMA_COL, fSessionID);
  3359. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+TABLENAME_COL, fSessionID);
  3360. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+COLNAME_COL, fSessionID);
  3361. SRCP srcp;
  3362. srcp.reset(c1);
  3363. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+INDEXNAME_COL, srcp));
  3364. srcp.reset(c2);
  3365. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+SCHEMA_COL, srcp));
  3366. srcp.reset(c3);
  3367. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+TABLENAME_COL, srcp));
  3368. srcp.reset(c4);
  3369. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+COLNAME_COL, srcp));
  3370. csep.columnMapNonStatic(colMap);
  3371. srcp.reset(c1->clone());
  3372. returnedColumnList.push_back(srcp);
  3373. csep.returnedCols(returnedColumnList);
  3374. OID oid = DICTOID_SYSINDEXCOL_INDEXNAME;
  3375. // Filters
  3376. SimpleFilter *f1 = new SimpleFilter (opeq,
  3377. c2->clone(),
  3378. new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
  3379. filterTokenList.push_back(f1);
  3380. filterTokenList.push_back(new Operator("and"));
  3381. SimpleFilter *f2 = new SimpleFilter (opeq,
  3382. c3->clone(),
  3383. new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
  3384. filterTokenList.push_back(f2);
  3385. filterTokenList.push_back(new Operator("and"));
  3386. SimpleFilter *f3 = new SimpleFilter (opeq,
  3387. c4->clone(),
  3388. new ConstantColumn(aTableColName.column, ConstantColumn::LITERAL));
  3389. filterTokenList.push_back(f3);
  3390. csep.filterTokenList(filterTokenList);
  3391. NJLSysDataList sysDataList;
  3392. getSysData (csep, sysDataList, SYSINDEXCOL_TABLE);
  3393. vector<ColumnResult*>::const_iterator it;
  3394. ROPair rid;
  3395. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  3396. {
  3397. if ((*it)->dataCount() == 0)
  3398. return rid;
  3399. if ((*it)->ColumnOID() == oid)
  3400. {
  3401. if (fIdentity == EC)
  3402. rid.rid = (*it)->GetRid(0);
  3403. return rid;
  3404. }
  3405. }
  3406. return rid;
  3407. }
  3408. const CalpontSystemCatalog::IndexNameList CalpontSystemCatalog::colValueSysindexCol (const TableColName& tableColName)
  3409. {
  3410. /* SQL statement: select indexname from sysindex where schema = schema and table=table and column=column;*/
  3411. TableColName aTableColName;
  3412. CalpontSystemCatalog::IndexNameList indexNameList;
  3413. aTableColName.schema = tableColName.schema;
  3414. aTableColName.table = tableColName.table;
  3415. aTableColName.column = tableColName.column;
  3416. transform( aTableColName.schema.begin(), aTableColName.schema.end(), aTableColName.schema.begin(), to_lower() );
  3417. transform( aTableColName.table.begin(), aTableColName.table.end(), aTableColName.table.begin(), to_lower() );
  3418. transform( aTableColName.column.begin(), aTableColName.column.end(), aTableColName.column.begin(), to_lower() );
  3419. return indexNameList; //so colxml can run when indexes are not made
  3420. if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
  3421. DEBUG << "Enter colValueSysindexCol: " << tableColName.schema << "|"
  3422. << tableColName.table << "|"
  3423. << tableColName.column << endl;
  3424. CalpontSelectExecutionPlan csep;
  3425. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  3426. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  3427. CalpontSelectExecutionPlan::ColumnMap colMap;
  3428. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+INDEXNAME_COL, fSessionID);
  3429. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+SCHEMA_COL, fSessionID);
  3430. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+TABLENAME_COL, fSessionID);
  3431. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+COLNAME_COL, fSessionID);
  3432. SRCP srcp;
  3433. srcp.reset(c1);
  3434. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+INDEXNAME_COL, srcp));
  3435. srcp.reset(c2);
  3436. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+SCHEMA_COL, srcp));
  3437. srcp.reset(c3);
  3438. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+TABLENAME_COL, srcp));
  3439. srcp.reset(c4);
  3440. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+COLNAME_COL, srcp));
  3441. csep.columnMapNonStatic(colMap);
  3442. srcp.reset(c1->clone());
  3443. returnedColumnList.push_back(srcp);
  3444. csep.returnedCols(returnedColumnList);
  3445. OID oid = DICTOID_SYSINDEXCOL_INDEXNAME;
  3446. // Filters
  3447. SimpleFilter *f1 = new SimpleFilter (opeq,
  3448. c2->clone(),
  3449. new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
  3450. filterTokenList.push_back(f1);
  3451. filterTokenList.push_back(new Operator("and"));
  3452. SimpleFilter *f2 = new SimpleFilter (opeq,
  3453. c3->clone(),
  3454. new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
  3455. filterTokenList.push_back(f2);
  3456. filterTokenList.push_back(new Operator("and"));
  3457. SimpleFilter *f3 = new SimpleFilter (opeq,
  3458. c4->clone(),
  3459. new ConstantColumn(aTableColName.column, ConstantColumn::LITERAL));
  3460. filterTokenList.push_back(f3);
  3461. csep.filterTokenList(filterTokenList);
  3462. NJLSysDataList sysDataList;
  3463. getSysData (csep, sysDataList, SYSINDEXCOL_TABLE);
  3464. vector<ColumnResult*>::const_iterator it;
  3465. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  3466. {
  3467. if ((*it)->ColumnOID() == oid)
  3468. {
  3469. IndexName indexName;
  3470. indexName.schema = aTableColName.schema;
  3471. indexName.table = aTableColName.table;
  3472. for ( int i = 0; i < (*it)->dataCount(); i++)
  3473. {
  3474. indexName.index = (*it)->GetStringData(i);
  3475. indexNameList.push_back(indexName);
  3476. }
  3477. }
  3478. }
  3479. return indexNameList;
  3480. }
  3481. const CalpontSystemCatalog::TableName CalpontSystemCatalog::lookupTableForIndex(const std::string indexName, const std::string schema)
  3482. {
  3483. DEBUG << "Enter lookupTableForIndex" << endl;
  3484. CalpontSystemCatalog::TableName tablename;
  3485. //select tablename from sysindex where indexname = indexName and schema = schema;
  3486. std::string aIndexName( indexName );
  3487. std::string aSchema ( schema);
  3488. transform( aIndexName.begin(), aIndexName.end(), aIndexName.begin(), to_lower() );
  3489. transform( aSchema.begin(), aSchema.end(), aSchema.begin(), to_lower() );
  3490. tablename.schema = aSchema;
  3491. CalpontSelectExecutionPlan csep;
  3492. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  3493. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  3494. CalpontSelectExecutionPlan::ColumnMap colMap;
  3495. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+SCHEMA_COL, fSessionID);
  3496. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+TABLENAME_COL, fSessionID);
  3497. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+INDEXNAME_COL, fSessionID);
  3498. SRCP srcp;
  3499. srcp.reset(c1);
  3500. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+SCHEMA_COL, srcp));
  3501. srcp.reset(c2);
  3502. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+TABLENAME_COL, srcp));
  3503. srcp.reset(c3);
  3504. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+INDEXNAME_COL, srcp));
  3505. csep.columnMapNonStatic(colMap);
  3506. srcp.reset(c2->clone());
  3507. returnedColumnList.push_back(srcp);
  3508. csep.returnedCols(returnedColumnList);
  3509. OID oid2 = DICTOID_SYSINDEX_TABLENAME;
  3510. // Filters
  3511. SimpleFilter *f1 = new SimpleFilter (opeq,
  3512. c1->clone(),
  3513. new ConstantColumn(aSchema, ConstantColumn::LITERAL));
  3514. filterTokenList.push_back(f1);
  3515. filterTokenList.push_back(new Operator("and"));
  3516. SimpleFilter *f2 = new SimpleFilter (opeq,
  3517. c3->clone(),
  3518. new ConstantColumn(aIndexName, ConstantColumn::LITERAL));
  3519. filterTokenList.push_back(f2);
  3520. csep.filterTokenList(filterTokenList);
  3521. NJLSysDataList sysDataList;
  3522. getSysData (csep, sysDataList, SYSINDEX_TABLE);
  3523. vector<ColumnResult*>::const_iterator it;
  3524. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  3525. {
  3526. if ((*it)->dataCount() == 0)
  3527. {
  3528. string msg("CalpontSystemCatalog::lookupTableForIndex: no table name found for ");
  3529. msg += aIndexName;
  3530. throw runtime_error(msg);
  3531. }
  3532. if ((*it)->ColumnOID() == oid2)
  3533. tablename.table = (*it)->GetStringData(0);
  3534. }
  3535. return tablename;
  3536. }
  3537. const CalpontSystemCatalog::IndexOID CalpontSystemCatalog::lookupIndexNbr(const IndexName& indexName)
  3538. {
  3539. CalpontSystemCatalog::IndexOID indexoid = {-1, -1};
  3540. IndexName aIndexName;
  3541. aIndexName.schema = indexName.schema;
  3542. aIndexName.table = indexName.table;
  3543. aIndexName.index = indexName.index;
  3544. transform( aIndexName.schema.begin(), aIndexName.schema.end(), aIndexName.schema.begin(), to_lower() );
  3545. transform( aIndexName.table.begin(), aIndexName.table.end(), aIndexName.table.begin(), to_lower() );
  3546. transform( aIndexName.index.begin(), aIndexName.index.end(), aIndexName.index.begin(), to_lower() );
  3547. if (aIndexName.schema.compare(CALPONT_SCHEMA) != 0)
  3548. DEBUG << "Enter lookupIndexNbr: " << indexName.schema << "|" << indexName.table
  3549. << "|" << indexName.index << endl;
  3550. // return pre-defined indexoid for system catalog index. currently no index
  3551. // created for system catalog, return invalid(default) indexoid.
  3552. if (aIndexName.schema.compare(CALPONT_SCHEMA) == 0)
  3553. return indexoid;
  3554. /* SQL statement: select listobjectoid, treeobjectoid, multicolflag from sysindex where schema=indexName.schema and
  3555. * tablename=indexName.table and indexname=indexName.index;
  3556. */
  3557. CalpontSelectExecutionPlan csep;
  3558. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  3559. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  3560. CalpontSelectExecutionPlan::ColumnMap colMap;
  3561. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+LISTOBJID_COL, fSessionID);
  3562. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+TREEOBJID_COL, fSessionID);
  3563. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+SCHEMA_COL, fSessionID);
  3564. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+TABLENAME_COL, fSessionID);
  3565. SimpleColumn *c5 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+INDEXNAME_COL, fSessionID);
  3566. SimpleColumn *c6 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+MULTICOLFLAG_COL, fSessionID);
  3567. SRCP srcp;
  3568. srcp.reset(c1);
  3569. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+LISTOBJID_COL, srcp));
  3570. srcp.reset(c2);
  3571. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+TREEOBJID_COL, srcp));
  3572. srcp.reset(c3);
  3573. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+SCHEMA_COL, srcp));
  3574. srcp.reset(c4);
  3575. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+TABLENAME_COL, srcp));
  3576. srcp.reset(c5);
  3577. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+INDEXNAME_COL, srcp));
  3578. srcp.reset(c6);
  3579. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+MULTICOLFLAG_COL, srcp));
  3580. csep.columnMapNonStatic(colMap);
  3581. srcp.reset(c1->clone());
  3582. returnedColumnList.push_back(srcp);
  3583. srcp.reset(c2->clone());
  3584. returnedColumnList.push_back(srcp);
  3585. srcp.reset(c6->clone());
  3586. returnedColumnList.push_back(srcp);
  3587. csep.returnedCols(returnedColumnList);
  3588. OID oid1 = c1->oid();
  3589. OID oid2 = c2->oid();
  3590. OID oid3 = c6->oid();
  3591. // Filters
  3592. SimpleFilter *f1 = new SimpleFilter (opeq,
  3593. c3->clone(),
  3594. new ConstantColumn(aIndexName.schema, ConstantColumn::LITERAL));
  3595. filterTokenList.push_back(f1);
  3596. filterTokenList.push_back(new Operator("and"));
  3597. SimpleFilter *f2 = new SimpleFilter (opeq,
  3598. c4->clone(),
  3599. new ConstantColumn(aIndexName.table, ConstantColumn::LITERAL));
  3600. filterTokenList.push_back(f2);
  3601. filterTokenList.push_back(new Operator("and"));
  3602. SimpleFilter *f3 = new SimpleFilter (opeq,
  3603. c5->clone(),
  3604. new ConstantColumn(aIndexName.index, ConstantColumn::LITERAL));
  3605. filterTokenList.push_back(f3);
  3606. csep.filterTokenList(filterTokenList);
  3607. NJLSysDataList sysDataList;
  3608. getSysData (csep, sysDataList, SYSINDEX_TABLE);
  3609. vector<ColumnResult*>::const_iterator it;
  3610. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  3611. {
  3612. if ((*it)->dataCount() == 0)
  3613. {
  3614. string msg("CalpontSystemCatalog::lookupIndexNbr: no indexid found for ");
  3615. msg += indexName.schema;
  3616. msg += ".";
  3617. msg += indexName.table;
  3618. msg += ".";
  3619. msg += indexName.index;
  3620. throw runtime_error(msg);
  3621. }
  3622. if ((*it)->ColumnOID() == oid1)
  3623. indexoid.listOID = (*it)->GetData(0);
  3624. else if ((*it)->ColumnOID() == oid2)
  3625. indexoid.objnum = (*it)->GetData(0);
  3626. else if ((*it)->ColumnOID() == oid3)
  3627. indexoid.multiColFlag = ((*it)->GetData(0)== 't'? true : false);
  3628. }
  3629. return indexoid;
  3630. }
  3631. const CalpontSystemCatalog::IndexOID CalpontSystemCatalog::lookupIndexNbr(const TableColName& tableColName)
  3632. {
  3633. /*SQL statement: select indexname from sysindexcol where schema=tableColName.schema and
  3634. * tablename=tableColName.table and columnname=tableColName.column;
  3635. * select listobjectoid, treeobjectoid from sysindex where schema=tableColName.schema and
  3636. * table=tableColName.table and indexname=indexname(previous statement);*/
  3637. IndexName index;
  3638. TableColName aTableColName;
  3639. CalpontSystemCatalog::IndexOID indexoid = {-1, -1};
  3640. aTableColName.schema = tableColName.schema;
  3641. aTableColName.table = tableColName.table;
  3642. aTableColName.column = tableColName.column;
  3643. transform( aTableColName.schema.begin(), aTableColName.schema.end(), aTableColName.schema.begin(), to_lower() );
  3644. transform( aTableColName.table.begin(), aTableColName.table.end(), aTableColName.table.begin(), to_lower() );
  3645. transform( aTableColName.column.begin(), aTableColName.column.end(), aTableColName.column.begin(), to_lower() );
  3646. if (aTableColName.schema.compare(CALPONT_SCHEMA) != 0)
  3647. DEBUG << "Enter lookupIndexNbr: " << tableColName.schema << "|" << tableColName.table
  3648. << "|" << tableColName.column << endl;
  3649. index.schema = tableColName.schema;
  3650. index.table = tableColName.table;
  3651. // return pre-defined indexoid for system catalog index. currently no index
  3652. // created for system catalog, return invalid(default) indexoid.
  3653. if (aTableColName.schema.compare(CALPONT_SCHEMA) == 0)
  3654. return indexoid;
  3655. // select objectid from syscolumn where schema = tableColName.schema and tablename = tableColName.table and columnname = tableColName.column;
  3656. CalpontSelectExecutionPlan csep;
  3657. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  3658. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  3659. CalpontSelectExecutionPlan::ColumnMap colMap;
  3660. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+INDEXNAME_COL, fSessionID);
  3661. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+SCHEMA_COL, fSessionID);
  3662. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+TABLENAME_COL, fSessionID);
  3663. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+COLNAME_COL, fSessionID);
  3664. SRCP srcp;
  3665. srcp.reset(c1);
  3666. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+INDEXNAME_COL, srcp));
  3667. srcp.reset(c2);
  3668. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+SCHEMA_COL, srcp));
  3669. srcp.reset(c3);
  3670. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+TABLENAME_COL, srcp));
  3671. srcp.reset(c4);
  3672. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEXCOL_TABLE+"."+COLNAME_COL, srcp));
  3673. csep.columnMapNonStatic(colMap);
  3674. srcp.reset(c1->clone());
  3675. returnedColumnList.push_back(srcp);
  3676. csep.returnedCols(returnedColumnList);
  3677. OID oid = DICTOID_SYSINDEXCOL_INDEXNAME;
  3678. // Filters
  3679. SimpleFilter *f1 = new SimpleFilter (opeq,
  3680. c2->clone(),
  3681. new ConstantColumn(aTableColName.schema, ConstantColumn::LITERAL));
  3682. filterTokenList.push_back(f1);
  3683. filterTokenList.push_back(new Operator("and"));
  3684. SimpleFilter *f2 = new SimpleFilter (opeq,
  3685. c3->clone(),
  3686. new ConstantColumn(aTableColName.table, ConstantColumn::LITERAL));
  3687. filterTokenList.push_back(f2);
  3688. filterTokenList.push_back(new Operator("and"));
  3689. SimpleFilter *f3 = new SimpleFilter (opeq,
  3690. c4->clone(),
  3691. new ConstantColumn(aTableColName.column, ConstantColumn::LITERAL));
  3692. filterTokenList.push_back(f3);
  3693. csep.filterTokenList(filterTokenList);
  3694. NJLSysDataList sysDataList;
  3695. getSysData (csep, sysDataList, SYSINDEXCOL_TABLE);
  3696. vector<ColumnResult*>::const_iterator it;
  3697. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  3698. {
  3699. if ((*it)->dataCount() == 0)
  3700. return indexoid;
  3701. if ((*it)->ColumnOID() == oid)
  3702. {
  3703. index.index = ((*it)->GetStringData(0));
  3704. return lookupIndexNbr(index);
  3705. }
  3706. }
  3707. return indexoid;
  3708. }
  3709. const CalpontSystemCatalog::IndexOIDList CalpontSystemCatalog::indexOIDs( const TableName& tableName )
  3710. {
  3711. /*select listobjectoid, treeobjectoid from sysindex where schema=tableName.schema and
  3712. * tablename=tableName.table;*/
  3713. // not cached yet. can be done in the future
  3714. TableColName aTableName;
  3715. CalpontSystemCatalog::IndexOID indexoid = {-1, -1};
  3716. IndexOIDList indexlist;
  3717. aTableName.schema = tableName.schema;
  3718. aTableName.table = tableName.table;
  3719. transform( aTableName.schema.begin(), aTableName.schema.end(), aTableName.schema.begin(), to_lower() );
  3720. transform( aTableName.table.begin(), aTableName.table.end(), aTableName.table.begin(), to_lower() );
  3721. if (aTableName.schema.compare(CALPONT_SCHEMA) != 0)
  3722. DEBUG << "Enter indexOIDs: " << tableName.schema << "|" << tableName.table << endl;
  3723. // return pre-defined indexoid for system catalog index. currently no index
  3724. // created for system catalog, return invalid(default) indexoid.
  3725. if (aTableName.schema.compare(CALPONT_SCHEMA) == 0)
  3726. return indexlist;
  3727. // select objectid from syscolumn where schema = tableColName.schema and tablename = tableColName.table and columnname = tableColName.column;
  3728. CalpontSelectExecutionPlan csep;
  3729. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  3730. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  3731. CalpontSelectExecutionPlan::ColumnMap colMap;
  3732. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+LISTOBJID_COL, fSessionID);
  3733. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+TREEOBJID_COL, fSessionID);
  3734. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+SCHEMA_COL, fSessionID);
  3735. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+TABLENAME_COL, fSessionID);
  3736. SimpleColumn *c6 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+MULTICOLFLAG_COL, fSessionID);
  3737. SRCP srcp;
  3738. srcp.reset(c1);
  3739. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+LISTOBJID_COL, srcp));
  3740. srcp.reset(c2);
  3741. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+TREEOBJID_COL, srcp));
  3742. srcp.reset(c3);
  3743. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+SCHEMA_COL, srcp));
  3744. srcp.reset(c4);
  3745. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+TABLENAME_COL, srcp));
  3746. srcp.reset(c6);
  3747. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSINDEX_TABLE+"."+MULTICOLFLAG_COL, srcp));
  3748. csep.columnMapNonStatic(colMap);
  3749. srcp.reset(c1->clone());
  3750. returnedColumnList.push_back(srcp);
  3751. srcp.reset(c2->clone());
  3752. returnedColumnList.push_back(srcp);
  3753. srcp.reset(c6->clone());
  3754. returnedColumnList.push_back(srcp);
  3755. csep.returnedCols(returnedColumnList);
  3756. OID oid1 = c1->oid();
  3757. OID oid2 = c2->oid();
  3758. OID oid3 = c6->oid();
  3759. // Filters
  3760. SimpleFilter *f1 = new SimpleFilter (opeq,
  3761. c3->clone(),
  3762. new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
  3763. filterTokenList.push_back(f1);
  3764. filterTokenList.push_back(new Operator("and"));
  3765. SimpleFilter *f2 = new SimpleFilter (opeq,
  3766. c4->clone(),
  3767. new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
  3768. filterTokenList.push_back(f2);
  3769. csep.filterTokenList(filterTokenList);
  3770. NJLSysDataList sysDataList;
  3771. getSysData (csep, sysDataList, SYSINDEX_TABLE);
  3772. vector<ColumnResult*>::const_iterator it;
  3773. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  3774. {
  3775. if ((*it)->dataCount() == 0)
  3776. return indexlist;
  3777. if ((*it)->ColumnOID() == oid1)
  3778. {
  3779. for (int i = 0; i < (*it)->dataCount(); i++)
  3780. {
  3781. indexoid.listOID = (*it)->GetData(i);
  3782. indexlist.push_back(indexoid);
  3783. }
  3784. break;
  3785. }
  3786. }
  3787. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  3788. {
  3789. if ((*it)->ColumnOID() == oid2)
  3790. {
  3791. for (int i = 0; i < (*it)->dataCount(); i++)
  3792. indexlist[i].objnum = (*it)->GetData(i);
  3793. }
  3794. else if ((*it)->ColumnOID() == oid3)
  3795. {
  3796. for (int i = 0; i < (*it)->dataCount(); i++)
  3797. indexlist[i].multiColFlag = ((*it)->GetData(i) == 't'? true : false);
  3798. }
  3799. }
  3800. return indexlist;
  3801. }
  3802. #endif
  3803. const CalpontSystemCatalog::DictOIDList CalpontSystemCatalog::dictOIDs( const TableName& tableName )
  3804. {
  3805. /* SQL statement: select dictobjectid, listobjectid, treeobjectid from syscolumn where
  3806. * schema=tableName.schema and table=tableName.table;*/
  3807. DictOIDList dictOIDList;
  3808. TableColName aTableName;
  3809. CalpontSystemCatalog::DictOID dictoid;
  3810. aTableName.schema = tableName.schema;
  3811. aTableName.table = tableName.table;
  3812. transform( aTableName.schema.begin(), aTableName.schema.end(), aTableName.schema.begin(), to_lower() );
  3813. transform( aTableName.table.begin(), aTableName.table.end(), aTableName.table.begin(), to_lower() );
  3814. if (aTableName.schema.compare(CALPONT_SCHEMA) != 0)
  3815. DEBUG << "Enter dictOIDs: " << tableName.schema << "|" << tableName.table << endl;
  3816. // return pre-defined indexoid for system catalog index. currently no index
  3817. // created for system catalog, return invalid(default) indexoid.
  3818. if (aTableName.schema.compare(CALPONT_SCHEMA) == 0)
  3819. return dictOIDList;
  3820. // select objectid from syscolumn where schema = tableColName.schema and tablename = tableColName.table and columnname = tableColName.column;
  3821. CalpontSelectExecutionPlan csep;
  3822. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  3823. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  3824. CalpontSelectExecutionPlan::ColumnMap colMap;
  3825. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+LISTOBJID_COL, fSessionID);
  3826. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TREEOBJID_COL, fSessionID);
  3827. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+SCHEMA_COL, fSessionID);
  3828. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TABLENAME_COL, fSessionID);
  3829. SimpleColumn *c5 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+DICTOID_COL, fSessionID);
  3830. SRCP srcp;
  3831. srcp.reset(c1);
  3832. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+LISTOBJID_COL, srcp));
  3833. srcp.reset(c2);
  3834. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TREEOBJID_COL, srcp));
  3835. srcp.reset(c3);
  3836. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+SCHEMA_COL, srcp));
  3837. srcp.reset(c4);
  3838. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TABLENAME_COL, srcp));
  3839. srcp.reset(c5);
  3840. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+DICTOID_COL, srcp));
  3841. csep.columnMapNonStatic(colMap);
  3842. srcp.reset(c1->clone());
  3843. returnedColumnList.push_back(srcp);
  3844. srcp.reset(c2->clone());
  3845. returnedColumnList.push_back(srcp);
  3846. srcp.reset(c5->clone());
  3847. returnedColumnList.push_back(srcp);
  3848. csep.returnedCols(returnedColumnList);
  3849. OID oid1 = c1->oid();
  3850. OID oid2 = c2->oid();
  3851. OID oid3 = c5->oid();
  3852. // Filters
  3853. SimpleFilter *f1 = new SimpleFilter (opeq,
  3854. c3->clone(),
  3855. new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
  3856. filterTokenList.push_back(f1);
  3857. filterTokenList.push_back(new Operator("and"));
  3858. SimpleFilter *f2 = new SimpleFilter (opeq,
  3859. c4->clone(),
  3860. new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
  3861. filterTokenList.push_back(f2);
  3862. SOP opisnotnull(new Operator("isnotnull"));
  3863. filterTokenList.push_back(new Operator("and"));
  3864. SimpleFilter *f3 = new SimpleFilter (opisnotnull,
  3865. c5->clone(),
  3866. new ConstantColumn("", ConstantColumn::NULLDATA));
  3867. filterTokenList.push_back(f3);
  3868. csep.filterTokenList(filterTokenList);
  3869. NJLSysDataList sysDataList;
  3870. getSysData (csep, sysDataList, SYSCOLUMN_TABLE);
  3871. vector<ColumnResult*>::const_iterator it;
  3872. // loop for oid1 first to make sure dictOIDList is populated
  3873. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  3874. {
  3875. if ((*it)->dataCount() == 0)
  3876. return dictOIDList;
  3877. if ((*it)->ColumnOID() == oid1)
  3878. {
  3879. for (int i = 0; i < (*it)->dataCount(); i++)
  3880. {
  3881. dictoid.listOID = (*it)->GetData(i);
  3882. dictOIDList.push_back(dictoid);
  3883. }
  3884. break;
  3885. }
  3886. }
  3887. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  3888. {
  3889. if ((*it)->ColumnOID() == oid2)
  3890. {
  3891. for (int i = 0; i < (*it)->dataCount(); i++)
  3892. dictOIDList[i].treeOID = (*it)->GetData(i);
  3893. }
  3894. else if ((*it)->ColumnOID() == oid3)
  3895. {
  3896. for (int i = 0; i < (*it)->dataCount(); i++)
  3897. dictOIDList[i].dictOID = (*it)->GetData(i);
  3898. }
  3899. }
  3900. return dictOIDList;
  3901. }
  3902. #if 0 //Not implemented
  3903. void CalpontSystemCatalog::storeColOID(void)
  3904. {
  3905. }
  3906. void CalpontSystemCatalog::storeDictOID(void)
  3907. {
  3908. }
  3909. void CalpontSystemCatalog::storeIndexOID(void)
  3910. {
  3911. }
  3912. void CalpontSystemCatalog::updateColInfo(void)
  3913. {
  3914. }
  3915. #endif
  3916. const int CalpontSystemCatalog::colPosition (const OID& oid)
  3917. {
  3918. DEBUG << "Enter colPosition: " << oid << endl;
  3919. ColType col = colType (oid);
  3920. return col.colPosition;
  3921. }
  3922. const CalpontSystemCatalog::TableInfo CalpontSystemCatalog::tableInfo (const TableName& tb)
  3923. {
  3924. TableName aTableName;
  3925. aTableName.schema = tb.schema;
  3926. aTableName.table = tb.table;
  3927. transform( aTableName.schema.begin(), aTableName.schema.end(), aTableName.schema.begin(), to_lower() );
  3928. transform( aTableName.table.begin(), aTableName.table.end(), aTableName.table.begin(), to_lower() );
  3929. if (aTableName.schema.compare(CALPONT_SCHEMA) != 0)
  3930. DEBUG << "Enter tableInfo: " << tb.schema << "|" << tb.table << endl;
  3931. // look up cache first
  3932. TableInfo ti;
  3933. RIDList ridlist ;
  3934. // select count(objectid) from syscolumn where schema=tableName.schema and tablename=tableName.table;
  3935. try {
  3936. ridlist = columnRIDs(tb);
  3937. }
  3938. catch (logging::IDBExcept& noTable)
  3939. {
  3940. throw runtime_error (noTable.what());
  3941. }
  3942. if (ridlist.size() == 0)
  3943. throw runtime_error ("No table info found for" + tb.schema + "." + tb.table);
  3944. if ( aTableName.schema.compare(CALPONT_SCHEMA) == 0)
  3945. {
  3946. ti.numOfCols = ridlist.size();
  3947. ti.tablewithautoincr = 0;
  3948. return ti;
  3949. }
  3950. boost::mutex::scoped_lock lk1(fTableInfoMapLock);
  3951. TableInfoMap::const_iterator ti_iter = fTableInfoMap.find(aTableName);
  3952. if (ti_iter != fTableInfoMap.end())
  3953. {
  3954. return (*ti_iter).second;
  3955. }
  3956. else
  3957. throw runtime_error ("No table info found for" + tb.schema + "." + tb.table);
  3958. }
  3959. #if 0
  3960. const CalpontSystemCatalog::ConstraintInfo CalpontSystemCatalog::constraintInfo (const IndexName& indexName)
  3961. {
  3962. /* SQL statement: select constraintType, constraintText, referencedTableName, referencedSchema, referencedConstraintName from sysconstraint where schema=indexName.schema and tablename=indexName.table and constraintName=indexName.index;*/
  3963. ConstraintInfo constraintInfo;
  3964. IndexName aIndexName;
  3965. aIndexName.schema = indexName.schema;
  3966. aIndexName.table = indexName.table;
  3967. aIndexName.index = indexName.index;
  3968. transform( aIndexName.schema.begin(), aIndexName.schema.end(), aIndexName.schema.begin(), to_lower() );
  3969. transform( aIndexName.table.begin(), aIndexName.table.end(), aIndexName.table.begin(), to_lower() );
  3970. transform( aIndexName.index.begin(), aIndexName.index.end(), aIndexName.index.begin(), to_lower() );
  3971. if (aIndexName.schema.compare(CALPONT_SCHEMA) != 0)
  3972. DEBUG << "Enter constraintInfo: " << aIndexName.schema << "|" << aIndexName.table << aIndexName.index << endl;
  3973. CalpontSelectExecutionPlan csep;
  3974. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  3975. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  3976. CalpontSelectExecutionPlan::ColumnMap colMap;
  3977. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTNAME_COL, fSessionID);
  3978. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+SCHEMA_COL, fSessionID);
  3979. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+TABLENAME_COL, fSessionID);
  3980. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTTYPE_COL, fSessionID);
  3981. SimpleColumn *c5 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTTEXT_COL, fSessionID);
  3982. SimpleColumn *c6 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+REFERENCEDSCHEMA_COL, fSessionID);
  3983. SimpleColumn *c7 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+REFERENCEDTABLENAME_COL, fSessionID);
  3984. SimpleColumn *c8 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+REFERENCEDCONSTRAINTNAME_COL, fSessionID);
  3985. SimpleColumn *c9 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTSTATUS_COL, fSessionID);
  3986. SRCP srcp;
  3987. srcp.reset(c1);
  3988. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTNAME_COL, srcp));
  3989. srcp.reset(c2);
  3990. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+SCHEMA_COL, srcp));
  3991. srcp.reset(c3);
  3992. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+TABLENAME_COL, srcp));
  3993. srcp.reset(c4);
  3994. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTTYPE_COL, srcp));
  3995. srcp.reset(c5);
  3996. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTTEXT_COL, srcp));
  3997. srcp.reset(c6);
  3998. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+REFERENCEDSCHEMA_COL, srcp));
  3999. srcp.reset(c7);
  4000. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+REFERENCEDTABLENAME_COL, srcp));
  4001. srcp.reset(c8);
  4002. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+REFERENCEDCONSTRAINTNAME_COL, srcp));
  4003. srcp.reset(c9);
  4004. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTSTATUS_COL, srcp));
  4005. csep.columnMapNonStatic(colMap);
  4006. srcp.reset(c1->clone());
  4007. returnedColumnList.push_back(srcp);
  4008. csep.returnedCols(returnedColumnList);
  4009. OID oid4 = c4->oid();
  4010. OID oid5 = DICTOID_SYSCONSTRAINT_CONSTRAINTTEXT;
  4011. OID oid6 = DICTOID_SYSCONSTRAINT_REFERENCEDSCHEMA;
  4012. OID oid7 = DICTOID_SYSCONSTRAINT_REFERENCEDTABLENAME;
  4013. OID oid8 = DICTOID_SYSCONSTRAINT_REFERENCEDCONSTRAINTNAME;
  4014. OID oid9 = DICTOID_SYSCONSTRAINT_CONSTRAINTSTATUS;
  4015. // Filters
  4016. SimpleFilter *f1 = new SimpleFilter (opeq,
  4017. c2->clone(),
  4018. new ConstantColumn(aIndexName.schema, ConstantColumn::LITERAL));
  4019. filterTokenList.push_back(f1);
  4020. filterTokenList.push_back(new Operator("and"));
  4021. SimpleFilter *f2 = new SimpleFilter (opeq,
  4022. c3->clone(),
  4023. new ConstantColumn(aIndexName.table, ConstantColumn::LITERAL));
  4024. filterTokenList.push_back(f2);
  4025. filterTokenList.push_back(new Operator("and"));
  4026. SimpleFilter *f3 = new SimpleFilter (opeq,
  4027. c1->clone(),
  4028. new ConstantColumn(aIndexName.index, ConstantColumn::LITERAL));
  4029. filterTokenList.push_back(f3);
  4030. csep.filterTokenList(filterTokenList);
  4031. NJLSysDataList sysDataList;
  4032. getSysData (csep, sysDataList, SYSCONSTRAINT_TABLE);
  4033. vector<ColumnResult*>::const_iterator it;
  4034. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  4035. {
  4036. if ((*it)->dataCount() == 0)
  4037. {
  4038. string msg("CalpontSystemCatalog::constraintInfo: no constraint info found for ");
  4039. msg += indexName.schema;
  4040. msg += ".";
  4041. msg += indexName.table;
  4042. msg += ".";
  4043. msg += indexName.index;
  4044. throw runtime_error(msg);
  4045. }
  4046. if ((*it)->ColumnOID() == oid4)
  4047. {
  4048. if ((*it)->GetData(0) == 'p')
  4049. constraintInfo.constraintType = PRIMARYKEY_CONSTRAINT;
  4050. else if ((*it)->GetData(0) == 'f')
  4051. constraintInfo.constraintType = REFERENCE_CONSTRAINT;
  4052. else if ((*it)->GetData(0) == 'n')
  4053. constraintInfo.constraintType = NOTNULL_CONSTRAINT;
  4054. else if ((*it)->GetData(0) == 'c')
  4055. constraintInfo.constraintType = CHECK_CONSTRAINT;
  4056. else if ((*it)->GetData(0) == 'u')
  4057. constraintInfo.constraintType = UNIQUE_CONSTRAINT;
  4058. else if ((*it)->GetData(0) == '0')
  4059. constraintInfo.constraintType = DEFAULT_CONSTRAINT;
  4060. else // should never be here
  4061. constraintInfo.constraintType = NO_CONSTRAINT;
  4062. continue;
  4063. }
  4064. if ((*it)->ColumnOID() == oid5)
  4065. {
  4066. constraintInfo.constraintText = (*it)->GetStringData(0);
  4067. continue;
  4068. }
  4069. if ((*it)->ColumnOID() == oid6)
  4070. {
  4071. constraintInfo.referenceSchema = (*it)->GetStringData(0);
  4072. continue;
  4073. }
  4074. if ((*it)->ColumnOID() == oid7)
  4075. {
  4076. constraintInfo.referenceTable = (*it)->GetStringData(0);
  4077. continue;
  4078. }
  4079. if ((*it)->ColumnOID() == oid8)
  4080. {
  4081. constraintInfo.referencePKName = (*it)->GetStringData(0);
  4082. continue;
  4083. }
  4084. if ((*it)->ColumnOID() == oid9)
  4085. {
  4086. constraintInfo.constraintStatus = (*it)->GetStringData(0);
  4087. continue;
  4088. }
  4089. }
  4090. constraintInfo.constraintName = aIndexName;
  4091. return constraintInfo;
  4092. }
  4093. const CalpontSystemCatalog::IndexNameList CalpontSystemCatalog::referenceConstraints( const IndexName& referencePKName)
  4094. {
  4095. /* SQL statement: select schema, tablename, constraintname from sysconstraint
  4096. where referencedTableName = referencePKName.table
  4097. and referencedSchema=referencePKName.schema
  4098. and referencedConstraintName=referencePKName.index
  4099. and constraintType = 'f';*/
  4100. IndexName aIndexName;
  4101. aIndexName.schema = referencePKName.schema;
  4102. aIndexName.table = referencePKName.table;
  4103. aIndexName.index = referencePKName.index;
  4104. transform( aIndexName.schema.begin(), aIndexName.schema.end(), aIndexName.schema.begin(), to_lower() );
  4105. transform( aIndexName.table.begin(), aIndexName.table.end(), aIndexName.table.begin(), to_lower() );
  4106. transform( aIndexName.index.begin(), aIndexName.index.end(), aIndexName.index.begin(), to_lower() );
  4107. if (aIndexName.schema.compare(CALPONT_SCHEMA) != 0)
  4108. DEBUG << "Enter referenceConstraints: " << aIndexName.schema << "|" << aIndexName.table << aIndexName.index << endl;
  4109. CalpontSelectExecutionPlan csep;
  4110. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  4111. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  4112. CalpontSelectExecutionPlan::ColumnMap colMap;
  4113. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTNAME_COL, fSessionID);
  4114. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+SCHEMA_COL, fSessionID);
  4115. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+TABLENAME_COL, fSessionID);
  4116. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTTYPE_COL, fSessionID);
  4117. SimpleColumn *c6 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+REFERENCEDSCHEMA_COL, fSessionID);
  4118. SimpleColumn *c7 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+REFERENCEDTABLENAME_COL, fSessionID);
  4119. SimpleColumn *c8 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+REFERENCEDCONSTRAINTNAME_COL, fSessionID);
  4120. SRCP srcp;
  4121. srcp.reset(c1);
  4122. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTNAME_COL, srcp));
  4123. srcp.reset(c2);
  4124. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+SCHEMA_COL, srcp));
  4125. srcp.reset(c3);
  4126. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+TABLENAME_COL, srcp));
  4127. srcp.reset(c4);
  4128. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTTYPE_COL, srcp));
  4129. srcp.reset(c6);
  4130. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+REFERENCEDSCHEMA_COL, srcp));
  4131. srcp.reset(c7);
  4132. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+REFERENCEDTABLENAME_COL, srcp));
  4133. srcp.reset(c8);
  4134. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+REFERENCEDCONSTRAINTNAME_COL, srcp));
  4135. csep.columnMapNonStatic(colMap);
  4136. srcp.reset(c1->clone());
  4137. returnedColumnList.push_back(srcp);
  4138. csep.returnedCols(returnedColumnList);
  4139. OID oid1 = DICTOID_SYSCONSTRAINT_CONSTRAINTNAME;
  4140. OID oid2 = DICTOID_SYSCONSTRAINT_SCHEMA;
  4141. OID oid3 = DICTOID_SYSCONSTRAINT_TABLENAME;
  4142. // Filters
  4143. SimpleFilter *f1 = new SimpleFilter (opeq,
  4144. c6->clone(),
  4145. new ConstantColumn(aIndexName.schema, ConstantColumn::LITERAL));
  4146. filterTokenList.push_back(f1);
  4147. filterTokenList.push_back(new Operator("and"));
  4148. SimpleFilter *f2 = new SimpleFilter (opeq,
  4149. c7->clone(),
  4150. new ConstantColumn(aIndexName.table, ConstantColumn::LITERAL));
  4151. filterTokenList.push_back(f2);
  4152. filterTokenList.push_back(new Operator("and"));
  4153. SimpleFilter *f3 = new SimpleFilter (opeq,
  4154. c8->clone(),
  4155. new ConstantColumn(aIndexName.index, ConstantColumn::LITERAL));
  4156. filterTokenList.push_back(f3);
  4157. filterTokenList.push_back(new Operator("and"));
  4158. SimpleFilter *f4 = new SimpleFilter(opeq,
  4159. c4->clone(),
  4160. new ConstantColumn("f", ConstantColumn::LITERAL));
  4161. filterTokenList.push_back(f4);
  4162. csep.filterTokenList(filterTokenList);
  4163. NJLSysDataList sysDataList;
  4164. getSysData (csep, sysDataList, SYSCONSTRAINT_TABLE);
  4165. //IndexNameList indexNameList;
  4166. vector<IndexName> indexNameList;
  4167. vector<ColumnResult*>::const_iterator it;
  4168. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  4169. {
  4170. if ((*it)->ColumnOID() == oid1)
  4171. {
  4172. for (int i = 0; i < (*it)->dataCount(); i++)
  4173. {
  4174. IndexName indexName;
  4175. indexName.index = (*it)->GetStringData(i);
  4176. indexNameList.push_back(indexName);
  4177. }
  4178. break;
  4179. }
  4180. }
  4181. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  4182. {
  4183. if ((*it)->ColumnOID() == oid2)
  4184. {
  4185. for (int i = 0; i < (*it)->dataCount(); i++)
  4186. {
  4187. indexNameList[i].schema = (*it)->GetStringData(i);
  4188. }
  4189. continue;
  4190. }
  4191. if ((*it)->ColumnOID() == oid3)
  4192. {
  4193. for (int i = 0; i < (*it)->dataCount(); i++)
  4194. {
  4195. indexNameList[i].table = (*it)->GetStringData(i);
  4196. }
  4197. continue;
  4198. }
  4199. }
  4200. return indexNameList;
  4201. }
  4202. const string CalpontSystemCatalog::primaryKeyName (const TableName& tableName )
  4203. {
  4204. TableName aTableName;
  4205. aTableName.schema = tableName.schema;
  4206. aTableName.table = tableName.table;
  4207. transform( aTableName.schema.begin(), aTableName.schema.end(), aTableName.schema.begin(), to_lower() );
  4208. transform( aTableName.table.begin(), aTableName.table.end(), aTableName.table.begin(), to_lower() );
  4209. if (tableName.schema.compare(CALPONT_SCHEMA) != 0)
  4210. DEBUG << "Enter primaryKeyName: " << tableName.schema << "|" << tableName.table << endl;
  4211. string primaryKeyName = "";
  4212. CalpontSelectExecutionPlan csep;
  4213. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  4214. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  4215. CalpontSelectExecutionPlan::ColumnMap colMap;
  4216. SimpleColumn *c1 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTNAME_COL, fSessionID);
  4217. SimpleColumn *c2 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+SCHEMA_COL, fSessionID);
  4218. SimpleColumn *c3 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+TABLENAME_COL, fSessionID);
  4219. SimpleColumn *c4 = new SimpleColumn(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTTYPE_COL, fSessionID);
  4220. SRCP srcp;
  4221. srcp.reset(c1);
  4222. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTNAME_COL, srcp));
  4223. srcp.reset(c2);
  4224. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+SCHEMA_COL, srcp));
  4225. srcp.reset(c3);
  4226. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+TABLENAME_COL, srcp));
  4227. srcp.reset(c4);
  4228. colMap.insert(CMVT_(CALPONT_SCHEMA+"."+SYSCONSTRAINT_TABLE+"."+CONSTRAINTTYPE_COL, srcp));
  4229. csep.columnMapNonStatic(colMap);
  4230. srcp.reset(c1->clone());
  4231. returnedColumnList.push_back(srcp);
  4232. csep.returnedCols(returnedColumnList);
  4233. OID oid1 = DICTOID_SYSCONSTRAINT_CONSTRAINTNAME;
  4234. // Filters
  4235. SimpleFilter *f1 = new SimpleFilter (opeq,
  4236. c2->clone(),
  4237. new ConstantColumn(aTableName.schema, ConstantColumn::LITERAL));
  4238. filterTokenList.push_back(f1);
  4239. filterTokenList.push_back(new Operator("and"));
  4240. SimpleFilter *f2 = new SimpleFilter (opeq,
  4241. c3->clone(),
  4242. new ConstantColumn(aTableName.table, ConstantColumn::LITERAL));
  4243. filterTokenList.push_back(f2);
  4244. filterTokenList.push_back(new Operator("and"));
  4245. SimpleFilter *f3 = new SimpleFilter (opeq,
  4246. c4->clone(),
  4247. new ConstantColumn("p", ConstantColumn::LITERAL));
  4248. filterTokenList.push_back(f3);
  4249. csep.filterTokenList(filterTokenList);
  4250. NJLSysDataList sysDataList;
  4251. getSysData (csep, sysDataList, SYSCONSTRAINT_TABLE);
  4252. vector<ColumnResult*>::const_iterator it;
  4253. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  4254. {
  4255. if ((*it)->ColumnOID() == oid1 && (*it)->dataCount() == 1)
  4256. {
  4257. primaryKeyName = (*it)->GetStringData(0);
  4258. break;
  4259. }
  4260. }
  4261. return primaryKeyName;
  4262. }
  4263. #endif
  4264. void CalpontSystemCatalog::getSchemaInfo(const string& in_schema)
  4265. {
  4266. string schema = in_schema;
  4267. transform( schema.begin(), schema.end(), schema.begin(), to_lower() );
  4268. if (schema == CALPONT_SCHEMA)
  4269. return;
  4270. else
  4271. DEBUG << "Enter getSchemaInfo: " << schema << endl;
  4272. //Check whether cache needs to be flushed
  4273. checkSysCatVer();
  4274. boost::mutex::scoped_lock lk(fSchemaCacheLock);
  4275. set<string>::iterator setIt = fSchemaCache.find(schema);
  4276. if (setIt != fSchemaCache.end())
  4277. {
  4278. DEBUG << "getSchemaInfo Cached" << endl;
  4279. return;
  4280. }
  4281. lk.unlock();
  4282. // get table info first
  4283. getTables(schema);
  4284. // get column info now
  4285. RIDList rl;
  4286. // get real data from system catalog for all user tables under the schema
  4287. CalpontSelectExecutionPlan csep;
  4288. CalpontSelectExecutionPlan::ReturnedColumnList returnedColumnList;
  4289. CalpontSelectExecutionPlan::FilterTokenList filterTokenList;
  4290. CalpontSelectExecutionPlan::ColumnMap colMap;
  4291. string columnlength = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COLUMNLEN_COL;
  4292. string objectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+OBJECTID_COL;
  4293. string datatype = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+DATATYPE_COL;
  4294. string dictobjectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+DICTOID_COL;
  4295. string listobjectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+LISTOBJID_COL;
  4296. string treeobjectid = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TREEOBJID_COL;
  4297. string columnposition = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COLUMNPOS_COL;
  4298. string scale = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+SCALE_COL;
  4299. string precision = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+PRECISION_COL;
  4300. string defaultvalue = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+DEFAULTVAL_COL;
  4301. // the following columns will be save in cache although it's not needed for now
  4302. string columnname = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COLNAME_COL;
  4303. string tablename = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+TABLENAME_COL;
  4304. string schemaname = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+SCHEMA_COL;
  4305. string nullable = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+NULLABLE_COL;
  4306. string compressiontype = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+COMPRESSIONTYPE_COL;
  4307. string autoinc = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+AUTOINC_COL;
  4308. string nextval = CALPONT_SCHEMA+"."+SYSCOLUMN_TABLE+"."+NEXTVALUE_COL;
  4309. SimpleColumn* col[17];
  4310. col[0] = new SimpleColumn(columnlength, fSessionID);
  4311. col[1] = new SimpleColumn(objectid, fSessionID);
  4312. col[2] = new SimpleColumn(datatype, fSessionID);
  4313. col[3] = new SimpleColumn(dictobjectid, fSessionID);
  4314. col[4] = new SimpleColumn(listobjectid, fSessionID);
  4315. col[5] = new SimpleColumn(treeobjectid, fSessionID);
  4316. col[6] = new SimpleColumn(columnposition, fSessionID);
  4317. col[7] = new SimpleColumn(scale, fSessionID);
  4318. col[8] = new SimpleColumn(precision, fSessionID);
  4319. col[9] = new SimpleColumn(defaultvalue, fSessionID);
  4320. col[10] = new SimpleColumn(schemaname, fSessionID);
  4321. col[11] = new SimpleColumn(tablename, fSessionID);
  4322. col[12] = new SimpleColumn(columnname, fSessionID);
  4323. col[13] = new SimpleColumn(nullable, fSessionID);
  4324. col[14] = new SimpleColumn(compressiontype, fSessionID);
  4325. col[15] = new SimpleColumn(autoinc, fSessionID);
  4326. col[16] = new SimpleColumn(nextval, fSessionID);
  4327. SRCP srcp;
  4328. srcp.reset(col[0]);
  4329. colMap.insert(CMVT_(columnlength, srcp));
  4330. srcp.reset(col[1]);
  4331. colMap.insert(CMVT_(objectid, srcp));
  4332. srcp.reset(col[2]);
  4333. colMap.insert(CMVT_(datatype, srcp));
  4334. srcp.reset(col[3]);
  4335. colMap.insert(CMVT_(dictobjectid, srcp));
  4336. srcp.reset(col[4]);
  4337. colMap.insert(CMVT_(listobjectid, srcp));
  4338. srcp.reset(col[5]);
  4339. colMap.insert(CMVT_(treeobjectid, srcp));
  4340. srcp.reset(col[6]);
  4341. colMap.insert(CMVT_(columnposition, srcp));
  4342. srcp.reset(col[7]);
  4343. colMap.insert(CMVT_(scale, srcp));
  4344. srcp.reset(col[8]);
  4345. colMap.insert(CMVT_(precision, srcp));
  4346. // TODO: NULL value handling & convert to boost::any
  4347. // delete this manually at fcn exit
  4348. srcp.reset(col[9]);
  4349. colMap.insert(CMVT_(defaultvalue, srcp));
  4350. srcp.reset(col[10]);
  4351. colMap.insert(CMVT_(schemaname, srcp));
  4352. srcp.reset(col[11]);
  4353. colMap.insert(CMVT_(tablename, srcp));
  4354. srcp.reset(col[12]);
  4355. colMap.insert(CMVT_(columnname, srcp));
  4356. srcp.reset(col[13]);
  4357. colMap.insert(CMVT_(nullable, srcp));
  4358. srcp.reset(col[14]);
  4359. colMap.insert(CMVT_(compressiontype, srcp));
  4360. srcp.reset(col[15]);
  4361. colMap.insert(CMVT_(autoinc, srcp));
  4362. srcp.reset(col[16]);
  4363. colMap.insert(CMVT_(nextval, srcp));
  4364. csep.columnMapNonStatic(colMap);
  4365. srcp.reset(col[1]->clone());
  4366. returnedColumnList.push_back(srcp);
  4367. csep.returnedCols(returnedColumnList);
  4368. OID oid[17];
  4369. for (int i = 0; i < 17; i++)
  4370. oid[i] = col[i]->oid();
  4371. oid[12] = DICTOID_SYSCOLUMN_COLNAME;
  4372. oid[11] = DICTOID_SYSCOLUMN_TABLENAME;
  4373. // Filters
  4374. SimpleFilter *f1 = new SimpleFilter (opeq,
  4375. col[10]->clone(),
  4376. new ConstantColumn(schema, ConstantColumn::LITERAL));
  4377. filterTokenList.push_back(f1);
  4378. csep.filterTokenList(filterTokenList);
  4379. ostringstream oss;
  4380. oss << "select objectid,columnname from syscolumn where schema='" << schema << "' --getSchemaInfo/";
  4381. if (fIdentity == EC) oss << "EC";
  4382. else oss << "FE";
  4383. csep.data(oss.str());
  4384. NJLSysDataList sysDataList;
  4385. getSysData (csep, sysDataList, SYSCOLUMN_TABLE);
  4386. vector<ColumnResult*>::const_iterator it;
  4387. ColType ct;
  4388. //ColType *ctList = NULL;
  4389. vector<ColType> ctList;
  4390. vector<string> tableNames;
  4391. TableInfo ti;
  4392. map<string, TableInfo> tbInfo;
  4393. map<string, TableInfo>::iterator tbIter;
  4394. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  4395. {
  4396. if ((*it)->ColumnOID() == oid[1]) // objectid
  4397. {
  4398. for (int i = 0 ; i < (*it)->dataCount(); i++)
  4399. {
  4400. ROPair rp;
  4401. rp.objnum = (*it)->GetData(i);
  4402. if (fIdentity == EC)
  4403. rp.rid = (*it)->GetRid(i);
  4404. //DEBUG << rp.rid << " ";
  4405. rl.push_back(rp);
  4406. ColType ct;
  4407. ct.columnOID = rp.objnum;
  4408. ctList.push_back(ct);
  4409. }
  4410. DEBUG << endl;
  4411. }
  4412. // table name
  4413. else if ((*it)->ColumnOID() == oid[11])
  4414. {
  4415. for (int i = 0; i < (*it)->dataCount(); i++)
  4416. {
  4417. tableNames.push_back((*it)->GetStringData(i));
  4418. tbIter = tbInfo.find(tableNames[i]);
  4419. if (tbIter == tbInfo.end())
  4420. {
  4421. tbInfo[tableNames[i]].numOfCols = 1;
  4422. }
  4423. else
  4424. tbInfo[tableNames[i]].numOfCols += 1;
  4425. }
  4426. }
  4427. }
  4428. // loop 3rd time to populate col cache
  4429. for (it = sysDataList.begin(); it != sysDataList.end(); it++)
  4430. {
  4431. if ((*it)->ColumnOID() == oid[15])
  4432. {
  4433. for (int i = 0; i < (*it)->dataCount(); i++)
  4434. {
  4435. ostringstream os;
  4436. os << (char) (*it)->GetData(i);
  4437. tbIter = tbInfo.find(tableNames[i]);
  4438. if (tbIter == tbInfo.end())
  4439. {
  4440. if (os.str().compare("y") == 0)
  4441. {
  4442. tbInfo[tableNames[i]].tablewithautoincr = AUTOINCRCOL;
  4443. }
  4444. else
  4445. {
  4446. tbInfo[tableNames[i]].tablewithautoincr = NO_AUTOINCRCOL;
  4447. }
  4448. }
  4449. }
  4450. }
  4451. // column name
  4452. else if ((*it)->ColumnOID() == oid[12])
  4453. {
  4454. //lk2.lock();
  4455. for (int i = 0; i < (*it)->dataCount(); i++)
  4456. {
  4457. TableColName tcn = make_tcn(schema, tableNames[i], (*it)->GetStringData(i));
  4458. fOIDmap[tcn] = rl[i].objnum;
  4459. if (fIdentity == EC)
  4460. fColRIDmap[tcn] = rl[i].rid;
  4461. }
  4462. //lk2.unlock();
  4463. }
  4464. else if ((*it)->ColumnOID() == oid[0])
  4465. {
  4466. for (int i = 0; i < (*it)->dataCount(); i++)
  4467. ctList[i].colWidth = (*it)->GetData(i);
  4468. }
  4469. else if ((*it)->ColumnOID() == oid[2])
  4470. {
  4471. for (int i = 0; i < (*it)->dataCount(); i++)
  4472. ctList[i].colDataType = (ColDataType)((*it)->GetData(i));
  4473. }
  4474. else if ((*it)->ColumnOID() == oid[3])
  4475. {
  4476. for (int i = 0; i < (*it)->dataCount(); i++)
  4477. ctList[i].ddn.dictOID = ((*it)->GetData(i));
  4478. }
  4479. else if ((*it)->ColumnOID() == oid[4])
  4480. {
  4481. for (int i = 0; i < (*it)->dataCount(); i++)
  4482. ctList[i].ddn.listOID = ((*it)->GetData(i));
  4483. }
  4484. else if ((*it)->ColumnOID() == oid[5])
  4485. {
  4486. for (int i = 0; i < (*it)->dataCount(); i++)
  4487. ctList[i].ddn.treeOID = ((*it)->GetData(i));
  4488. }
  4489. else if ((*it)->ColumnOID() == oid[6])
  4490. {
  4491. for (int i = 0; i < (*it)->dataCount(); i++)
  4492. ctList[i].colPosition = ((*it)->GetData(i));
  4493. }
  4494. else if ((*it)->ColumnOID() == oid[7])
  4495. {
  4496. for (int i = 0; i < (*it)->dataCount(); i++)
  4497. ctList[i].scale = ((*it)->GetData(i));
  4498. }
  4499. else if ((*it)->ColumnOID() == oid[8])
  4500. {
  4501. for (int i = 0; i < (*it)->dataCount(); i++)
  4502. ctList[i].precision = ((*it)->GetData(i));
  4503. }
  4504. else if ((*it)->ColumnOID() == DICTOID_SYSCOLUMN_DEFAULTVAL)
  4505. {
  4506. for (int i = 0; i < (*it)->dataCount(); i++)
  4507. {
  4508. ctList[i].defaultValue = ((*it)->GetStringData(i));
  4509. if ((!ctList[i].defaultValue.empty()) || (ctList[i].defaultValue.length() > 0))
  4510. {
  4511. if (ctList[i].constraintType != NOTNULL_CONSTRAINT)
  4512. ctList[i].constraintType = DEFAULT_CONSTRAINT;
  4513. }
  4514. }
  4515. }
  4516. else if ((*it)->ColumnOID() == oid[13])
  4517. {
  4518. for (int i = 0; i < (*it)->dataCount(); i++)
  4519. if ((*it)->GetData(i) == 0)
  4520. ctList[i].constraintType = NOTNULL_CONSTRAINT;
  4521. }
  4522. else if ((*it)->ColumnOID() == oid[14])
  4523. {
  4524. for (int i = 0; i < (*it)->dataCount(); i++)
  4525. ctList[i].compressionType = ctList[i].ddn.compressionType = ((*it)->GetData(i));
  4526. }
  4527. else if ((*it)->ColumnOID() == oid[15])
  4528. {
  4529. for (int i = 0; i < (*it)->dataCount(); i++)
  4530. {
  4531. ostringstream os;
  4532. os << (char) (*it)->GetData(i);
  4533. if (os.str().compare("y") == 0)
  4534. ctList[i].autoincrement = true;
  4535. else
  4536. ctList[i].autoincrement = false;
  4537. }
  4538. }
  4539. else if ((*it)->ColumnOID() == oid[16])
  4540. {
  4541. for (int i = 0; i < (*it)->dataCount(); i++)
  4542. ctList[i].nextvalue = ((*it)->GetData(i));
  4543. }
  4544. }
  4545. // populate colinfo cache
  4546. //boost::mutex::scoped_lock lk3(fColinfomapLock);
  4547. for (uint32_t i = 0; i < ctList.size(); i++)
  4548. fColinfomap[ctList[i].columnOID] = ctList[i];
  4549. //lk3.unlock();
  4550. // populate tbinfomap
  4551. for (tbIter = tbInfo.begin(); tbIter != tbInfo.end(); ++tbIter)
  4552. {
  4553. TableName tn(schema, tbIter->first);
  4554. //ti.numOfCols = (tbIter->second).numOfCols;
  4555. //ti.tablewithautoincr = (tbIter->second).withAutoInc;
  4556. fTableInfoMap[tn] = tbIter->second;
  4557. DEBUG << tbIter->first << " " << tbIter->second.numOfCols << " " << (tbIter->second).tablewithautoincr << endl;
  4558. }
  4559. //delete col[9];
  4560. lk.lock();
  4561. fSchemaCache.insert(schema);
  4562. lk.unlock();
  4563. }
  4564. #if 0
  4565. ostream& operator<<(ostream& os, const CalpontSystemCatalog::TableName& rhs)
  4566. {
  4567. os << rhs.schema << '.' << rhs.table;
  4568. return os;
  4569. }
  4570. #endif
  4571. const string CalpontSystemCatalog::TableName::toString() const
  4572. {
  4573. string str = schema + "." + table;
  4574. return str;
  4575. }
  4576. ostream& operator<<(ostream& os, const CalpontSystemCatalog::TableAliasName& rhs)
  4577. {
  4578. os << rhs.schema << '.' << rhs.table << "(" << rhs.alias << "/" << rhs.view
  4579. << ") engineType=" << (rhs.fIsInfiniDB? "InfiniDB" : "ForeignEngine");
  4580. return os;
  4581. }
  4582. ostream& operator<<(ostream& os, const CalpontSystemCatalog::TableColName& rhs)
  4583. {
  4584. os << rhs.toString();
  4585. return os;
  4586. }
  4587. void CalpontSystemCatalog::flushCache()
  4588. {
  4589. boost::mutex::scoped_lock lk1(fOIDmapLock);
  4590. fOIDmap.clear();
  4591. buildSysOIDmap();
  4592. lk1.unlock();
  4593. boost::mutex::scoped_lock lk2(fColinfomapLock);
  4594. fColinfomap.clear();
  4595. buildSysColinfomap();
  4596. lk2.unlock();
  4597. boost::mutex::scoped_lock lk3(fTableInfoMapLock);
  4598. fTableInfoMap.clear();
  4599. fTablemap.clear();
  4600. fTableRIDmap.clear();
  4601. buildSysTablemap();
  4602. lk3.unlock();
  4603. boost::mutex::scoped_lock lk4(fDctTokenMapLock);
  4604. fDctTokenMap.clear();
  4605. buildSysDctmap();
  4606. lk4.unlock();
  4607. fSyscatSCN = fSessionManager->sysCatVerID().currentScn;
  4608. //cout << "Cache flushed and current sysCatVerID is " << newScn << endl;
  4609. }
  4610. void CalpontSystemCatalog::updateColinfoCache(CalpontSystemCatalog::OIDNextvalMap & oidNextvalMap)
  4611. {
  4612. boost::mutex::scoped_lock lk(fColinfomapLock);
  4613. CalpontSystemCatalog::OIDNextvalMap::const_iterator iter = oidNextvalMap.begin();
  4614. OID oid = 0;
  4615. long long nextVal = 0;
  4616. while (iter != oidNextvalMap.end())
  4617. {
  4618. oid = (*iter).first;
  4619. nextVal = (*iter).second;
  4620. fColinfomap[oid].nextvalue = nextVal;
  4621. iter++;
  4622. }
  4623. }
  4624. void CalpontSystemCatalog::buildSysColinfomap()
  4625. {
  4626. ColType aCol;
  4627. // aCol.defaultValue = "";
  4628. aCol.scale = 0;
  4629. aCol.precision = 10;
  4630. aCol.compressionType = 0;
  4631. ResourceManager rm;
  4632. if( rm.useHdfs() )
  4633. aCol.compressionType = 2;
  4634. DictOID notDict;
  4635. // @bug 4433 - Increase object width from 64 to 128 for schema names, table names, and column names.
  4636. aCol.colWidth = 129; // @bug 4433
  4637. aCol.constraintType = NOTNULL_CONSTRAINT;
  4638. aCol.colDataType = VARCHAR;
  4639. aCol.ddn.dictOID = DICTOID_SYSTABLE_TABLENAME;
  4640. aCol.ddn.listOID = LISTOID_SYSTABLE_TABLENAME;
  4641. aCol.ddn.treeOID = TREEOID_SYSTABLE_TABLENAME;
  4642. aCol.ddn.compressionType = aCol.compressionType;
  4643. aCol.colPosition = 0;
  4644. aCol.columnOID = OID_SYSTABLE_TABLENAME;
  4645. fColinfomap[aCol.columnOID] = aCol;
  4646. aCol.colWidth = 129; // @bug 4433
  4647. aCol.constraintType = NOTNULL_CONSTRAINT;
  4648. aCol.colDataType = VARCHAR;
  4649. aCol.ddn.dictOID = DICTOID_SYSTABLE_SCHEMA;
  4650. aCol.ddn.listOID = LISTOID_SYSTABLE_SCHEMA;
  4651. aCol.ddn.treeOID = TREEOID_SYSTABLE_SCHEMA;
  4652. aCol.ddn.compressionType = aCol.compressionType;
  4653. aCol.colPosition++;
  4654. aCol.columnOID = OID_SYSTABLE_SCHEMA;
  4655. fColinfomap[aCol.columnOID] = aCol;
  4656. aCol.colWidth = 4;
  4657. aCol.constraintType = NOTNULL_CONSTRAINT;
  4658. aCol.colDataType = INT;
  4659. aCol.ddn = notDict;
  4660. aCol.colPosition++;
  4661. aCol.columnOID = OID_SYSTABLE_OBJECTID;
  4662. fColinfomap[aCol.columnOID] = aCol;
  4663. aCol.colWidth = 4;
  4664. aCol.constraintType = NOTNULL_CONSTRAINT;
  4665. aCol.colDataType = DATE;
  4666. aCol.ddn = notDict;
  4667. aCol.colPosition++;
  4668. aCol.columnOID = OID_SYSTABLE_CREATEDATE;
  4669. fColinfomap[aCol.columnOID] = aCol;
  4670. aCol.colWidth = 4;
  4671. aCol.constraintType = NOTNULL_CONSTRAINT;
  4672. aCol.colDataType = DATE;
  4673. aCol.ddn = notDict;
  4674. aCol.colPosition++;
  4675. aCol.columnOID = OID_SYSTABLE_LASTUPDATE;
  4676. fColinfomap[aCol.columnOID] = aCol;
  4677. aCol.colWidth = 4;
  4678. aCol.constraintType = NO_CONSTRAINT;
  4679. aCol.colDataType = INT;
  4680. aCol.ddn = notDict;
  4681. aCol.colPosition++;
  4682. aCol.columnOID = OID_SYSTABLE_INIT;
  4683. fColinfomap[aCol.columnOID] = aCol;
  4684. aCol.colWidth = 4;
  4685. aCol.constraintType = NO_CONSTRAINT;
  4686. aCol.colDataType = INT;
  4687. aCol.ddn = notDict;
  4688. aCol.colPosition++;
  4689. aCol.columnOID = OID_SYSTABLE_NEXT;
  4690. fColinfomap[aCol.columnOID] = aCol;
  4691. aCol.colWidth = 4;
  4692. aCol.constraintType = NO_CONSTRAINT;
  4693. aCol.colDataType = INT;
  4694. aCol.ddn = notDict;
  4695. aCol.colPosition++;
  4696. aCol.columnOID = OID_SYSTABLE_NUMOFROWS;
  4697. fColinfomap[aCol.columnOID] = aCol;
  4698. aCol.colWidth = 4;
  4699. aCol.constraintType = NO_CONSTRAINT;
  4700. aCol.colDataType = INT;
  4701. aCol.ddn = notDict;
  4702. aCol.colPosition++;
  4703. aCol.columnOID = OID_SYSTABLE_AVGROWLEN;
  4704. fColinfomap[aCol.columnOID] = aCol;
  4705. aCol.colWidth = 4;
  4706. aCol.constraintType = NO_CONSTRAINT;
  4707. aCol.colDataType = INT;
  4708. aCol.ddn = notDict;
  4709. aCol.colPosition++;
  4710. aCol.columnOID = OID_SYSTABLE_NUMOFBLOCKS;
  4711. fColinfomap[aCol.columnOID] = aCol;
  4712. aCol.colWidth = 4;
  4713. aCol.constraintType = NO_CONSTRAINT;
  4714. aCol.colDataType = INT;
  4715. aCol.ddn = notDict;
  4716. aCol.colPosition++;
  4717. aCol.columnOID = OID_SYSTABLE_AUTOINCREMENT;
  4718. fColinfomap[aCol.columnOID] = aCol;
  4719. fTablemap[make_table(CALPONT_SCHEMA, SYSCOLUMN_TABLE )] = SYSCOLUMN_BASE;
  4720. aCol.colWidth = 129; // @bug 4433
  4721. aCol.constraintType = NOTNULL_CONSTRAINT;
  4722. aCol.colDataType = VARCHAR;
  4723. aCol.ddn.dictOID = DICTOID_SYSCOLUMN_SCHEMA;
  4724. aCol.ddn.listOID = LISTOID_SYSCOLUMN_SCHEMA;
  4725. aCol.ddn.treeOID = TREEOID_SYSCOLUMN_SCHEMA;
  4726. aCol.ddn.compressionType = aCol.compressionType;
  4727. aCol.colPosition = 0;
  4728. aCol.columnOID = OID_SYSCOLUMN_SCHEMA;
  4729. fColinfomap[aCol.columnOID] = aCol;
  4730. aCol.colWidth = 129; // @bug 4433
  4731. aCol.constraintType = NOTNULL_CONSTRAINT;
  4732. aCol.colDataType = VARCHAR;
  4733. aCol.ddn.dictOID = DICTOID_SYSCOLUMN_TABLENAME;
  4734. aCol.ddn.listOID = LISTOID_SYSCOLUMN_TABLENAME;
  4735. aCol.ddn.treeOID = TREEOID_SYSCOLUMN_TABLENAME;
  4736. aCol.ddn.compressionType = aCol.compressionType;
  4737. aCol.colPosition++;
  4738. aCol.columnOID = OID_SYSCOLUMN_TABLENAME;
  4739. fColinfomap[aCol.columnOID] = aCol;
  4740. aCol.colWidth = 129; // @bug 4433
  4741. aCol.constraintType = NOTNULL_CONSTRAINT;
  4742. aCol.colDataType = VARCHAR;
  4743. aCol.ddn.dictOID = DICTOID_SYSCOLUMN_COLNAME;
  4744. aCol.ddn.listOID = LISTOID_SYSCOLUMN_COLNAME;
  4745. aCol.ddn.treeOID = TREEOID_SYSCOLUMN_COLNAME;
  4746. aCol.ddn.compressionType = aCol.compressionType;
  4747. aCol.colPosition++;
  4748. aCol.columnOID = OID_SYSCOLUMN_COLNAME;
  4749. fColinfomap[aCol.columnOID] = aCol;
  4750. aCol.colWidth = 4;
  4751. aCol.constraintType = NOTNULL_CONSTRAINT;
  4752. aCol.colDataType = INT;
  4753. aCol.ddn = notDict;
  4754. aCol.colPosition++;
  4755. aCol.columnOID = OID_SYSCOLUMN_OBJECTID;
  4756. fColinfomap[aCol.columnOID] = aCol;
  4757. aCol.colWidth = 4;
  4758. aCol.constraintType = NO_CONSTRAINT;
  4759. aCol.colDataType = INT;
  4760. aCol.ddn = notDict;
  4761. aCol.colPosition++;
  4762. aCol.columnOID = OID_SYSCOLUMN_DICTOID;
  4763. fColinfomap[aCol.columnOID] = aCol;
  4764. aCol.colWidth = 4;
  4765. aCol.constraintType = NO_CONSTRAINT;
  4766. aCol.colDataType = INT;
  4767. aCol.ddn = notDict;
  4768. aCol.colPosition++;
  4769. aCol.columnOID = OID_SYSCOLUMN_LISTOBJID;
  4770. fColinfomap[aCol.columnOID] = aCol;
  4771. aCol.colWidth = 4;
  4772. aCol.constraintType = NO_CONSTRAINT;
  4773. aCol.colDataType = INT;
  4774. aCol.ddn = notDict;
  4775. aCol.colPosition++;
  4776. aCol.columnOID = OID_SYSCOLUMN_TREEOBJID;
  4777. fColinfomap[aCol.columnOID] = aCol;
  4778. aCol.colWidth = 4;
  4779. aCol.constraintType = NOTNULL_CONSTRAINT;
  4780. aCol.colDataType = INT;
  4781. aCol.ddn = notDict;
  4782. aCol.colPosition++;
  4783. aCol.columnOID = OID_SYSCOLUMN_DATATYPE;
  4784. fColinfomap[aCol.columnOID] = aCol;
  4785. aCol.colWidth = 4;
  4786. aCol.constraintType = NOTNULL_CONSTRAINT;
  4787. aCol.colDataType = INT;
  4788. aCol.ddn = notDict;
  4789. aCol.colPosition++;
  4790. aCol.columnOID = OID_SYSCOLUMN_COLUMNLEN;
  4791. fColinfomap[aCol.columnOID] = aCol;
  4792. aCol.colWidth = 4;
  4793. aCol.constraintType = NOTNULL_CONSTRAINT;
  4794. aCol.colDataType = INT;
  4795. aCol.ddn = notDict;
  4796. aCol.colPosition++;
  4797. aCol.columnOID = OID_SYSCOLUMN_COLUMNPOS;
  4798. fColinfomap[aCol.columnOID] = aCol;
  4799. aCol.colWidth = 4;
  4800. aCol.constraintType = NO_CONSTRAINT;
  4801. aCol.colDataType = DATE;
  4802. aCol.ddn = notDict;
  4803. aCol.colPosition++;
  4804. aCol.columnOID = OID_SYSCOLUMN_LASTUPDATE;
  4805. fColinfomap[aCol.columnOID] = aCol;
  4806. aCol.colWidth = 64;
  4807. aCol.constraintType = NO_CONSTRAINT;
  4808. aCol.colDataType = VARCHAR;
  4809. aCol.ddn.dictOID = DICTOID_SYSCOLUMN_DEFAULTVAL;
  4810. aCol.ddn.listOID = LISTOID_SYSCOLUMN_DEFAULTVAL;
  4811. aCol.ddn.treeOID = TREEOID_SYSCOLUMN_DEFAULTVAL;
  4812. aCol.ddn.compressionType = aCol.compressionType;
  4813. aCol.colPosition++;
  4814. aCol.columnOID = OID_SYSCOLUMN_DEFAULTVAL;
  4815. fColinfomap[aCol.columnOID] = aCol;
  4816. aCol.colWidth = 4;
  4817. aCol.constraintType = NOTNULL_CONSTRAINT;
  4818. aCol.colDataType = INT;
  4819. aCol.ddn = notDict;
  4820. aCol.colPosition++;
  4821. aCol.columnOID = OID_SYSCOLUMN_NULLABLE;
  4822. fColinfomap[aCol.columnOID] = aCol;
  4823. aCol.colWidth = 4;
  4824. aCol.constraintType = NOTNULL_CONSTRAINT;
  4825. aCol.colDataType = INT;
  4826. aCol.ddn = notDict;
  4827. aCol.colPosition++;
  4828. aCol.columnOID = OID_SYSCOLUMN_SCALE;
  4829. fColinfomap[aCol.columnOID] = aCol;
  4830. aCol.colWidth = 4;
  4831. aCol.constraintType = NOTNULL_CONSTRAINT;
  4832. aCol.colDataType = INT;
  4833. aCol.ddn = notDict;
  4834. aCol.colPosition++;
  4835. aCol.columnOID = OID_SYSCOLUMN_PRECISION;
  4836. fColinfomap[aCol.columnOID] = aCol;
  4837. aCol.colWidth = 1;
  4838. aCol.constraintType = NO_CONSTRAINT;
  4839. aCol.colDataType = CHAR;
  4840. aCol.ddn = notDict;
  4841. aCol.colPosition++;
  4842. aCol.columnOID = OID_SYSCOLUMN_AUTOINC;
  4843. fColinfomap[aCol.columnOID] = aCol;
  4844. aCol.colWidth = 4;
  4845. aCol.constraintType = NO_CONSTRAINT;
  4846. aCol.colDataType = INT;
  4847. aCol.ddn = notDict;
  4848. aCol.colPosition++;
  4849. aCol.columnOID = OID_SYSCOLUMN_DISTCOUNT;
  4850. fColinfomap[aCol.columnOID] = aCol;
  4851. aCol.colWidth = 4;
  4852. aCol.constraintType = NO_CONSTRAINT;
  4853. aCol.colDataType = INT;
  4854. aCol.ddn = notDict;
  4855. aCol.colPosition++;
  4856. aCol.columnOID = OID_SYSCOLUMN_NULLCOUNT;
  4857. fColinfomap[aCol.columnOID] = aCol;
  4858. aCol.colWidth = 65;
  4859. aCol.constraintType = NO_CONSTRAINT;
  4860. aCol.colDataType = VARCHAR;
  4861. aCol.ddn.dictOID = DICTOID_SYSCOLUMN_MINVALUE;
  4862. aCol.ddn.listOID = LISTOID_SYSCOLUMN_MINVALUE;
  4863. aCol.ddn.treeOID = TREEOID_SYSCOLUMN_MINVALUE;
  4864. aCol.ddn.compressionType = aCol.compressionType;
  4865. aCol.colPosition++;
  4866. aCol.columnOID = OID_SYSCOLUMN_MINVALUE;
  4867. fColinfomap[aCol.columnOID] = aCol;
  4868. aCol.colWidth = 65;
  4869. aCol.constraintType = NO_CONSTRAINT;
  4870. aCol.colDataType = VARCHAR;
  4871. aCol.ddn.dictOID = DICTOID_SYSCOLUMN_MAXVALUE;
  4872. aCol.ddn.listOID = LISTOID_SYSCOLUMN_MAXVALUE;
  4873. aCol.ddn.treeOID = TREEOID_SYSCOLUMN_MAXVALUE;
  4874. aCol.ddn.compressionType = aCol.compressionType;
  4875. aCol.colPosition++;
  4876. aCol.columnOID = OID_SYSCOLUMN_MAXVALUE;
  4877. fColinfomap[aCol.columnOID] = aCol;
  4878. aCol.colWidth = 4;
  4879. aCol.constraintType = NOTNULL_CONSTRAINT;
  4880. aCol.colDataType = INT;
  4881. aCol.ddn = notDict;
  4882. aCol.colPosition++;
  4883. aCol.columnOID = OID_SYSCOLUMN_COMPRESSIONTYPE;
  4884. fColinfomap[aCol.columnOID] = aCol;
  4885. aCol.colWidth = 8;
  4886. aCol.constraintType = NOTNULL_CONSTRAINT;
  4887. aCol.colDataType = UBIGINT;
  4888. aCol.ddn = notDict;
  4889. aCol.colPosition++;
  4890. aCol.columnOID = OID_SYSCOLUMN_NEXTVALUE;
  4891. fColinfomap[aCol.columnOID] = aCol;
  4892. }
  4893. void CalpontSystemCatalog::buildSysOIDmap()
  4894. {
  4895. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, TABLENAME_COL)] = OID_SYSTABLE_TABLENAME;
  4896. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, SCHEMA_COL)] = OID_SYSTABLE_SCHEMA;
  4897. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, OBJECTID_COL)] = OID_SYSTABLE_OBJECTID;
  4898. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, CREATEDATE_COL)] = OID_SYSTABLE_CREATEDATE;
  4899. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, LASTUPDATE_COL)] = OID_SYSTABLE_LASTUPDATE;
  4900. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, INIT_COL)] = OID_SYSTABLE_INIT;
  4901. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, NEXT_COL)] = OID_SYSTABLE_NEXT;
  4902. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, NUMOFROWS_COL)] = OID_SYSTABLE_NUMOFROWS;
  4903. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, AVGROWLEN_COL)] = OID_SYSTABLE_AVGROWLEN;
  4904. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, NUMOFBLOCKS_COL)] = OID_SYSTABLE_NUMOFBLOCKS;
  4905. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSTABLE_TABLE, AUTOINC_COL)] = OID_SYSTABLE_AUTOINCREMENT;
  4906. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, SCHEMA_COL)] = OID_SYSCOLUMN_SCHEMA;
  4907. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, TABLENAME_COL)] = OID_SYSCOLUMN_TABLENAME;
  4908. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, COLNAME_COL)] = OID_SYSCOLUMN_COLNAME;
  4909. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, OBJECTID_COL)] = OID_SYSCOLUMN_OBJECTID;
  4910. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, DICTOID_COL)] = OID_SYSCOLUMN_DICTOID;
  4911. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, LISTOBJID_COL)] = OID_SYSCOLUMN_LISTOBJID;
  4912. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, TREEOBJID_COL)] = OID_SYSCOLUMN_TREEOBJID;
  4913. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, DATATYPE_COL)] = OID_SYSCOLUMN_DATATYPE;
  4914. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, COLUMNLEN_COL)] = OID_SYSCOLUMN_COLUMNLEN;
  4915. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, COLUMNPOS_COL )] = OID_SYSCOLUMN_COLUMNPOS;
  4916. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, LASTUPDATE_COL)] = OID_SYSCOLUMN_LASTUPDATE;
  4917. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, DEFAULTVAL_COL)] = OID_SYSCOLUMN_DEFAULTVAL;
  4918. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, NULLABLE_COL)] = OID_SYSCOLUMN_NULLABLE;
  4919. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, SCALE_COL)] = OID_SYSCOLUMN_SCALE;
  4920. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, PRECISION_COL)] = OID_SYSCOLUMN_PRECISION;
  4921. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, AUTOINC_COL)] = OID_SYSCOLUMN_AUTOINC;
  4922. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, DISTCOUNT_COL)] = OID_SYSCOLUMN_DISTCOUNT;
  4923. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, NULLCOUNT_COL)] = OID_SYSCOLUMN_NULLCOUNT;
  4924. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, MINVALUE_COL)] = OID_SYSCOLUMN_MINVALUE;
  4925. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, MAXVALUE_COL)] = OID_SYSCOLUMN_MAXVALUE;
  4926. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, COMPRESSIONTYPE_COL)] = OID_SYSCOLUMN_COMPRESSIONTYPE;
  4927. fOIDmap[make_tcn(CALPONT_SCHEMA, SYSCOLUMN_TABLE, NEXTVALUE_COL)] = OID_SYSCOLUMN_NEXTVALUE;
  4928. }
  4929. void CalpontSystemCatalog::buildSysTablemap()
  4930. {
  4931. fTablemap[make_table(CALPONT_SCHEMA, SYSTABLE_TABLE)] = SYSTABLE_BASE;
  4932. fTablemap[make_table(CALPONT_SCHEMA, SYSCOLUMN_TABLE )] = SYSCOLUMN_BASE;
  4933. }
  4934. void CalpontSystemCatalog::buildSysDctmap()
  4935. {
  4936. fDctTokenMap[DICTOID_SYSTABLE_TABLENAME] = OID_SYSTABLE_TABLENAME;
  4937. fDctTokenMap[DICTOID_SYSTABLE_SCHEMA] = OID_SYSTABLE_SCHEMA;
  4938. fDctTokenMap[DICTOID_SYSCOLUMN_SCHEMA] = OID_SYSCOLUMN_SCHEMA;
  4939. fDctTokenMap[DICTOID_SYSCOLUMN_TABLENAME] = OID_SYSCOLUMN_TABLENAME;
  4940. fDctTokenMap[DICTOID_SYSCOLUMN_COLNAME] = OID_SYSCOLUMN_COLNAME;
  4941. fDctTokenMap[DICTOID_SYSCOLUMN_DEFAULTVAL] = OID_SYSCOLUMN_DEFAULTVAL;
  4942. fDctTokenMap[DICTOID_SYSCOLUMN_MINVALUE] = OID_SYSCOLUMN_MINVALUE;
  4943. fDctTokenMap[DICTOID_SYSCOLUMN_MAXVALUE] = OID_SYSCOLUMN_MAXVALUE;
  4944. }
  4945. void CalpontSystemCatalog::checkSysCatVer()
  4946. {
  4947. SCN newScn = fSessionManager->sysCatVerID().currentScn;
  4948. if (newScn < 0)
  4949. {
  4950. fSessionManager.reset(new SessionManager());
  4951. newScn = fSessionManager->sysCatVerID().currentScn;
  4952. }
  4953. boost::mutex::scoped_lock sysCatLk(fSyscatSCNLock);
  4954. if ( fSyscatSCN != newScn ) {
  4955. flushCache();
  4956. }
  4957. }
  4958. const string CalpontSystemCatalog::ColType::toString() const
  4959. {
  4960. ostringstream output;
  4961. output << "cw: " << colWidth
  4962. << " dt: " << colDataTypeToString(colDataType)
  4963. << " do: " << ddn.dictOID
  4964. << " lo: " << ddn.listOID
  4965. << " to: " << ddn.treeOID
  4966. << " cp: " << colPosition
  4967. << " sc: " << scale
  4968. << " pr: " << precision
  4969. << " od: " << columnOID
  4970. << " ct: " << compressionType
  4971. << " ai: " << autoincrement
  4972. << " nv: " << nextvalue;
  4973. return output.str();
  4974. }
  4975. //format a session id that includes the module id
  4976. //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
  4977. /*static*/
  4978. uint32_t CalpontSystemCatalog::idb_tid2sid(const uint32_t tid)
  4979. {
  4980. //don't care about locking here...
  4981. if (fModuleID == numeric_limits<uint32_t>::max())
  4982. {
  4983. uint32_t tmid = 1;
  4984. oam::Oam oam;
  4985. oam::oamModuleInfo_t minfo;
  4986. try {
  4987. minfo = oam.getModuleInfo();
  4988. tmid = static_cast<uint32_t>(boost::get<2>(minfo));
  4989. if (tmid == 0)
  4990. tmid = 1;
  4991. } catch (...) {
  4992. tmid = 1;
  4993. }
  4994. fModuleID = tmid;
  4995. }
  4996. uint32_t mid = fModuleID;
  4997. mid--; //make module id zero-based
  4998. mid &= 0x0000007f;
  4999. uint32_t sid = (mid << 24) | (tid & 0x00ffffff);
  5000. return sid;
  5001. }
  5002. ostream& operator<<(ostream& output, const CalpontSystemCatalog::ColType& rhs)
  5003. {
  5004. output << rhs.toString();
  5005. return output;
  5006. }
  5007. vector<CalpontSystemCatalog::OID> getAllSysCatOIDs()
  5008. {
  5009. vector<CalpontSystemCatalog::OID> ret;
  5010. CalpontSystemCatalog::OID oid;
  5011. for (oid = SYSTABLE_BASE + 1; oid < SYSTABLE_MAX; oid++)
  5012. ret.push_back(oid);
  5013. for (oid = SYSCOLUMN_BASE + 1; oid < SYSCOLUMN_MAX; oid++)
  5014. ret.push_back(oid);
  5015. for (oid = SYSTABLE_DICT_BASE + 1; oid < SYSTABLE_DICT_MAX; oid++)
  5016. ret.push_back(oid);
  5017. for (oid = SYSCOLUMN_DICT_BASE + 1; oid < SYSCOLUMN_DICT_MAX; oid++)
  5018. ret.push_back(oid);
  5019. return ret;
  5020. }
  5021. } // namespace execplan
  5022. // vim:sw=4 ts=4: