PageRenderTime 68ms CodeModel.GetById 33ms RepoModel.GetById 0ms app.codeStats 1ms

/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

Large files files are truncated, but you can click here to view the full file

  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, C

Large files files are truncated, but you can click here to view the full file