// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@

/*
 *****************************************************************************
 *
 * File:         CmpSeabaseDDL.h
 * Description:  This file describes the DDL classes for Trafodion
 *               
 * Contents:
 *   Metadata table descriptors
 *   class CmpSeabaseDDL
 *
 *****************************************************************************
*/

#ifndef _CMP_SEABASE_DDL_H_
#define _CMP_SEABASE_DDL_H_

#include "ComTdb.h"
#include "ExpHbaseDefs.h"
#include "ExpLOBenums.h"
#include "NADefaults.h"
#include "NAColumn.h"
#include "CmpMessage.h"
#include "PrivMgrDefs.h"
#include "PrivMgrMD.h"
#include "ElemDDLHbaseOptions.h"
#include "CmpContext.h"

class ExpHbaseInterface;
class ExeCliInterface;
class Queue;

class StmtDDLCreateTable;
class StmtDDLDropTable;

class StmtDDLCreateHbaseTable;
class StmtDDLDropHbaseTable;

class StmtDDLCreateIndex;
class StmtDDLDropIndex;
class StmtDDLPopulateIndex;

class StmtDDLAlterTableRename;

class StmtDDLAlterTableAddColumn;
class StmtDDLAlterTableDropColumn;

class StmtDDLAlterTableAlterColumnSetSGOption;

class StmtDDLCreateView;
class StmtDDLDropView;

class StmtDDLCreateLibrary;
class StmtDDLDropLibrary;

class StmtDDLCreateRoutine;
class StmtDDLDropRoutine;

class StmtDDLCreateSequence;
class StmtDDLDropSequence;

class StmtDDLDropSchema;
class StmtDDLAlterSchema;

class StmtDDLRegOrUnregObject;

// Classes for user management
class StmtDDLRegisterUser;
class StmtDDLAlterUser;
class CmpSeabaseDDLauth;
class StmtDDLRegisterComponent;
class PrivMgrComponent;

// classes for constraints
class StmtDDLAddConstraint;
class StmtDDLAddConstraintPK;
class StmtDDLAddConstraintUnique;
class StmtDDLAddConstraintRIArray;
class StmtDDLAddConstraintUniqueArray;
class StmtDDLAddConstraintCheckArray;
class StmtDDLDropConstraint;
class StmtDDLAddConstraintCheck;

class ElemDDLColDefArray;
class ElemDDLColRefArray;
class ElemDDLParamDefArray;
class ElemDDLPartitionClause;

class DDLExpr;
class DDLNode;

class NADefaults;

class NAType;

struct TrafDesc;
class OutputInfo;

class HbaseCreateOption;

class Parser;

class NAColumnArray;

class TrafRoutineDesc;
struct MDDescsInfo;

class CmpDDLwithStatusInfo;

#include "CmpSeabaseDDLmd.h"

// The value HBase uses for checking key length is HConstants.MAX_ROW_LENGTH.
// The rowID length limit in HBase is enforced in HBase modules Put.java and
// Mutation.java. (The above was true as of HBase 1.0.0.)
#define MAX_HBASE_ROWKEY_LEN 32767

#define SEABASEDDL_INTERNAL_ERROR(text)                                   \
   *CmpCommon::diags() << DgSqlCode(-CAT_INTERNAL_EXCEPTION_ERROR) 	  \
                       << DgString0(__FILE__)   		   	  \
                       << DgInt0(__LINE__)			   	  \
                       << DgString1(text) 			   	  

#define CONCAT_CATSCH(tgt,catname,schname)  \
   (tgt = NAString(catname) + \
         NAString(".\"") + \
         NAString(schname) + \
         NAString("\""))

#define HBASE_OPTION_MAX_INTEGER_LENGTH 5

struct objectRefdByMe
{
  Int64 objectUID;
  NAString objectType;
  NAString objectName;
  NAString schemaName;
  NAString catalogName;
};

class CmpSeabaseDDL
{
 public:
  CmpSeabaseDDL(NAHeap *heap, NABoolean syscatInit = TRUE);

  static NABoolean isSeabase(const NAString &catName);

  static NABoolean isHbase(const NAString &catName);

  static bool isHistogramTable(const NAString &tabName);
  static bool isSampleTable(const NAString &tabName);
  static NABoolean isLOBDependentNameMatch(const NAString &name);
  static NABoolean isSeabaseMD(const NAString &catName,
			       const NAString &schName,
			       const NAString &objName);
 
  static ComBoolean isSeabaseMD(const ComObjectName &name);

  static NABoolean isSeabasePrivMgrMD(const NAString &catName,
			              const NAString &schName);
 
  static ComBoolean isSeabasePrivMgrMD(const ComObjectName &name);

  static NABoolean isUserUpdatableSeabaseMD(const NAString &catName,
			       const NAString &schName,
			       const NAString &objName);

  static NABoolean isSeabaseReservedSchema(
                                           const NAString &catName,
                                           const NAString &schName);
 
  static NABoolean isSeabaseExternalSchema(
                                           const NAString &catName,
                                           const NAString &schName);

  static short getTextFromMD(
       const char *catalogName,
       ExeCliInterface * cliInterface,
       Int64 constrUID,
       ComTextType textType,
       Lng32 textSubID,
       NAString &constrText,
       NABoolean binaryData = FALSE);
  
  static short createHistogramTables(
    ExeCliInterface *cliInterface,
    const NAString &schemaName,
    const NABoolean ignoreIfExists,
    NAString &tableNotCreated);

  static std::vector<std::string> getHistogramTables();

  static short invalidateStats(Int64 tableUID);

  short genHbaseRegionDescs(TrafDesc * desc,
                            const NAString &catName, 
                            const NAString &schName, 
                            const NAString &objName);
  
  NABoolean isAuthorizationEnabled();

  short existsInHbase(const NAString &objName,
		      ExpHbaseInterface * ehi = NULL);

  void processSystemCatalog(NADefaults * defs);

  short isPrivMgrMetadataInitialized(NADefaults *defs = NULL,
                                     NABoolean checkAllPrivTables = FALSE);

  short readAndInitDefaultsFromSeabaseDefaultsTable
    (NADefaults::Provenance overwriteIfNotYet, Int32 errOrWarn,
     NADefaults * defs);

  short getSystemSoftwareVersion(Int64 &softMajVers, 
                                 Int64 &softMinVers,
                                 Int64 &softUpdVers);

  short validateVersions(NADefaults *defs, 
			 ExpHbaseInterface * inEHI = NULL,
			 Int64 * mdMajorVersion = NULL,
			 Int64 * mdMinorVersion = NULL,
                         Int64 * mdUpdateVersion = NULL,
                         Int64 * sysSWMajorVersion = NULL,
                         Int64 * sysSWMinorVersion = NULL,
                         Int64 * sysSWUpdVersion = NULL,
                         Int64 * mdSWMajorVersion = NULL,
                         Int64 * mdSWMinorVersion = NULL,
                         Int64 * mdSWUpdateVersion = NULL,
			 Lng32 * hbaseErr = NULL,
			 NAString * hbaseErrStr = NULL);

  short executeSeabaseDDL(DDLExpr * ddlExpr, ExprNode * ddlNode,
			  NAString &currCatName, NAString &currSchName,
                          CmpDDLwithStatusInfo *dws = NULL);

