You've already forked mariadb-columnstore-engine
							
							
				mirror of
				https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
				synced 2025-10-30 07:25:34 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			895 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			895 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* Copyright (C) 2014 InfiniDB, Inc.
 | |
|    Copyright (C) 2016 MariaDB Corporation
 | |
| 
 | |
|    This program is free software; you can redistribute it and/or
 | |
|    modify it under the terms of the GNU General Public License
 | |
|    as published by the Free Software Foundation; version 2 of
 | |
|    the License.
 | |
| 
 | |
|    This program is distributed in the hope that it will be useful,
 | |
|    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|    GNU General Public License for more details.
 | |
| 
 | |
|    You should have received a copy of the GNU General Public License
 | |
|    along with this program; if not, write to the Free Software
 | |
|    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 | |
|    MA 02110-1301, USA. */
 | |
| 
 | |
| /***********************************************************************
 | |
|  *   $Id: ddlpackageprocessor.h 9627 2013-06-18 13:59:21Z rdempsey $
 | |
|  *
 | |
|  *
 | |
|  ***********************************************************************/
 | |
| /** @file */
 | |
| 
 | |
| #pragma once
 | |
| #include <unistd.h>
 | |
| #include <string>
 | |
| #include <stdexcept>
 | |
| #include <sstream>
 | |
| #include <iostream>
 | |
| #include <cstdint>
 | |
| 
 | |
| #include <boost/any.hpp>
 | |
| #include <boost/tuple/tuple.hpp>
 | |
| 
 | |
| #include "calpontsystemcatalog.h"
 | |
| #include "objectidmanager.h"
 | |
| #include "sessionmanager.h"
 | |
| #include "brmtypes.h"
 | |
| #include "ddlpkg.h"
 | |
| #include "messageobj.h"
 | |
| #include "we_type.h"
 | |
| #include "we_define.h"
 | |
| #include "writeengine.h"
 | |
| #include "columnresult.h"
 | |
| #include "../../writeengine/client/we_clients.h"
 | |
| #include "liboamcpp.h"
 | |
| 
 | |
| #define EXPORT
 | |
| 
 | |
| // #define IDB_DDL_DEBUG
 | |
| namespace ddlpackageprocessor
 | |