  TrafDesc * getSeabaseTableDesc(const NAString &catName, 
				    const NAString &schName, 
				    const NAString &objName,
				    const ComObjectType objType,
				    NABoolean includeInvalidDefs = FALSE);

  short getSeabaseObjectComment(Int64 object_uid, 
	                            enum ComObjectType object_type, 
	                            ComTdbVirtObjCommentInfo & comment_info,
	                            CollHeap * heap);

  short getObjectOwner(ExeCliInterface *cliInterface,
                        const char * catName,
                        const char * schName,
                        const char * objName,
                        const char * objType,
                        Int32 * objectOwner);

  static bool describeSchema(
     const NAString & catalogName,
     const NAString & schemaName,
     NABoolean isHiveRegistered,
     std::vector<std::string> & outlines);
     
  static Int64 getObjectTypeandOwner(ExeCliInterface *cliInterface,
                              const char * catName,
                              const char * schName,
                              const char * objName,
                              ComObjectType & objectType,
                              Int32 & objectOwner);
                              
  short getSaltText(ExeCliInterface *cliInterface,
                    const char * catName,
                    const char * schName,
                    const char * objName,
                    const char * inObjType,
                    NAString& saltText) ;

  static short genHbaseCreateOptions(
				     const char * hbaseCreateOptionsStr,
				     NAList<HbaseCreateOption*>* &hbaseCreateOptions,
				     NAMemory * heap,
                                     size_t * beginPos,
                                     size_t * endPos);

  static short genHbaseOptionsMetadataString(                                          
                                      const NAList<HbaseCreateOption*> & hbaseCreateOptions,
                                      NAString & hbaseOptionsMetadataString /* out */);

  short updateHbaseOptionsInMetadata(ExeCliInterface * cliInterface,
                                     Int64 objectUID,
                                     ElemDDLHbaseOptions * edhbo);

  TrafDesc * getSeabaseLibraryDesc(
     const NAString &catName, 
     const NAString &schName, 
     const NAString &libraryName);
     
  TrafDesc *getSeabaseRoutineDesc(const NAString &catName,
                                     const NAString &schName,
                                     const NAString &objName);
  
  static NABoolean getOldMDInfo(const MDTableInfo  &mdti,
                                const char* &oldName,
                                const QString* &oldDDL, Lng32 &sizeOfOldDDL);
  
  short createMDdescs(MDDescsInfo *&);

  static NAString getSystemCatalogStatic();

  static NABoolean isEncodingNeededForSerialization(NAColumn * nac);
  
  int32_t verifyDDLCreateOperationAuthorized(
     ExeCliInterface * cliInterface,
     SQLOperation operation,
     const NAString & catalogName,
     const NAString & schemaName,
     ComSchemaClass & schemaClass,
     Int32 & objectOwner,
     Int32 & schemaOwner);
     
  bool isDDLOperationAuthorized(
     SQLOperation operation,
     const Int32 objOwnerId,
     const Int32 schemaOwnerID);
  
  static NABoolean enabledForSerialization(NAColumn * nac);

  static NABoolean isSerialized(ULng32 flags)
  {
    return (flags & NAColumn::SEABASE_SERIALIZED) != 0;
  }

  short buildColInfoArray(
                          ComObjectType objType,
                          NABoolean isMetadataHistOrReposObject,
			  ElemDDLColDefArray * colArray,
			  ComTdbVirtTableColumnInfo * colInfoArray,
			  NABoolean implicitPK,
                          NABoolean alignedFormat,
                          Lng32 *identityColPos = NULL,
                          std::vector<NAString> *userColFamVec = NULL,
                          std::vector<NAString> *trafColFamVec = NULL,
                          const char * defaultColFam = NULL,
			  NAMemory * heap = NULL);

  // The next three methods do use anything from the CmpSeabaseDDL class.
  // They are placed here as a packaging convinience, to avoid code 
  // duplication that would occur if non-member static functions were used.
  // These methods convert VirtTable*Info classes to corresponding TrafDesc
  // objects
  void convertVirtTableColumnInfoToDescStruct( 
       const ComTdbVirtTableColumnInfo * colInfo,
       const ComObjectName * objectName,
       TrafDesc * column_desc);

  TrafDesc * convertVirtTableColumnInfoArrayToDescStructs(
     const ComObjectName * objectName,
     const ComTdbVirtTableColumnInfo * colInfoArray,
     Lng32 numCols);

  TrafDesc * convertVirtTableKeyInfoArrayToDescStructs(
       const ComTdbVirtTableKeyInfo *keyInfoArray,
       const ComTdbVirtTableColumnInfo *colInfoArray,
       Lng32 numKeys);
  
  Int64 getObjectUID(
       ExeCliInterface *cliInterface,
       const char * catName,
       const char * schName,
       const char * objName,
       const char * inObjType,
       const char * inObjTypeStr = NULL,
       char * outObjType = NULL,
       NABoolean lookInObjectsIdx = FALSE,
       NABoolean reportErrorNow = TRUE);
  
  Int64 getObjectInfo(
       ExeCliInterface * cliInterface,
       const char * catName,
       const char * schName,
       const char * objName,
       const ComObjectType objectType,
       Int32 & objectOwner,
       Int32 & schemaOwner,
       Int64 & objectFlags,
       bool reportErrorNow = true,
       NABoolean checkForValidDef = FALSE,
       Int64 * createTime = NULL);
  
  short getObjectName(
       ExeCliInterface *cliInterface,
       Int64 objUID,
       NAString &catName,
       NAString &schName,
       NAString &objName,
       char * outObjType = NULL,
       NABoolean lookInObjects = FALSE,
       NABoolean lookInObjectsIdx = FALSE);
  
  short getObjectValidDef(ExeCliInterface *cliInterface,
                          const char * catName,
                          const char * schName,
                          const char * objName,
                          const ComObjectType objectType,
                          NABoolean &validDef);
  
  short genTrafColFam(int index, NAString &trafColFam);
  
  static short extractTrafColFam(const NAString &trafColFam, int &index);
  
  short processColFamily(NAString &inColFamily,
                         NAString &outColFamily,
                         std::vector<NAString> *userColFamVec,
                         std::vector<NAString> *trafColFamVec);
  
  short switchCompiler(Int32 cntxtType = CmpContextInfo::CMPCONTEXT_TYPE_META);
  
  short switchBackCompiler();
  
  ExpHbaseInterface* allocEHI(NADefaults * defs = NULL);
  
  short ddlInvalidateNATables();
  
  void deallocEHI(ExpHbaseInterface* &ehi);
  void dropLOBHdfsFiles();
  
  static void setMDflags(Int64 &flags, //INOUT
                         Int64 bitFlags)
  {
    flags |= bitFlags;
  }
  
  static void resetMDflags(Int64 &flags, //INOUT
                           Int64 bitFlags)
  {
    flags &= ~bitFlags;
  }
  
  static NABoolean isMDflagsSet(Int64 flags, Int64 bitFlags)
  {
    return (flags &= bitFlags) != 0; 
  }
  
  enum {
    // set if we need to get the hbase snapshot info of the table
    GET_SNAPSHOTS     = 0x0002,

    // set if descr is to be generated in packed format to be stored in metadata
    GEN_PACKED_DESC   = 0x0004,

    // set if stored object descriptor is to be read from metadata.
    READ_OBJECT_DESC  = 0x0008
  };

  enum 
    {
      MD_TABLE_CONSTRAINTS_PKEY_NOT_SERIALIZED_FLG  = 0x0001
    };
protected:
  
  void setFlags(ULng32 &flags, ULng32 flagbits)
  {
    flags |= flagbits;
  }

  void resetFlags(ULng32 &flags, ULng32 flagbits)
  {
    flags &= ~flagbits;
  }
  
  inline const char * getMDSchema() {return seabaseMDSchema_.data();};

  const char * getSystemCatalog();

  ComBoolean isSeabaseReservedSchema(const ComObjectName &name);

  ComBoolean isSeabase(const ComObjectName &name) ;

  ComBoolean isHbase(const ComObjectName &name) ;

  short isMetadataInitialized(ExpHbaseInterface * ehi = NULL);
  short isOldMetadataInitialized(ExpHbaseInterface * ehi);

  ExpHbaseInterface* allocEHI(const char * server, const char * zkPort,
                              NABoolean raiseError);
  
  // if prevContext is defined, get user CQDs from the controlDB of
  // previous context and send them to the new cmp context
  short sendAllControlsAndFlags(CmpContext* prevContext=NULL,
				Int32 cntxtType=-1);

  void restoreAllControlsAndFlags();
  
  void processReturn(Lng32 retcode = 0);

  // construct and return the column name value as stored with hbase rows.
  // colNum is 0-based (first col is 0)
  void getColName(const ComTdbVirtTableColumnInfo columnInfo[],
		  Lng32 colNum, NAString &colName);
  
  void getColName(const char * colFam, const char * colQual,
		  NAString &colName);

  TrafDesc *getSeabaseRoutineDescInternal(const NAString &catName,
                                             const NAString &schName,
                                             const NAString &objName);

  // note: this function expects hbaseCreateOptionsArray to have
  // HBASE_MAX_OPTIONS elements
  short generateHbaseOptionsArray(NAText * hbaseCreateOptionsArray,
    NAList<HbaseCreateOption*> * hbaseCreateOptions);

  short createHbaseTable(ExpHbaseInterface *ehi, 
			 HbaseStr *table,
			 const char * cf1, 
                         NAList<HbaseCreateOption*> * hbaseCreateOptions = NULL,
                         const int numSplits = 0,
                         const int keyLength = 0,
                         char **encodedKeysBuffer = NULL,
			 NABoolean doRetry = FALSE,
                         NABoolean ddlXns = FALSE);

  short createHbaseTable(ExpHbaseInterface *ehi, 
			 HbaseStr *table,
                         std::vector<NAString> &collFamVec,
                         NAList<HbaseCreateOption*> * hbaseCreateOptions = NULL,
                         const int numSplits = 0,
                         const int keyLength = 0,
                         char **encodedKeysBuffer = NULL,
			 NABoolean doRetry = TRUE,
                         NABoolean ddlXns = FALSE);

  short alterHbaseTable(ExpHbaseInterface *ehi,
                        HbaseStr *table,
                        NAList<NAString> &allColFams,
                        NAList<HbaseCreateOption*> * hbaseCreateOptions,
                        NABoolean ddlXns);

  short dropHbaseTable(ExpHbaseInterface *ehi, 
		       HbaseStr *table, NABoolean asyncDrop,
                       NABoolean ddlXns);

  short copyHbaseTable(ExpHbaseInterface *ehi, 
		       HbaseStr *currTable, HbaseStr* oldTable);

  NABoolean xnInProgress(ExeCliInterface *cliInterface);
  short beginXn(ExeCliInterface *cliInterface);
  short commitXn(ExeCliInterface *cliInterface);
  short rollbackXn(ExeCliInterface *cliInterface);
  short autoCommit(ExeCliInterface *cliInterface, NABoolean v);
  short beginXnIfNotInProgress(ExeCliInterface *cliInterface, 
                               NABoolean &xnWasStartedHere);
  short endXnIfStartedHere(ExeCliInterface *cliInterface, 
                           NABoolean &xnWasStartedHere, Int32 cliRC);

  short dropSeabaseObject(ExpHbaseInterface *ehi,
			  const NAString &objName,
			  NAString &currCatName, NAString &currSchName,
			  const ComObjectType objType,
                          NABoolean ddlXns,
			  NABoolean dropFromMD = TRUE,
			  NABoolean dropFromHbase = TRUE);
  
  short dropSeabaseStats(ExeCliInterface *cliInterface,
                         const char * catName,
                         const char * schName,
                         Int64 tableUID);

  short checkDefaultValue(
			  const NAString & colExtName,
			  const NAType    * inColType,
			  ElemDDLColDef   * colNode);
  
  short getTypeInfo(const NAType * naType,
                    NABoolean alignedFormat,
		    Lng32 serializedOption,
		    Lng32 &datatype,
		    Lng32 &length,
		    Lng32 &precision,
		    Lng32 &scale,
		    Lng32 &dtStart,
		    Lng32 &dtEnd,
		    Lng32 &upshifted,
		    Lng32 &nullable,
		    NAString &charset,
		    CharInfo::Collation &collationSequence,
		    ULng32 &colFlags);

  short getColInfo(ElemDDLColDef * colNode, 
                   NABoolean isMetadataHistOrReposColumn,
                   NAString &colFamily,
		   NAString &colName,
                   NABoolean alignedFormat,
		   Lng32 &datatype,
		   Lng32 &length,
		   Lng32 &precision,
		   Lng32 &scale,
		   Lng32 &dtStart,
		   Lng32 &dtEnd,
		   Lng32 &upshifted,
		   Lng32 &nullable,
		   NAString &charset,
                   ComColumnClass &colClass,
		   ComColumnDefaultClass &defaultClass,
		   NAString &defVal,
		   NAString &heading,
		   LobsStorage &lobStorage,
		   ULng32 &hbaseColFlags,
                   Int64 &colFlags);

  short getNAColumnFromColDef(ElemDDLColDef * colNode,
                              NAColumn* &naCol);
  
  short createRowId(NAString &key,
		    NAString &part1, Lng32 part1MaxLen,
		    NAString &part2, Lng32 part2MaxLen,
		    NAString &part3, Lng32 part3MaxLen,
		    NAString &part4, Lng32 part4MaxLen);
  
  short existsInSeabaseMDTable(
			       ExeCliInterface *cliInterface,
			       const char * catName,
			       const char * schName,
			       const char * objName,
			       const ComObjectType objectType = COM_UNKNOWN_OBJECT,
			       NABoolean checkForValidDef = TRUE,
			       NABoolean checkForValidHbaseName = TRUE,
                               NABoolean returnInvalidStateError = FALSE);
  
  Int64 getConstraintOnIndex(
			     ExeCliInterface *cliInterface,
			     Int64 btUID,
			     Int64 indexUID,
			     const char * constrType,
			     NAString &catName,
			     NAString &schName,
			     NAString &objName);

  short getBaseTable(ExeCliInterface *cliInterface,
		     const NAString &indexCatName,
		     const NAString &indexSchName,
		     const NAString &indexObjName,
		     NAString &btCatName,
		     NAString &btSchName,
		     NAString &btObjName,
		     Int64 &btUID,
                     Int32 &btObjOwner,
                     Int32 &btSchemaOwner);
  