| {
 | |
| #define SUMMARY_INFO(message)          \
 | |
|   if (isDebug(SUMMARY))                \
 | |
|   {                                    \
 | |
|     std::cerr << message << std::endl; \
 | |
|   }
 | |
| 
 | |
| #define DETAIL_INFO(message)           \
 | |
|   if (isDebug(DETAIL))                 \
 | |
|   {                                    \
 | |
|     std::cerr << message << std::endl; \
 | |
|   }
 | |
| 
 | |
| #define VERBOSE_INFO(message)          \
 | |
|   if (isDebug(VERBOSE))                \
 | |
|   {                                    \
 | |
|     std::cerr << message << std::endl; \
 | |
|   }
 | |
| 
 | |
| /** @brief base class that defines the common interface and
 | |
|  * implementation of a DDLPacakageProcessor
 | |
|  */
 | |
| class DDLPackageProcessor
 | |
| {
 | |
|  public:
 | |
|   /** @brief Result code
 | |
|    */
 | |
|   enum ResultCode
 | |
|   {
 | |
|     NO_ERROR,
 | |
|     CREATE_ERROR,
 | |
|     ALTER_ERROR,
 | |
|     DROP_ERROR,
 | |
|     TRUNC_ERROR,
 | |
|     TOKENIZATION_ERROR,
 | |
|     NOT_ACCEPTING_PACKAGES,
 | |
|     PK_NOTNULL_ERROR,
 | |
|     WARNING,
 | |
|     USER_ERROR,
 | |
|     NETWORK_ERROR,
 | |
|     PARTITION_WARNING,
 | |
|     WARN_NO_PARTITION,
 | |
|     DROP_TABLE_NOT_IN_CATALOG_ERROR,
 | |
|     PP_LOST_CONNECTION
 | |
|   };
 | |
| 
 | |
|   enum DebugLevel /** @brief Debug level type enumeration */
 | |
|   {
 | |
|     NONE = 0,    /** @brief No debug info */
 | |
|     SUMMARY = 1, /** @brief Summary level debug info */
 | |
|     DETAIL = 2,  /** @brief A little detail debug info */
 | |
|     VERBOSE = 3, /** @brief Detailed debug info */
 | |
|   };
 | |
| 
 | |
|   enum LogFileType
 | |
|   {
 | |
|     DROPTABLE_LOG,
 | |
|     DROPPART_LOG,
 | |
|     TRUNCATE_LOG
 | |
|   };
 | |
|   typedef std::vector<execplan::CalpontSystemCatalog::OID> OidList;
 | |
|   typedef std::set<BRM::LogicalPartition> PartitionNums;
 | |
|   struct LogInfo
 | |
|   {
 | |
|     LogFileType fileType;
 | |
|     OidList oids;
 | |
|     PartitionNums partitionNums;
 | |
|   };
 | |
|   typedef std::map<execplan::CalpontSystemCatalog::OID, LogInfo> TableLogInfo;
 | |
| 
 | |
|   /** @brief the result of dml operations
 | |
|    */
 | |
|   struct DDLResult
 | |
|   {
 | |
|     /** @brief the result code
 | |
|      */
 | |
|     ResultCode result;
 | |
|     /** @brief the error message if result != NO_ERROR
 | |
|      */
 | |
|     logging::Message message;
 | |
|   };
 | |
| 
 | |
|   /** @brief a structure to hold ddlcolumn attributes
 | |
|    */
 | |
|   struct DDLColumn
 | |
|   {
 | |
|     execplan::CalpontSystemCatalog::OID oid;
 | |
|     execplan::CalpontSystemCatalog::ColType colType;
 | |
|     execplan::CalpontSystemCatalog::TableColName tableColName;
 | |
|   };
 | |
| 
 | |
|   /** @brief a list of DDLColumns
 | |
|    */
 | |
|   typedef std::vector<DDLColumn> ColumnList;
 | |
| 
 | |
|   /** @brief a strcuture to hold index object
 | |
|    */
 | |
|   struct IndexOID
 | |
|   {
 | |
|     int listOID;
 | |
|     int treeOID;
 | |
|   };
 | |
| 
 | |
|   /** @brief a vector of index object ids
 | |
|    */
 | |
|   typedef std::vector<IndexOID> IndexOIDList;
 | |
| 
 | |
|   /** @brief a structure to hold a dictionary's
 | |
|    *  object ids
 | |
|    */
 | |
|   struct DictOID
 | |
|   {
 | |
|     int dictOID;
 | |
|     int listOID;
 | |
|     int treeOID;
 | |
|     int colWidth;
 | |
|     int compressionType;
 | |
|   };
 | |
|   /** @brief a structure to hold a date
 | |
|    */
 | |
| 
 | |
|   struct Date
 | |
|   {
 | |
|     unsigned spare : 6;
 | |
|     unsigned day : 6;
 | |
|     unsigned month : 4;
 | |
|     unsigned year : 16;
 | |
|     // NULL column value = 0xFFFFFFFE
 | |
|     EXPORT Date()
 | |
|     {
 | |
|       year = 0xFFFF;
 | |
|       month = 0xF;
 | |
|       day = 0x3F;
 | |
|       spare = 0x3E;
 | |
|     }
 | |
|   };
 | |
|   /*
 | |
|       struct Date
 | |
|       {
 | |
|       int year   : 16;
 | |
|       int month  : 4;
 | |
|       int day    : 6;
 | |
|       int spare  : 6;
 | |
|           Date( )   { year = 0; month = 0; day = 0; spare = 0;}
 | |
|       }; */
 | |
|   /** @brief a vector of dictionary object ids
 | |
|    */
 | |
|   typedef std::vector<DictOID> DictionaryOIDList;
 | |
| 
 | |
|   /** the type of a list of ColumnResult as returned from getSysData
 | |
|    */
 | |
|   typedef std::vector<execplan::ColumnResult*> NJLSysDataVector;
 | |
|   struct NJLSysDataList
 | |
|   {
 | |
|     NJLSysDataVector sysDataVec;
 | |
|     EXPORT NJLSysDataList() = default;
 | |
|     EXPORT ~NJLSysDataList() = default;
 | |
|     NJLSysDataVector::const_iterator begin()
 | |
|     {
 | |
|       return sysDataVec.begin();
 | |
|     }
 | |
|     NJLSysDataVector::const_iterator end()
 | |
|     {
 | |
|       return sysDataVec.end();
 | |
|     }
 | |
|     void push_back(execplan::ColumnResult* cr)
 | |
|     {
 | |
|       sysDataVec.push_back(cr);
 | |
|     }
 | |
|     unsigned int size()
 | |
|     {
 | |
|       return static_cast<unsigned int>(sysDataVec.size());
 | |
|     }
 | |
|     int findColumn(const execplan::CalpontSystemCatalog::OID& columnOID)
 | |
|     {
 | |
|       for (uint32_t i = 0; i < sysDataVec.size(); i++)
 | |
|       {
 | |
|         if (sysDataVec[i]->ColumnOID() == columnOID)
 | |
|         {
 | |
|           return i;
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       return -1;
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   /** @brief constructor
 | |
|    */
 | |
|   DDLPackageProcessor(BRM::DBRM* aDbrm) : fStartingColOID(0), fDDLLoggingId(23), fDebugLevel(NONE)
 | |
|   {
 | |
|     fWEClient = new WriteEngine::WEClients(WriteEngine::WEClients::DDLPROC);
 | |
|     fPMCount = fWEClient->getPmCount();
 | |
|     fDbrm = aDbrm;
 | |
|     // std::cout << "in DDLPackageProcessor constructor " << this << std::endl;
 | |
|   }
 | |
| 
 | |
|   /** @brief Function wrapper for `processPackageInternal`.
 | |
|    */
 | |
|   DDLResult processPackage(ddlpackage::SqlStatement* sqlStmt);
 | |
| 
 | |
|   /** @brief Check that give exception is related to PP lost connection.
 | |
|    */
 | |
|   bool checkPPLostConnection(std::string error);
 | |
| 
 | |
|   /** @brief Internal implementation for `process` package command.
 | |
|    */
 | |
|   virtual DDLResult processPackageInternal(ddlpackage::SqlStatement* sqlStmt);
 | |
| 
 | |
|   /** @brief destructor
 | |
|    */
 | |
|   EXPORT virtual ~DDLPackageProcessor();
 | |
| 
 | |
|   /** @brief Is it required to debug
 | |
|    */
 | |
|   bool isDebug(const DebugLevel level) const
 | |
|   {
 | |
|     return level <= fDebugLevel;
 | |
|   }
 | |
| 
 | |
|   /** @brief Get debug level
 | |
|    */
 | |
|   DebugLevel getDebugLevel() const
 | |
|   {
 | |
|     return fDebugLevel;
 | |
|   }
 | |
| 
 | |
|   /** @brief Set debug level
 | |
|    */
 | |
|   void setDebugLevel(const DebugLevel level)
 | |
|   {
 | |
|     fDebugLevel = level;
 | |
|   }
 | |
| 
 | |
|   /** @brief Get index oid that was allocated during index creation
 | |
|    */
 | |
|   IndexOID getIndexOID() const
 | |
|   {
 | |
|     return fIdxOID;
 | |
|   }
 | |
| 
 | |
|   /** @brief Get starting column oid that was allocated during table
 | |
|    * creation.
 | |
|    */
 | |
|   int getStartingColumnOID() const
 | |
|   {
 | |
|     return fStartingColOID;
 | |
|   }
 | |
| 
 | |
|   /** @brief access and mutator of fPKName */
 | |
|   const std::string PKName() const
 | |
|   {
 | |
|     return fPKName;
 | |
|   }
 | |
|   void PKName(const std::string PKName)
 | |
|   {
 | |
|     fPKName = PKName;
 | |
|   }
 | |
|   /**  @brief Flush primproc cache for associated lbids.
 | |
|    *
 | |
|    *  @param oidList the list of OIDs for
 | |
|    *  which the lbids for those files will be removed
 | |
|    */
 | |
|   EXPORT void flushPrimprocCache(std::vector<execplan::CalpontSystemCatalog::OID>& oidList);
 | |
| 
 | |
|   /**  @brief remove the physical files
 | |
|    *
 | |
|    *  @param txnID the transaction id
 | |
|    *  @param oidList the list of OIDs for
 | |
|    *  which the files should be removed
 | |
|    */
 | |
|   EXPORT void removeFiles(const uint64_t uniqueId, std::vector<execplan::CalpontSystemCatalog::OID>& oidList);
 | |
| 
 | |
|   EXPORT void createFiles(execplan::CalpontSystemCatalog::TableName aTableName, const int useDBRoot,
 | |
|                           const uint64_t uniqueId, const uint32_t numOids);
 | |
| 
 | |
|   /**  @brief remove the physical files for the specified partition
 | |
|    *
 | |
|    *  @param oidList the list of OIDs for
 | |
|    *  which the files should be removed
 | |
|    *  @param partition number
 | |
|    */
 | |
|   EXPORT void removePartitionFiles(std::vector<execplan::CalpontSystemCatalog::OID>& oidList,
 | |
|                                    const PartitionNums& partitions, uint64_t uniqueId);
 | |
| 
 | |
|   /**  @brief remove the extents from extent map
 | |
|    *
 | |
|    *  @param txnID the transaction id
 | |
|    *  @param result the result of the operation
 | |
|    *  @param oidList the list of OIDs for
 | |
|    *  which the extents should be removed
 | |
|    */
 | |
|   EXPORT void removeExtents(std::vector<execplan::CalpontSystemCatalog::OID>& oidList);
 | |
| 
 | |
|   /**  @brief create and open log file to log a table information
 | |
|    *
 | |
|    *  @param tableOid the oid of the table
 | |
|    *  @param tableName the shcema, table name
 | |
|    */
 | |
|   EXPORT void createWriteDropLogFile(execplan::CalpontSystemCatalog::OID tableOid, uint64_t uniqueId,
 | |
|                                      std::vector<execplan::CalpontSystemCatalog::OID>& oidList);
 | |
| 
 | |
|   /**  @brief create and open log file to log a table partition information
 | |
|    *
 | |
|    *  @param tableOid the oid of the table
 | |
|    *  @param tableName the shcema, table name
 | |
|    *  @param partition the partition number to be dropped
 | |
|    */
 | |
|   EXPORT void createWritePartitionLogFile(execplan::CalpontSystemCatalog::OID tableOid,
 | |
|                                           const PartitionNums& partitionNums,
 | |
|                                           std::vector<execplan::CalpontSystemCatalog::OID>& oidList,
 | |
|                                           uint64_t uniqueId);
 | |
| 
 | |
|   // EXPORT void createOpenTruncateTableLogFile(execplan::CalpontSystemCatalog::OID tableOid,
 | |
|   // execplan::CalpontSystemCatalog::TableName tableName);
 | |
| 
 | |
|   /**  @brief create and open log file to log a truncae table information
 | |
|    *
 | |
|    *  @param tableOid the oid of the table
 | |
|    *  @param tableName the shcema, table name
 | |
|    */
 | |
|   EXPORT void createWriteTruncateTableLogFile(execplan::CalpontSystemCatalog::OID tableOid, uint64_t uniqueId,
 | |
|                                               std::vector<execplan::CalpontSystemCatalog::OID>& oidList);
 | |
| 
 | |
|   /**  @brief delete log file
 | |
|    *
 | |
|    */
 | |
|   EXPORT void deleteLogFile(LogFileType fileType, execplan::CalpontSystemCatalog::OID tableOid,
 | |
|                             uint64_t uniqueId);
 | |
| 
 | |
|   /**  @brief fetch log file infomation
 | |
|    *
 | |
|    */
 | |
|   EXPORT void fetchLogFile(TableLogInfo& tableLogInfos, uint64_t uniqueId);
 | |
| 
 | |
|   // virtual EXPORT DDLResult processPackage(ddlpackage::TruncTableStatement& truncTableStmt);
 | |
| 
 | |
|   BRM::TxnID fTxnid;
 | |
| 
 | |
|  protected:
 | |
|   /** @brief get a list of DDLColumns for the given schema.table
 | |
|    *
 | |
|    * @param schema the schema the table belongs to
 | |
|    * @param table the table name
 | |
|    * @param colList will contain the list of columns on return
 | |
|    */
 | |
|   EXPORT void getColumnsForTable(uint32_t sessionID, std::string schema, std::string table,
 | |
|                                  ColumnList& colList);
 | |
| 
 | |
|   /** @brief convert parsed ddl data type to a system catalog data type
 | |
|    *
 | |
|    * @param dateType the parsed ddl data type
 | |
|    */
 | |
|   execplan::CalpontSystemCatalog::ColDataType convertDataType(int dataType);
 | |
| 
 | |
|   /** @brief return a tokenized value for the supplied data value
 | |
|    *
 | |
|    * @param result the result of the operation
 | |
|    * @param colType the column type
 | |
|    * @param data the value to tokenize
 | |
|    */
 | |
|   boost::any tokenizeData(execplan::CalpontSystemCatalog::SCN txnID, const DDLResult& result,
 | |
|                           const execplan::CalpontSystemCatalog::ColType& colType, const boost::any& data);
 | |
| 
 | |
|   /** @brief does the supplied constraint type require an index
 | |
|    *
 | |
|    * @param type the constraint type
 | |
|    */
 | |
|   bool isIndexConstraint(ddlpackage::DDL_CONSTRAINTS type);
 | |
| 
 | |
|   /** @brief get the char code for the constraint type
 | |
|    *
 | |
|    * @param type the constraint type
 | |
|    */
 | |
|   char getConstraintCode(ddlpackage::DDL_CONSTRAINTS type);
 | |
| 
 | |
|   /** @brief get the column refrences for the given table constraint
 | |
|    *
 | |
|    * @param tableConstraint the table constraint
 | |
|    * @param columns on return will contain the list of columns
 | |
|    */
 | |
|   void getColumnReferences(ddlpackage::TableConstraintDef& tableConstraint,
 | |
|                            ddlpackage::ColumnNameList& columns);
 | |
| 
 | |
|   /** @brief build a table constraint name
 | |
|    *
 | |
|    * @param schema the schema the table belongs to
 | |
|    * @param table the name of the table
 | |
|    * @param constraintNumber the constraint number
 | |
|    * @param type the constraint type
 | |
|    */
 | |
|   std::string buildTableConstraintName(int oid, ddlpackage::DDL_CONSTRAINTS type);
 | |
| 
 | |
|   /** @brief build a column constraint name
 | |
|    *
 | |
|    * @param schema the schema the table belongs to
 | |
|    * @param table the name of the table
 | |
|    * @param column the column name
 | |
|    * @param type the constraint type
 | |
|    */
 | |
|   std::string buildColumnConstraintName(const std::string& schema, const std::string& table,
 | |
|                                         const std::string& column, ddlpackage::DDL_CONSTRAINTS type);
 | |
| 
 | |
|   /** @brief write the tables meta data to the SYSTABLE table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param tableDef the table definition
 | |
|    */
 | |
|   // void writeSysTableMetaData(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID, const
 | |
|   // DDLResult& result,
 | |
|   //                           ddlpackage::TableDef& tableDef, uint32_t tableWithAutoi=0);
 | |
| 
 | |
|   /** @brief write the table columns meta data to the SYSCOLUMN table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param tableDefCols the table columns definition
 | |
|    * @param qualifiedName the name of catalog, schema, object names
 | |
|    */
 | |
|   // void writeSysColumnMetaData(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID, const
 | |
|   // DDLResult& result,
 | |
|   //                            ddlpackage::ColumnDefList& tableDefCols,
 | |
|   //                            ddlpackage::QualifiedName& qualifiedName, int colpos, bool alterFlag=false );
 | |
| 
 | |
|   /** @brief write the table constraint meta data to the SYSCONSTRAINT table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param constraintList the table constrain list
 | |
|    * @param qualifiedName the name of catalog, schema, object names
 | |
|    */
 | |
|   //   void writeTableSysConstraintMetaData(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID,
 | |
|   //   DDLResult& result,
 | |
|   //                                       ddlpackage::TableConstraintDefList& constraintList,
 | |
|   //                                       ddlpackage::QualifiedName&
 | |
|   //                                        qualifiedName, bool alterFlag=false );
 | |
|   /** @brief write the table constraint meta data to the SYSCONSTRAINTCOL table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param constraintList the table constrain list
 | |
|    * @param qualifiedName the name of catalog, schema, object names
 | |
|    */
 | |
|   //   void writeTableSysConstraintColMetaData(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID,
 | |
|   //                                           const DDLResult& result, ddlpackage::TableConstraintDefList&
 | |
|   //                                           constraintList, ddlpackage::QualifiedName& qualifiedName, bool
 | |
|   //                                           alterFlag=false );
 | |
| 
 | |
|   /** @brief write the column constraint meta data to the SYSCONTRAINT table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param constraintList the table constrain list
 | |
|    * @param qualifiedName the name of catalog, schema, object names
 | |
|    */
 | |
|   //    void writeColumnSysConstraintMetaData(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID,
 | |
|   //    const DDLResult& result,
 | |
|   //                                          ddlpackage::ColumnDefList& tableDefCols,
 | |
|   //                                          ddlpackage::QualifiedName& qualifiedName );
 | |
| 
 | |
|   /** @brief write the column constraint meta data to the SYSCONTRAINTCOL table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param tableDef the table definition
 | |
|    */
 | |
|   //    void writeColumnSysConstraintColMetaData(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN
 | |
|   //    txnID,
 | |
|   //            const DDLResult& result, ddlpackage::ColumnDefList& tableDefCols,
 | |
|   //           ddlpackage::QualifiedName& qualifiedName);
 | |
| 
 | |
|   /** @brief write the index meta data to the SYSINDEX table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param tableDef the table definiton
 | |
|    * @param consDef the table constraint
 | |
|    * @param indexName name of the index
 | |
|    */
 | |
|   // void writeSysIndexMetaData(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID, const
 | |
|   // DDLResult& result,
 | |
|   //                            ddlpackage::QualifiedName& qualifiedName,
 | |
|   //                            ddlpackage::DDL_CONSTRAINTS type,
 | |
|   //                            std::string& indexName, bool multicol, bool alterFlag=false);
 | |
| 
 | |
|   /** @brief write the index meta data to the SYSINDEXCOL table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param tableDef the table definiton
 | |
|    * @param constraintCols the list of columns in this index
 | |
|    * @param indexName name of the index
 | |
|    */
 | |
|   // void writeSysIndexColMetaData(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID, const
 | |
|   // DDLResult& result,
 | |
|   // ddlpackage::QualifiedName& qualifiedName,
 | |
|   //                                ddlpackage::ColumnNameList& constraintCols,
 | |
|   //                               std::string& indexName, bool alterFlag=false);
 | |
| 
 | |
|   /** @brief remove all indexes for the supplied table from the SYSINDEX table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param tableName the qualified name of the table
 | |
|    */
 | |
|   // void removeSysIndexMetaDataForTable(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID,
 | |
|   //                                   DDLResult& result, ddlpackage::QualifiedName& tableName);
 | |
| 
 | |
|   /** @brief remove all index columns for the supplied table from the SYSINDEXCOL table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param tableName the qualified name of the table
 | |
|    */
 | |
|   // void removeSysIndexColMetaDataForTable(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID,
 | |
|   //                                        DDLResult& result, ddlpackage::QualifiedName& tableName);
 | |
| 
 | |
|   /** @brief remove an index from the SYSINDEX table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param indexName the qualified name of the index
 | |
|    */
 | |
|   // void removeSysIndexMetaData(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID, DDLResult&
 | |
|   // result,
 | |
|   //                            ddlpackage::QualifiedName& indexName);
 | |
| 
 | |
|   /** @brief remove index columns from the SYSINDEXCOL table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param indexName the qualified name of the index
 | |
|    */
 | |
|   // void removeSysIndexColMetaData(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID, DDLResult&
 | |
|   // result,
 | |
|   //                                ddlpackage::QualifiedName& indexName);
 | |
| 
 | |
|   /** @brief remove the table meta data from the SYSTABLE table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param tableName the qualified name of the table to remove
 | |
|    */
 | |
|   // void removeSysTableMetaData(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID, DDLResult&
 | |
|   // result,
 | |
|   //                             ddlpackage::QualifiedName& tableName);
 | |
| 
 | |
|   /** @brief remove the column meta data from the SYSCOLUMN table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param tableName the qualified name of the table whose columns
 | |
|    * are to be removed
 | |
|    */
 | |
|   // void removeSysColMetaData(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID, DDLResult&
 | |
|   // result,
 | |
|   //                           ddlpackage::QualifiedName& tableName);
 | |
| 
 | |
|   /** @brief remove the column meta data from the SYSCOLUMN table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param columnInfo the qualified name of the column
 | |
|    * to be removed
 | |
|    */
 | |
|   // void removeColSysColMetaData(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID, DDLResult&
 | |
|   // result,
 | |
|   //                           ddlpackage::QualifiedName& columnInfo);
 | |
| 
 | |
|   /**  @brief remove the constraint meta data from the SYSCONSTRAINT table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param tableName the qualified name of the table whose constraints
 | |
|    * are to be removed
 | |
|    */
 | |
|   //   void removeSysContraintMetaData(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID,
 | |
|   //   DDLResult& result,
 | |
|   //                                  ddlpackage::QualifiedName& tableName);
 | |
| 
 | |
|   /**  @brief remove the constraint meta data from the SYSCONSTRAINT table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param indexName the index name to be removed
 | |
|    */
 | |
|   //   void removeSysIndexMetaDataForIndex(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID,
 | |
|   //       DDLResult& result,
 | |
|   //       execplan::CalpontSystemCatalog::IndexNameList& indexNameList);
 | |
| 
 | |
|   /**  @brief remove the column constraint meta data from the SYSCONSTRAINTCOL table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param tableName the qualified name of the table whose column constraints
 | |
|    * are to be removed
 | |
|    */
 | |
|   //  void removeSysConstraintColMetaData(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID,
 | |
|   //  DDLResult& result,
 | |
|   //                                     ddlpackage::QualifiedName& tableName);
 | |
|   /**  @brief remove the column constraint meta data from the SYSCONSTRAINT table
 | |
|    *
 | |
|    * @param txnID the transaction id
 | |
|    * @param result the result of the operation
 | |
|    * @param constrintNames the names of the constraints
 | |
|    * are to be removed
 | |
|    */
 | |
| #if 0
 | |
|     void removeSysContraintMetaDataForConstraint(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID,
 | |
|             DDLResult& result,
 | |
|             execplan::CalpontSystemCatalog::IndexNameList& constrintNames);
 | |
|     /**  @brief remove the column constraint meta data from the SYSCONSTRAINTCOL table
 | |
|       *
 | |
|       * @param txnID the transaction id
 | |
|       * @param result the result of the operation
 | |
|       * @param columnInfo the qualified name of the column whose constraints
 | |
|       * are to be removed
 | |
|       */
 | |
|     void removeColSysConstraintColMetaData(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID, DDLResult& result,
 | |
|                                            ddlpackage::QualifiedName& columnInfo);
 | |
| 
 | |
|     /** @brief create the physical dictionary files
 | |
|      *
 | |
|      * @param txnID the transaction id
 | |
|      * @param result the result of the operation
 | |
|      */
 | |
|     void createDictionaryFiles(execplan::CalpontSystemCatalog::SCN txnID, const DDLResult& result, const int useDBRoot);
 | |
| 
 | |
|     /** @brief create the physical column files
 | |
|      *
 | |
|      * @param txnID the transaction id
 | |
|      * @param result the result of the operation
 | |
|      * @param tableDefCols the table column definition list
 | |
|      */
 | |
|     void createColumnFiles(execplan::CalpontSystemCatalog::SCN txnID, const DDLResult& result,
 | |
|                            ddlpackage::ColumnDefList& tableDefCols, const int useDBRoot, const uint32_t partitionNum = 0);
 | |
| 
 | |
|     /**  @brief update the SYSCOLUMN table
 | |
|      *
 | |
|      *  @param txnID the transaction id
 | |
|      *  @param result the result of the operation
 | |
|      *  @param ridList the list of OIDs for
 | |
|      *  which the column file should be removed
 | |
|      */
 | |
|     void updateSyscolumns( execplan::CalpontSystemCatalog::SCN txnID,
 | |
|                            DDLResult& result, WriteEngine::RIDList& ridList,
 | |
|                            WriteEngine::ColValueList& colValuesList,
 | |
|                            WriteEngine::ColValueList& colOldValuesList);
 | |
| 
 | |
|     /** @brief remove the physical index files
 | |
|      *
 | |
|      * @param txnID the transaction id
 | |
|      * @param result the result of the operation
 | |
|      * @param idxOIDList the list of OIDs for
 | |
|      * which the index files should be removed
 | |
|      */
 | |
|     void removeIndexFiles(execplan::CalpontSystemCatalog::SCN txnID, DDLResult& result,
 | |
|                           execplan::CalpontSystemCatalog::IndexOIDList& idxOIDList);
 | |
| #endif
 | |
| 
 | |
|   /** @brief return the OIDs used by the database objects
 | |
|    *
 | |
|    * @param ridList the list of column OIDs to return
 | |
|    * @param dictOIDList the list of dictionary OIDs to return
 | |
|    */
 | |
|   void returnOIDs(execplan::CalpontSystemCatalog::RIDList& ridList,
 | |
|                   execplan::CalpontSystemCatalog::DictOIDList& dictOIDList);
 | |
| 
 | |
|   /**
 | |
|    * @brief convert a columns data, represnted as a string, to it's native
 | |
|    * data type
 | |
|    *
 | |
|    * @param type the columns database type
 | |
|    * @param data the columns string representation of it's data
 | |
|    */
 | |
|   // boost::any convertColumnData( execplan::CalpontSystemCatalog::ColType colType,
 | |
|   //                             const std::string& data );
 | |
| 
 | |
|   /**
 | |
|    * @brief Find the given column in the given system catalog table and
 | |
|    * return it as a DDLColumn object
 | |
|    *
 | |
|    * @param systableName the table to find the column in
 | |
|    * @param colName the name of the column to find in the table
 | |
|    * @param sysCol on success the returned sysCol object
 | |
|    */
 | |
|   void findColumnData(uint32_t sessionID, execplan::CalpontSystemCatalog::TableName& systableName,
 | |
|                       const std::string& colName, DDLColumn& sysCol);
 | |
| 
 | |
|   /** @brief remove the supplied row from the supplied system catalog table
 | |
|    *
 | |
|    * @param result the result of the operation
 | |
|    * @param sysCatalogTableName the qualified name of the system catalog table
 | |
|    * @param rid the id of the row to remove
 | |
|    */
 | |
|   void removeRowFromSysCatalog(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID,
 | |
|                                const DDLResult& result, ddlpackage::QualifiedName& sysCatalogTableName,
 | |
|                                WriteEngine::RID& rid);
 | |
| 
 | |
|   /** @brief validate reference constraint for altering existing table
 | |
|    *
 | |
|    * @param sessionID session ID
 | |
|    * @param result the result of the operation
 | |
|    * @param tcn the column which has the foreign key constraint
 | |
|    * @param refIndexName the index name of the referenced primary key constraint
 | |
|    * @return true if violation
 | |
|    */
 | |
|   bool referenceConstraintViolation(uint32_t sessionID, DDLResult& result,
 | |
|                                     execplan::CalpontSystemCatalog::TableColName tcn,
 | |
|                                     execplan::CalpontSystemCatalog::IndexName refIndexName);
 | |
| 
 | |
|   /** @brief validate PK constraint (not null part) for altering existing table
 | |
|    *
 | |
|    * @param sessionID session ID
 | |
|    * @param result the result of the operation
 | |
|    * @param qualifiedName schema.table name
 | |
|    * @param constraintCols the columns associated with the primary key
 | |
|    * @return true if violation
 | |
|    */
 | |
|   bool PKConstraintViolation(uint32_t sessionID, DDLResult& result, ddlpackage::QualifiedName& qualifiedName,
 | |
|                              ddlpackage::ColumnNameList& constraintCols);
 | |
|   /** @brief validate check constraint for altering existing table
 | |
|    *
 | |
|    * @param sessionID session ID
 | |
|    * @param result the result of the operation
 | |
|    * @param qualifiedName schema.table name
 | |
|    * @param checkConstraint the constraint text string
 | |
|    * @return true if violation
 | |
|    */
 | |
|   bool checkConstraintViolation(uint32_t sessionID, DDLResult& result,
 | |
|                                 ddlpackage::QualifiedName& qualifiedName, std::string& checkConstraint);
 | |
| 
 | |
|   /** @brief remove the supplied rows from the supplied system catalog table
 | |
|    *
 | |
|    * @param result the result of the operation
 | |
|    * @param sysCatalogTableName the qualified name of the system catalog table
 | |
|    * @param colRidList the list of row ids to remove
 | |
|    */
 | |
|   void removeRowsFromSysCatalog(uint32_t sessionID, execplan::CalpontSystemCatalog::SCN txnID,
 | |
|                                 const DDLResult& result, ddlpackage::QualifiedName& sysCatalogTableName,
 | |
|                                 execplan::CalpontSystemCatalog::RIDList& colRidList);
 | |
| 
 | |
|   WriteEngine::WriteEngineWrapper fWriteEngine;
 | |
| 
 | |
|   BRM::DBRM* fDbrm;
 | |
| 
 | |
|   execplan::SessionManager fSessionManager;
 | |
|   uint32_t fPMCount;
 | |
|   WriteEngine::WEClients* fWEClient;
 | |
| 
 | |
|   DictionaryOIDList fDictionaryOIDList;
 | |
| 
 | |
|   // store oids used during table and index creation
 | |
|   // for external reference
 | |
|   int fTableOID;
 | |
|   int fStartingColOID;
 | |
|   int fColumnNum;
 | |
|   IndexOID fIdxOID;
 | |
|   std::ofstream fDDLLogFile;
 | |
|   std::string fDDLLogFileName;
 | |
| 
 | |
|   std::string fPKName;  // primary key name supplied by Oracle. Oracle will issue
 | |
|   // two separate DDL statements for a create table with primary
 | |
|   // key DDL, with the 1st one being create index and the 2nd
 | |
|   // one being create table. This PK name will be stored here
 | |
|   // when creatindexprocessor gets the create index statement. This
 | |
|   // is to make sure Calpont use the same system primary key name as Oracle
 | |
|   unsigned const fDDLLoggingId;
 | |
| 
 | |
|   // std::ofstream	       fDDLLogFile;
 | |
|   // std::string            fDDLLogFileName;
 | |
| 
 | |
|   /** @brief convert absolute rid to relative rid in a segement file
 | |
|    *
 | |
|    * @param rid  in:the absolute rid  out:  relative rid in a segement file
 | |
|    * @param dbRoot,partition, segment   the extent information obtained from rid
 | |
|    * @param filesPerColumnPartition,extentRows, extentsPerSegmentFile   the extent map parameters
 | |
|    * @param startDBRoot the dbroot this table starts
 | |
|    * @param dbrootCnt the number of dbroot in db
 | |
|    */
 | |
|   void convertRidToColumn(uint64_t& rid, unsigned& dbRoot, unsigned& partition, unsigned& segment,
 | |
|                           unsigned filesPerColumnPartition, unsigned extentsPerSegmentFile,
 | |
|                           unsigned extentRows, unsigned startDBRoot, unsigned dbrootCnt);
 | |
| 
 | |
|   int rollBackTransaction(uint64_t uniqueId, BRM::TxnID txnID, uint32_t sessionID);
 | |
|   int commitTransaction(uint64_t uniqueId, BRM::TxnID txnID);
 | |
| 
 | |
|   // MCOL-66 The DBRM can't handle concurrent DDL
 | |
|   static boost::mutex dbrmMutex;
 | |
| 
 | |
|  private:
 | |
|   /** @brief clean beginning and ending glitches and spaces from string
 | |
|    *
 | |
|    * @param s string to be cleaned
 | |
|    */
 | |
|   void cleanString(std::string& s);
 | |
|   // std::string            fDDLLogFileName;
 | |
|   DebugLevel fDebugLevel;  // internal use debug level
 | |
| 
 | |
|   const std::string PPLostConnectionErrorCode = "MCS-2045";
 | |
| };
 | |
| /** @brief helper template function to do safe from string to type conversions
 | |
|  *
 | |
|  */
 | |
| template <class T>
 | |
| bool from_string(T& t, const std::string& s, std::ios_base& (*f)(std::ios_base&))
 | |
| {
 | |
|   std::istringstream iss(s);
 | |
|   return !(iss >> f >> t).fail();
 | |
| }
 | |
| 
 | |
| class FormatStatementString
 | |
| {
 | |
|  public:
 | |
|   FormatStatementString() = default;
 | |
|   ~FormatStatementString() = default;
 | |
| 
 | |
|   std::string formatStatementString(const std::string& cmd, const std::string& schema,
 | |
|                                     const std::string& table,
 | |
|                                     const std::set<BRM::LogicalPartition>& partitions)
 | |
|   {
 | |
|     std::ostringstream stmt;
 | |
|     stmt << cmd << "(" << schema << "," << table << ",";
 | |
| 
 | |
|     // There must be at least one partition to drop.
 | |
|     for (auto& p : partitions)
 | |
|     {
 | |
|       stmt << p << ",";
 | |
|     }
 | |
| 
 | |
|     auto res = stmt.str();
 | |
|     res.back() = ')';
 | |
| 
 | |
|     return res;
 | |
|   }
 | |
| };
 | |
| 
 | |
| }  // namespace ddlpackageprocessor
 | |
| 
 | |
| #undef EXPORT
 |