  short getUsingObject(ExeCliInterface *cliInterface,
		       Int64 objUID,
		       NAString &usingObjName);

  short getUsingRoutines(ExeCliInterface *cliInterface,
                         Int64 objUID,
                         Queue * & usingRoutinesQueue);
  
  short getUsingViews(ExeCliInterface *cliInterface,
                      Int64 objectUID,
                      Queue * &usingViewsQueue);
  
  short getAllUsingViews(ExeCliInterface *cliInterface,
                         NAString &catName,
                         NAString &schName,
                         NAString &objName,
                         Queue * &usingViewsQueue);

  void handleDDLCreateAuthorizationError(
     int32_t SQLErrorCode,
     const NAString & catalogName, 
     const NAString & schemaName);
     
  short updateSeabaseMDObjectsTable(
                                    ExeCliInterface * cliInterface,
                                    const char * catName,
                                    const char * schName,
                                    const char * objName,
                                    const ComObjectType & objectType,
                                    const char * validDef, 
                                    Int32 objOwnerID,
                                    Int32 schemaOwnerID,
                                    Int64 objectFlags,
                                    Int64 & inUID);
                                
  short deleteFromSeabaseMDObjectsTable(
       ExeCliInterface *cliInterface,
       const char * catName,
       const char * schName,
       const char * objName,
       const ComObjectType & objectType);
  
  short getAllIndexes(ExeCliInterface *cliInterface,
                      Int64 objUID,
                      NABoolean includeInvalidDefs,
                      Queue * &indexInfoQueue);

  short updateSeabaseMDTable(
			     ExeCliInterface *cliInterface,
			     const char * catName,
			     const char * schName,
			     const char * objName,
                             const ComObjectType & objectType,
			     const char * validDef,
			     ComTdbVirtTableTableInfo * tableInfo,
			     Lng32 numCols,
			     const ComTdbVirtTableColumnInfo * colInfo,
			     Lng32 numKeys,
			     const ComTdbVirtTableKeyInfo * keyInfo,
			     Lng32 numIndexes,
			     const ComTdbVirtTableIndexInfo * indexInfo,
                             Int64 &inUID,
                             NABoolean updPrivs = TRUE);

  short deleteFromSeabaseMDTable(
				 ExeCliInterface *cliInterface,
				 const char * catName,
				 const char * schName,
				 const char * objName,
				 const ComObjectType objType);

  short updateSeabaseMDSPJ(
                            ExeCliInterface *cliInterface,
                            const char * catName,
                            const char * schName,
                            const char * libname,
                            const char * libPath,
                            const Int32 ownerID,
                            const Int32 schemaOwnerID,
                            const ComTdbVirtTableRoutineInfo * routineInfo,
                            Lng32 numCols,
                            const ComTdbVirtTableColumnInfo * colInfo);

  short deleteConstraintInfoFromSeabaseMDTables(
						ExeCliInterface *cliInterface,
						Int64 tableUID,
						Int64 otherTableUID, // valid for ref constrs
						Int64 constrUID,
						Int64 otherConstrUID, // valid for ref constrs
						const char * constrCatName,
						const char * constrSchName,
						const char * constrObjName,
						const ComObjectType constrType);

  short updateObjectName(
			 ExeCliInterface *cliInterface,
			 Int64 objUID,
			 const char * catName,
			 const char * schName,
			 const char * objName);

  // retrieved stored desc from metadata, check if it is good,
  // and set retDesc, if passed in.
  short checkAndGetStoredObjectDesc(
       ExeCliInterface *cliInterface,
       Int64 objUID,
       TrafDesc* *retDesc);

  short updateObjectRedefTime(
                              ExeCliInterface *cliInterface,
                              const NAString &catName,
                              const NAString &schName,
                              const NAString &objName,
                              const char * objType,
                              Int64 rt = -1,
                              Int64 objUID = -1,
                              NABoolean force = FALSE);

  short updateObjectValidDef(
			     ExeCliInterface *cliInterface,
			     const char * catName,
			     const char * schName,
			     const char * objName,
			     const char * objType,
			     const char * validDef);
  
  short updateObjectAuditAttr(
			    ExeCliInterface *cliInterface,
			    const char * catName,
			    const char * schName,
			    const char * objName,
			    NABoolean audited,
                            const NAString& objType);

  short updateObjectFlags(
       ExeCliInterface *cliInterface,
       const Int64 objUID,
       const Int64 inFlags,
       NABoolean reset);

  // subID: 0, for text that belongs to table. colNumber, for column based text.
  short updateTextTable(ExeCliInterface *cliInterface,
                        Int64 objUID, 
                        ComTextType textType, 
                        Lng32 subID, 
                        NAString &textInputData,
                        char * binaryInputData = NULL,
                        Lng32 binaryInputDataLen = -1,
                        NABoolean withDelete = FALSE); // del before ins

  // input data in non-char format.
  short updateTextTableWithBinaryData(ExeCliInterface *cliInterface,
                                      Int64 objUID, 
                                      ComTextType textType, 
                                      Lng32 subID, 
                                      char * data,
                                      Int32 dataLen,
                                      NABoolean withDelete);
  
  short deleteFromTextTable(ExeCliInterface *cliInterface,
                            Int64 objUID, 
                            ComTextType textType, 
                            Lng32 subID);

  ItemExpr * bindDivisionExprAtDDLTime(ItemExpr *expr,
                                       NAColumnArray *availableCols,
                                       NAHeap *heap);
  short validateDivisionByExprForDDL(ItemExpr *divExpr);

  short createEncodedKeysBuffer(char** &encodedKeysBuffer,
                                int &numSplits,
				TrafDesc * colDescs, TrafDesc * keyDescs,
				int numSaltPartitions,
                                Lng32 numSaltSplits,
                                NAString *splitByClause,
                                Lng32 numKeys,
                                Lng32 keyLength, NABoolean isIndex);

  short validateRoutine( 
                        ExeCliInterface *cliInterface,
                        const char * className,
                        const char * methodName,
                        const char * externalPath,
                        char * signature,
                        Int32 numSqlParam,
                        Int32 maxResultSets,
                        const char * optionalSig) ;

  short populateKeyInfo(ComTdbVirtTableKeyInfo &keyInfo,
			OutputInfo * oi, NABoolean isIndex = FALSE);
  
  short dropMDTable(ExpHbaseInterface *ehi, const char * tab);
  
  short populateSeabaseIndexFromTable(
				      ExeCliInterface * cliInterface,
				      NABoolean uniqueIndex,
				      const NAString &indexName, 
                                      const ComObjectName &tableName,
				      NAList<NAString> &selColList,
				      NABoolean useLoad );
  
  short buildViewText(StmtDDLCreateView * createViewParseNode,
		      NAString &viewText);
  
  short buildViewColInfo(StmtDDLCreateView * createViewParseNode,
			 ElemDDLColDefArray * colDefArray);
  
  short buildViewTblColUsage(const StmtDDLCreateView * createViewParseNode,
                             const ComTdbVirtTableColumnInfo * colInfoArray,
                             const Int64 viewObjUID, NAString &viewColUsageText);

  short buildColInfoArray(ElemDDLParamDefArray *paramArray,
                          ComTdbVirtTableColumnInfo * colInfoArray);
  
  short buildKeyInfoArray(
			  ElemDDLColDefArray *colArray,
                          NAColumnArray *nacolArray,
			  ElemDDLColRefArray *keyArray,
			  ComTdbVirtTableColumnInfo * colInfoArray,
			  ComTdbVirtTableKeyInfo * keyInfoArray,
			  NABoolean allowNullableUniqueConstr,
                          Lng32 *keyLength = NULL,
			  NAMemory * heap = NULL);

  const char * computeCheckOption(StmtDDLCreateView * createViewParseNode);
  
  short updateViewUsage(StmtDDLCreateView * createViewParseNode,
			Int64 viewUID,
			ExeCliInterface * cliInterface);

  short unregisterHiveViewUsage(StmtDDLCreateView * createViewParseNode,
                                Int64 viewUID,
                                ExeCliInterface * cliInterface);
  
  short gatherViewPrivileges (const StmtDDLCreateView * createViewParseNode,
                              ExeCliInterface * cliInterface,
                              NABoolean viewCreator,
                              Int32 userID,
                              PrivMgrBitmap &privilegesBitmap,
                              PrivMgrBitmap &grantableBitmap);

  short getListOfReferencedTables (ExeCliInterface * cliInterface,
                                   const Int64 objectUID,
                                   NAList<objectRefdByMe> &tablesList);

  short getListOfDirectlyReferencedObjects (ExeCliInterface *cliInterface,
                                            const Int64 objectUID,
                                            NAList<objectRefdByMe> &objectsList);

  short genPKeyName(StmtDDLAddConstraintPK *addPKNode,
		    const char * catName,
		    const char * schName,
		    const char * objName,
		    NAString &pkeyName);

  short constraintErrorChecks(
                              ExeCliInterface * cliInterface,
			      StmtDDLAddConstraint *addConstrNode,
			      NATable * naTable,
			      ComConstraintType ct,
			      NAList<NAString> &keyColList);

  short updateConstraintMD(
			   NAList<NAString> &keyColList,
			   NAList<NAString> &keyColOrderList,
			   NAString &uniqueStr,
			   Int64 tableUID,
			   Int64 uniqueUID,
			   NATable * naTable,
			   ComConstraintType ct,
                           NABoolean enforced,
			   ExeCliInterface *cliInterface);

  short updateRIConstraintMD(
			     Int64 ringConstrUID,
			     Int64 refdConstrUID,
			     ExeCliInterface *cliInterface);

  short updatePKeyInfo(
		       StmtDDLAddConstraintPK *addPKNode,
		       const char * catName,
		       const char * schName,
		       const char * objName,
                       const Int32 ownerID,
                       const Int32 schemaOwnerID,
		       Lng32 numKeys,
		       Int64 * outPkeyUID,
		       Int64 *outTableUID,
		       const ComTdbVirtTableKeyInfo * keyInfoArray,
		       ExeCliInterface *cliInterface);

  short getPKeyInfoForTable (
                            const char *catName,
                            const char *schName,
                            const char *objName,
                            ExeCliInterface *cliInterface,
                            NAString &constrName,
                            Int64 &constrUID);

  short updateRIInfo(
		       StmtDDLAddConstraintRIArray &riArray,
		       const char * catName,
		       const char * schName,
		       const char * objName,
		       ExeCliInterface *cliInterface);

  short genUniqueName(StmtDDLAddConstraint *addUniqueNode,
		    NAString &pkeyName);

  short updateIndexInfo(
			NAList<NAString> &ringKeyColList,
			NAList<NAString> &ringKeyColOrderList,
			NAList<NAString> &refdKeyColList,
			NAString &uniqueStr,
			Int64 constrUID,
			const char * catName,
			const char * schName,
			const char * objName,
			NATable * naTable,
			NABoolean isUnique, // TRUE: uniq constr. FALSE: ref constr.
			NABoolean noPopulate, // TRUE, dont populate index
                        NABoolean isEnforced, // TRUE: contraint is enforced
                        NABoolean sameSequenceOfCols, // FALSE, allow "similar" indexes
			ExeCliInterface *cliInterface);

  short createMetadataViews(ExeCliInterface * cliInterface);
  short dropMetadataViews(ExeCliInterface * cliInterface);
 
  int addSchemaObject(
     ExeCliInterface & cliInterface,
     const ComSchemaName & schemaName,
     ComSchemaClass schemaClass,
     Int32 ownerID,
     NABoolean ignoreIfExists);
     
  short createSchemaObjects(ExeCliInterface * cliInterface);
  
  void  createSeabaseSchema(
     StmtDDLCreateSchema  * createSchemaNode,
     NAString             & currCatName);


  void cleanupObjectAfterError(
                               ExeCliInterface &cliInterface,
                               const NAString &catName, 
                               const NAString &schName,
                               const NAString &objName,
                               const ComObjectType objectType,
                               NABoolean ddlXns);

  NABoolean appendErrorObjName(char * errorObjs, 
                               const char * objName);

  short setupAndErrorChecks(NAString &tabName, QualifiedName &origTableName, 
                            NAString &currCatName, NAString &currSchName,
                            NAString &catalogNamePart, 
                            NAString &schemaNamePart, 
                            NAString &objectNamePart,
                            NAString &extTableName, NAString &extNameForHbase,
                            CorrName &cn,
                            NATable* *naTable,
                            NABoolean volTabSupported, 
                            NABoolean hbaseMapSupported,
                            ExeCliInterface *cliInterface,
                            const ComObjectType objectType = COM_BASE_TABLE_OBJECT,
                            SQLOperation operation = SQLOperation::ALTER_TABLE,
                            NABoolean isExternal = FALSE);
  
  void purgedataObjectAfterError(
                               ExeCliInterface &cliInterface,
                               const NAString &catName, 
                               const NAString &schName,
                               const NAString &objName,
                               const ComObjectType objectType,
                               NABoolean dontForceCleanup);

  short createSeabaseTable2(
                            ExeCliInterface &cliInterface,
                            StmtDDLCreateTable * createTableNode,
                            NAString &currCatName, NAString &currSchName,
                            NABoolean isCompound,
                            Int64 &objUID);
  
  void createSeabaseTable(
			  StmtDDLCreateTable * createTableNode,
			  NAString &currCatName, NAString &currSchName,
                          NABoolean isCompound = FALSE,
                          Int64 * retObjUID = NULL);
 
  void createSeabaseTableCompound(
			  StmtDDLCreateTable                  * createTableNode,
			  NAString &currCatName, NAString &currSchName);
 
  short createSeabaseTableLike2(
       CorrName &cn,
       const NAString &likeTabName,
       NABoolean withPartns = FALSE,
       NABoolean withoutSalt = FALSE,
       NABoolean withoutDivision = FALSE,
       NABoolean withoutRowFormat = FALSE);

  void createSeabaseTableLike(
       ExeCliInterface *cliInterface,
       StmtDDLCreateTable                  * createTableNode,
       NAString &currCatName, NAString &currSchName);

  short createSeabaseTableExternal(
                                   ExeCliInterface &cliInterface,
                                   StmtDDLCreateTable * createTableNode,
                                   const ComObjectName &tgtTableName,
                                   const ComObjectName &srcTableName);

  // makes a copy of underlying hbase table
  short cloneHbaseTable(
       const NAString &srcTable, const NAString &clonedTable,
       ExpHbaseInterface * inEHI);

  // makes a copy of traf metadata and underlying hbase table
  short cloneSeabaseTable(
       const NAString &srcTableNameStr,
       Int64 srcObjUID,
       const NAString &clonedTableNameStr,
       const NATable * naTable,
       ExpHbaseInterface * ehi,
       ExeCliInterface * cilInterface,
       NABoolean withCreate);

  short dropSeabaseTable2(
                          ExeCliInterface *cliInterface,
                          StmtDDLDropTable * dropTableNode,
                          NAString &currCatName, NAString &currSchName);
  
  void dropSeabaseTable(
			StmtDDLDropTable                  * dropTableNode,
			NAString &currCatName, NAString &currSchName);
  
  void createSeabaseIndex(
			  StmtDDLCreateIndex                  * createIndexNode,
			  NAString &currCatName, NAString &currSchName);
  
  void populateSeabaseIndex(
			    StmtDDLPopulateIndex                  * populateIndexNode,
			    NAString &currCatName, NAString &currSchName);
  
  void dropSeabaseIndex(
			StmtDDLDropIndex                  * dropIndexNode,
			NAString &currCatName, NAString &currSchName);

  void renameSeabaseTable(
			  StmtDDLAlterTableRename                  * renameTableNode,
			  NAString &currCatName, NAString &currSchName);

  void alterSeabaseTableStoredDesc(
       StmtDDLAlterTableStoredDesc * alterStoredDesc,
       NAString &currCatName, NAString &currSchName);

  void alterSeabaseTableHBaseOptions(
			  StmtDDLAlterTableHBaseOptions * hbaseOptionsNode,
			  NAString &currCatName, NAString &currSchName);
  void alterSeabaseIndexHBaseOptions(
			  StmtDDLAlterIndexHBaseOptions * hbaseOptionsNode,
			  NAString &currCatName, NAString &currSchName);

  void addConstraints(
       ComObjectName &tableName,
       ComAnsiNamePart &currCatAnsiName,
       ComAnsiNamePart &currSchAnsiName,
       StmtDDLNode * ddlNode,
       StmtDDLAddConstraintPK * pkConstr,
       StmtDDLAddConstraintUniqueArray &uniqueConstrArr,
       StmtDDLAddConstraintRIArray &riConstrArr,
       StmtDDLAddConstraintCheckArray &checkConstrArr,
       NABoolean isCompound = FALSE);
  
  void alterSeabaseTableAddColumn(
       StmtDDLAlterTableAddColumn * alterAddColNode,
       NAString &currCatName, NAString &currSchName);
  

  short updateMDforDropCol(ExeCliInterface &cliInterface,
                           const NATable * naTable,
                           Lng32 dropColNum);

  short alignedFormatTableDropColumn(
       const NAString &catalogNamePart,
       const NAString &schemaNamePart,
       const NAString &objectNamePart,
       const NATable * naTable,
       const NAString &altColName,
       ElemDDLColDef *pColDef,
       NABoolean ddlXns,
       NAList<NAString> &viewNameList,
       NAList<NAString> &viewDefnList);
  
 short hbaseFormatTableDropColumn(
      ExpHbaseInterface *ehi,
      const NAString &catalogNamePart,
      const NAString &schemaNamePart,
      const NAString &objectNamePart,
      const NATable * naTable,
      const NAString &altColName,
      const NAColumn * nacol,
      NABoolean ddlXns,
      NAList<NAString> &viewNameList,
      NAList<NAString> &viewDefnList);
  
  void alterSeabaseTableDropColumn(
       StmtDDLAlterTableDropColumn * alterDropColNode,
       NAString &currCatName, NAString &currSchName);
  
  short saveAndDropUsingViews(Int64 objUID,
                              ExeCliInterface *cliInterface,
                              NAList<NAString> &viewNameList,
                              NAList<NAString> &viewDefnList);
  
  short recreateUsingViews(ExeCliInterface *cliInterface,
                           NAList<NAString> &viewNameList,
                           NAList<NAString> &viewDefnList,
                           NABoolean ddlXns);

  void alterSeabaseTableAlterIdentityColumn(
       StmtDDLAlterTableAlterColumnSetSGOption * alterIdentityColNode,
       NAString &currCatName, NAString &currSchName);
  
  short mdOnlyAlterColumnAttr(
       const NAString &catalogNamePart, const NAString &schemaNamePart,
       const NAString &objectNamePart,
       const NATable * naTable, const NAColumn * naCol, NAType * newType,
       StmtDDLAlterTableAlterColumnDatatype * alterColNode,
       NAList<NAString> &viewNameList,
       NAList<NAString> &viewDefnList);
  
  short hbaseFormatTableAlterColumnAttr(
       const NAString &catalogNamePart, const NAString &schemaNamePart,
       const NAString &objectNamePart,
       const NATable * naTable, const NAColumn * naCol, NAType * newType,
       StmtDDLAlterTableAlterColumnDatatype * alterColNode);
  
  short alignedFormatTableAlterColumnAttr
  (
       const NAString &catalogNamePart,
       const NAString &schemaNamePart,
       const NAString &objectNamePart,
       const NATable * naTable,
       const NAString &altColName,
       ElemDDLColDef *pColDef,
       NABoolean ddlXns,
       NAList<NAString> &viewNameList,
       NAList<NAString> &viewDefnList);
  
  void alterSeabaseTableAlterColumnDatatype(
       StmtDDLAlterTableAlterColumnDatatype * alterColumnDatatype,
       NAString &currCatName, NAString &currSchName);
  
  void alterSeabaseTableAlterColumnRename(
       StmtDDLAlterTableAlterColumnRename * alterColumnDatatype,
       NAString &currCatName, NAString &currSchName);
  
  void alterSeabaseTableAddPKeyConstraint(
       StmtDDLAddConstraint * alterAddConstraint,
       NAString &currCatName, NAString &currSchName);
  
  void alterSeabaseTableAddUniqueConstraint(
       StmtDDLAddConstraint * alterAddConstraint,
       NAString &currCatName, NAString &currSchName);
  
  short isCircularDependent(
       CorrName &ringTable,
       CorrName &refdTable,
       CorrName &origRingTable,
       BindWA *bindWA);
  
  void alterSeabaseTableAddRIConstraint(
       StmtDDLAddConstraint * alterAddConstraint,
       NAString &currCatName, NAString &currSchName);
  
  short getCheckConstraintText(StmtDDLAddConstraintCheck *addCheckNode,
			       NAString &checkConstrText);
  
  short getTextFromMD(
       ExeCliInterface * cliInterface,
       Int64 constrUID,
       ComTextType textType,
       Lng32 textSubID,
       NAString &constrText,
       NABoolean binaryData = FALSE);
  
  void alterSeabaseTableAddCheckConstraint(
					StmtDDLAddConstraint * alterAddConstraint,
					NAString &currCatName, NAString &currSchName);

  void alterSeabaseTableDropConstraint(
				  StmtDDLDropConstraint * alterDropConstraint,
				  NAString &currCatName, NAString &currSchName);

  void alterSeabaseTableDisableOrEnableIndex(
					     ExprNode * ddlNode,
					     NAString &currCatName, NAString &currSchName);

  void alterSeabaseTableDisableOrEnableAllIndexes(
                                               ExprNode * ddlNode,
                                               NAString &currCatName,
                                               NAString &currSchName,
                                               NAString &tableName,
                                               NABoolean allUniquesOnly);
  short alterSeabaseTableDisableOrEnableIndex(
                                              const char * catName,
                                              const char * schName,
                                              const char * idxName,
                                              const char * tabName,
                                               NABoolean isDisable);

  void createSeabaseView(
			 StmtDDLCreateView                  * createViewNode,
			 NAString &currCatName, NAString &currSchName);
  
  void dropSeabaseView(
		       StmtDDLDropView                  * dropViewNode,
		       NAString &currCatName, NAString &currSchName);

  void createSeabaseLibrary(StmtDDLCreateLibrary  * createLibraryNode,
                            NAString &currCatName, NAString &currSchName);
  
  void registerSeabaseUser (
                            StmtDDLRegisterUser        * registerUserNode);
  void alterSeabaseUser (
                            StmtDDLAlterUser        * alterUserNode);
  void unregisterSeabaseUser (
                            StmtDDLRegisterUser        * registerUserNode);
  void registerSeabaseComponent (
                            StmtDDLRegisterComponent   * registerComponentNode);

  void dropSeabaseLibrary(StmtDDLDropLibrary  * dropLibraryNode,
                          NAString &currCatName, NAString &currSchName);

  void  alterSeabaseLibrary(StmtDDLAlterLibrary  *alterLibraryNode,
			    NAString &currCatName, NAString &currSchName);

  void createSeabaseRoutine(StmtDDLCreateRoutine  * createRoutineNode,
                            NAString &currCatName, NAString &currSchName);
  
  void dropSeabaseRoutine(StmtDDLDropRoutine  * dropRoutineNode,
                          NAString &currCatName, NAString &currSchName);

  short createSeabaseLibmgr(ExeCliInterface * cliInterface);
  short upgradeSeabaseLibmgr(ExeCliInterface * inCliInterface);
  short dropSeabaseLibmgr(ExeCliInterface *inCliInterface);
  short createLibmgrProcs(ExeCliInterface * cliInterface);
  short grantLibmgrPrivs(ExeCliInterface *cliInterface);
  short createSeabaseLibmgrCPPLib(ExeCliInterface * cliInterface);

  short registerNativeTable
  (
       const NAString &catalogNamePart,
       const NAString &schemaNamePart,
       const NAString &objectNamePart,
       Int32 objOwnerId,
       Int32 schemaOwnerId,
       ExeCliInterface &cliInterface,
       NABoolean isRegister,
       NABoolean isInternal
   );

  short unregisterNativeTable
  (
       const NAString &catalogNamePart,
       const NAString &schemaNamePart,
       const NAString &objectNamePart,
       ExeCliInterface &cliInterface,
       ComObjectType objType = COM_BASE_TABLE_OBJECT
   );

  short registerHiveView
  (
       const NAString &catalogNamePart,
       const NAString &schemaNamePart,
       const NAString &objectNamePart,
       Int32 objOwnerId,
       Int32 schemaOwnerId,
       NATable *naTable,
       ExeCliInterface &cliInterface,
       NABoolean isInternal,
       NABoolean cascade
   );

  short unregisterHiveView
  (
       const NAString &catalogNamePart,
       const NAString &schemaNamePart,
       const NAString &objectNamePart,
       NATable *naTable,
       ExeCliInterface &cliInterface,
       NABoolean cascade
   );

  void regOrUnregNativeObject (
       StmtDDLRegOrUnregObject * regOrUnregObject,
       NAString &currCatName, NAString &currSchName);
  
  short adjustHiveExternalSchemas(ExeCliInterface *cliInterface);

  void createSeabaseSequence(StmtDDLCreateSequence  * createSequenceNode,
			     NAString &currCatName, NAString &currSchName);

  void alterSeabaseSequence(StmtDDLCreateSequence  * alterSequenceNode,
			     NAString &currCatName, NAString &currSchName);
  
  void dropSeabaseSequence(StmtDDLDropSequence  * dropSequenceNode,
			   NAString &currCatName, NAString &currSchName);
  
  void seabaseGrantRevoke(
			  StmtDDLNode * stmtDDLNode,
			  NABoolean isGrant,
			  NAString &currCatName, NAString &currSchName,
                          NABoolean internalCall = FALSE);
  
  void hbaseGrantRevoke(StmtDDLNode * stmtDDLNode,
                        NABoolean isGrant,
                        NAString &currCatName, NAString &currSchName);
  
  void dropSeabaseSchema(StmtDDLDropSchema * dropSchemaNode);

  void alterSeabaseSchema(StmtDDLAlterSchema * alterSchemaNode);
                          
  
  bool dropOneTableorView(
     ExeCliInterface & cliInterface,
     const char * objectName,
     ComObjectType objectType,
     bool isVolatile);
  

 void createNativeHbaseTable(
			     StmtDDLCreateHbaseTable                  * createTableNode,
			     NAString &currCatName, NAString &currSchName);

 void dropNativeHbaseTable(
			     StmtDDLDropHbaseTable                  * createTableNode,
			     NAString &currCatName, NAString &currSchName);
  
  void initSeabaseMD(NABoolean ddlXns, NABoolean minimal);
  void dropSeabaseMD(NABoolean ddlXns);
  void createSeabaseMDviews();
  void dropSeabaseMDviews();
  void createSeabaseSchemaObjects();
  void updateVersion();

  short createPrivMgrRepos(ExeCliInterface *cliInterface, NABoolean ddlXns);
  short initSeabaseAuthorization(ExeCliInterface *cliInterface,
                                 NABoolean ddlXns,
                                 std::vector<std::string> &tablesCreated,
                                 std::vector<std::string> &tablesUpgraded);

  void dropSeabaseAuthorization(ExeCliInterface *cliInterface, 
                                NABoolean doCleanup = FALSE);

  void doSeabaseCommentOn(StmtDDLCommentOn *commentOnNode,
					 NAString &currCatName, 
					 NAString &currSchName);

  NABoolean insertPrivMgrInfo(const Int64 objUID,
                              const NAString &objName,
                              const ComObjectType objectType,
                              const Int32 objOwnerID,
                              const Int32 schemaOwnerID,
                              const Int32 creatorID);

  NABoolean deletePrivMgrInfo(const NAString &objName,
                              const Int64 objUID, 
                              const ComObjectType objType);


  short dropSeabaseObjectsFromHbase(const char * pattern, NABoolean ddlXns);
  short updateSeabaseAuths(ExeCliInterface * cliInterface, const char * sysCat);

  short truncateHbaseTable(const NAString &catalogNamePart, 
                           const NAString &schemaNamePart, 
                           const NAString &objectNamePart,
                           NATable * naTable,
                           ExpHbaseInterface * ehi);

  void purgedataHbaseTable(DDLExpr * ddlExpr,
			   NAString &currCatName, NAString &currSchName);

  short createRepos(ExeCliInterface * cliInterface);
  short dropRepos(ExeCliInterface * cliInterface, 
                  NABoolean oldRepos = FALSE, NABoolean dropSchema = TRUE,
                  NABoolean inRecovery = FALSE);
  short alterRenameRepos(ExeCliInterface * cliInterface, NABoolean newToOld);
  short copyOldReposToNew(ExeCliInterface * cliInterface);
  short dropAndLogReposViews(ExeCliInterface * cliInterface,
                             NABoolean & someViewSaved /* out */);

public:

  short upgradeRepos(ExeCliInterface * cliInterface, CmpDDLwithStatusInfo *mdui);
  short upgradeReposComplete(ExeCliInterface * cliInterface, CmpDDLwithStatusInfo *mdui);
  short upgradeReposUndo(ExeCliInterface * cliInterface, CmpDDLwithStatusInfo *mdui);

  NAString genHBaseObjName(const NAString &catName, 
			   const NAString &schName,
			   const NAString &objName);

protected:

  void processRepository(NABoolean createR, NABoolean dropR, NABoolean upgradeR);

  short updateSeabaseVersions(ExeCliInterface * cliInterface, const char * sysCat,
			      Lng32 majorVersion = -1);

  short getSpecialTableInfo
    (
     NAMemory * heap,
     const NAString &catName, 
     const NAString &schName, 
     const NAString &objName,
     const NAString &extTableName,
     const ComObjectType &objType, 
     ComTdbVirtTableTableInfo* &tableInfo
     );

  TrafDesc * getSeabaseMDTableDesc(const NAString &catName, 
				      const NAString &schName, 
				      const NAString &objName,
				      const ComObjectType objType);

  TrafDesc * getSeabaseHistTableDesc(const NAString &catName, 
					const NAString &schName, 
					const NAString &objName);

  ComTdbVirtTableSequenceInfo * getSeabaseSequenceInfo
    (const NAString &catName, 
     const NAString &schName, 
     const NAString &seqName,
     NAString &extSeqName,
     Int32 & objectOwner,
     Int32 & schemaOwner,
     Int64 & seqUID);

  TrafDesc * getSeabaseSequenceDesc(const NAString &catName, 
				       const NAString &schName, 
				       const NAString &seqName);
    
  ComTdbVirtTablePrivInfo * getSeabasePrivInfo
    (const Int64 objUID,
     const ComObjectType objType);

  Lng32 getSeabaseColumnInfo(ExeCliInterface *cliInterface,
                             Int64 objUID,
                             const NAString &catName,
                             const NAString &schName,
                             const NAString &objName,
                             char *direction,
                             NABoolean *tableIsSalted,
                             Lng32 * identityColPos,
                             Lng32 *numCols,
                             ComTdbVirtTableColumnInfo **colInfoArray);
  
  TrafDesc * getSeabaseUserTableDesc(const NAString &catName, 
					const NAString &schName, 
					const NAString &objName,
					const ComObjectType objType,
					NABoolean includeInvalidDefs,
					Int32 ctlFlags,
                                        Int32 &packedDescLen);
 
  static NABoolean getMDtableInfo(const ComObjectName &ansiName,
                                  ComTdbVirtTableTableInfo* &tableInfo,
				  Lng32 &colInfoSize,
				  const ComTdbVirtTableColumnInfo* &colInfo,
				  Lng32 &keyInfoSize,
				  const ComTdbVirtTableKeyInfo* &keyInfo,
				  Lng32 &indexInfoSize,
				  const ComTdbVirtTableIndexInfo* &indexInfo,
				  const ComObjectType objType);
                                  
  void giveSeabaseAll(StmtDDLGiveAll * giveAllParseNode);
  
  void giveSeabaseObject(StmtDDLGiveObject * giveObjectNode);
  
  void giveSeabaseSchema(
     StmtDDLGiveSchema * giveSchemaNode,
     NAString          & currentCatalogName);

  void glueQueryFragments(Lng32 queryArraySize,
			  const QString * queryArray,
			  char * &gluedQuery,
			  Lng32 &gluedQuerySize);

  short convertColAndKeyInfoArrays(
				    Lng32 btNumCols, // IN
				    ComTdbVirtTableColumnInfo* btColInfoArray, // IN
				    Lng32 btNumKeys, // IN
				    ComTdbVirtTableKeyInfo* btKeyInfoArray, // IN
				    NAColumnArray *naColArray,
				    NAColumnArray *naKeyArr);

  short processDDLandCreateDescs(
				 Parser &parser,
				 const QString *ddl,
				 Lng32 sizeOfddl,

				 NABoolean isIndexTable,

				 Lng32 btNumCols, // IN
				 ComTdbVirtTableColumnInfo* btColInfoArray, // IN
				 Lng32 btNumKeys, // IN
				 ComTdbVirtTableKeyInfo* btKeyInfoArray, // IN
    
				 Lng32 &numCols,
				 ComTdbVirtTableColumnInfo* &colInfoArray,
				 Lng32 &numKeys,
				 ComTdbVirtTableKeyInfo* &keyInfoArray,
				 ComTdbVirtTableIndexInfo* &indexInfo);

  short createIndexColAndKeyInfoArrays(
				       ElemDDLColRefArray & indexColRefArray,
				       NABoolean isUnique,
				       NABoolean hasSyskey,
                                       NABoolean alignedFormat,
                                       NAString &defaultColFam,
				       const NAColumnArray &baseTableNAColArray,
				       const NAColumnArray &baseTableKeyArr,
				       Lng32 &keyColCount,
				       Lng32 &nonKeyColCount,
				       Lng32 &totalColCount,
				       ComTdbVirtTableColumnInfo * &colInfoArray,
				       ComTdbVirtTableKeyInfo * &keyInfoArray,
				       NAList<NAString> &selColList,
                                       Lng32 &keyLength,
				       NAMemory * heap);

  // called by both Create Table and Create Index code
  // Given the optionsclause (from parser) and numSplits (parser/cqd/infered)
  // this method the produced hbaseOptions in a list that can be more
  // easily provided to the HBase create table API as well as in a string
  // that can be stored in Trafodion metadata. Returns 0 on success and a 
  // negative value to indicate failure.
  short setupHbaseOptions(ElemDDLHbaseOptions * hbaseOptionsClause, // in
                         Int32 numSplits, // in
                          const NAString& objName, //in for err handling
                         NAList<HbaseCreateOption*>& hbaseCreateOptions, //out
                         NAString& hco); // out
  

  short lookForTableInMD(
       ExeCliInterface *cliInterface,
       NAString &catNamePart, NAString &schNamePart, NAString &objNamePart,
       NABoolean schNameSpecified, NABoolean isHbaseMapSpecified,
       ComObjectName &tableName, NAString &tabName, NAString &extTableName,
       const ComObjectType objectType = COM_BASE_TABLE_OBJECT);

private:
  enum
  {
    NUM_MAX_PARAMS = 20
  };

  NAHeap *heap_;
  ULng32 savedCmpParserFlags_;
  ULng32 savedCliParserFlags_;

  NAString seabaseSysCat_;
  NAString seabaseMDSchema_; /* Qualified metadata schema */

  const char * param_[NUM_MAX_PARAMS];

  NABoolean cmpSwitched_;
};

#endif // _CMP_SEABASE_DDL_H_
