You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by an...@apache.org on 2016/08/02 23:24:34 UTC
[02/10] incubator-trafodion git commit: metadata access performance
improvement for accessing traf objects
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/19c96b1e/core/sql/sqlcat/readRealArk.cpp
----------------------------------------------------------------------
diff --git a/core/sql/sqlcat/readRealArk.cpp b/core/sql/sqlcat/readRealArk.cpp
index 5e04877..e49553c 100644
--- a/core/sql/sqlcat/readRealArk.cpp
+++ b/core/sql/sqlcat/readRealArk.cpp
@@ -22,7 +22,7 @@
*****************************************************************************
*
* File: readRealArk.C
- * Description: This module converts SOL based meta-data to desc_struct
+ * Description: This module converts SOL based meta-data to TrafDesc
* based meta-data.
*
* Created: 11/20/96
@@ -43,6 +43,7 @@
#include "CmpStatement.h"
#include "BaseTypes.h"
#include "readRealArk.h"
+#include "TrafDDLdesc.h"
// Copy a string. A null terminated buffer is returned.
// Uses HEAP (StatementHeap) of CmpCommon!
@@ -57,148 +58,59 @@ static char *copyString(const ComString &sourceString,
// -----------------------------------------------------------------------
-// Allocate one of the primitive structs and initialize to all zeroes.
-// Uses HEAP (StatementHeap) of CmpCommon!
-// -----------------------------------------------------------------------
-desc_struct *readtabledef_allocate_desc(desc_nodetype nodetype)
-{
- size_t size = 0;
-
- switch (nodetype)
- {
- case DESC_CHECK_CONSTRNTS_TYPE:
- size = sizeof(check_constrnts_desc_struct);
- break;
- case DESC_COLUMNS_TYPE:
- size = sizeof(columns_desc_struct);
- break;
- case DESC_CONSTRNTS_TYPE:
- size = sizeof(constrnts_desc_struct);
- break;
- case DESC_CONSTRNT_KEY_COLS_TYPE:
- size = sizeof(constrnt_key_cols_desc_struct);
- break;
- case DESC_FILES_TYPE:
- size = sizeof(files_desc_struct);
- break;
- case DESC_HISTOGRAM_TYPE:
- size = sizeof(histogram_desc_struct);
- break;
- case DESC_HIST_INTERVAL_TYPE:
- size = sizeof(hist_interval_desc_struct);
- break;
- case DESC_INDEXES_TYPE:
- size = sizeof(indexes_desc_struct);
- break;
- case DESC_KEYS_TYPE:
- size = sizeof(keys_desc_struct);
- break;
- case DESC_PARTNS_TYPE:
- size = sizeof(partns_desc_struct);
- break;
- case DESC_REF_CONSTRNTS_TYPE:
- size = sizeof(ref_constrnts_desc_struct);
- break;
- case DESC_TABLE_TYPE:
- size = sizeof(table_desc_struct);
- break;
- case DESC_VIEW_TYPE:
- size = sizeof(view_desc_struct);
- break;
- case DESC_USING_MV_TYPE: // MV
- size = sizeof(using_mv_desc_struct);
- break;
- case DESC_SEQUENCE_GENERATOR_TYPE:
- size = sizeof(sequence_generator_desc_struct);
- break;
- case DESC_ROUTINE_TYPE:
- size = sizeof(routine_desc_struct);
- break;
- case DESC_LIBRARY_TYPE:
- size = sizeof(library_desc_struct);
- break;
- default:
- assert(FALSE);
- break;
- }
- // DBG( cerr << "... rtd_allocate_desc " << nodetype << " " << size << " "; )
-
- size += sizeof(header_desc_struct);
- char *desc_buf = new HEAP char[size];
-
- // Note that this puts literal zero bytes into floats and pointer fields,
- // which are not portably equivalent to (float)0 and (void *)NULL.
- // This is a better default than not initializing at all, however.
- memset(desc_buf, 0, size);
-
- desc_struct *desc_ptr = (desc_struct *)desc_buf;
- desc_ptr->header.nodetype = nodetype;
- desc_ptr->header.next = NULL; // example of portable initlzn.
-
- // DBG( cerr << size << " " << desc_ptr << endl; )
- return desc_ptr;
-
-}
-
-// -----------------------------------------------------------------------
// Allocate a column_desc and do simple initialization of several fields,
// based on what's passed in. Many of the fields we just default,
// to either hardcoded values or to zero. The callers,
// in arkcmplib + generator + optimizer, can set additional fields afterwards.
// -----------------------------------------------------------------------
-desc_struct *readtabledef_make_column_desc(const char *tablename,
- const char *colname,
- Lng32 &colnumber, // INOUT
- DataType datatype,
- Lng32 length,
- Lng32 &offset, // INOUT
- short null_flag,
- NABoolean tablenameMustBeAllocated,
- desc_struct *passedDesc,
- SQLCHARSET_CODE datacharset
- )
+TrafDesc *TrafMakeColumnDesc(const char *tablename,
+ const char *colname,
+ Lng32 &colnumber, // INOUT
+ Int32 datatype,
+ Lng32 length,
+ Lng32 &offset, // INOUT
+ NABoolean null_flag,
+ SQLCHARSET_CODE datacharset,
+ Space * space
+ )
{
#undef COLUMN
- #define COLUMN returnDesc->body.columns_desc
+ #define COLUMN returnDesc->columnsDesc()
// Pass in the optional "passedDesc" if you just want to overwrite an
// already existing desc.
- desc_struct *returnDesc = passedDesc;
- if (!returnDesc) returnDesc = readtabledef_allocate_desc(DESC_COLUMNS_TYPE);
+ TrafDesc *returnDesc =
+ TrafAllocateDDLdesc(DESC_COLUMNS_TYPE, space);
- if (tablenameMustBeAllocated)
- COLUMN.tablename = copyString(NAString(tablename));
- else
- COLUMN.tablename = (char *)tablename; // just copy the pointer!
+ COLUMN->colname = (char *)colname;
- COLUMN.colname = copyString(colname);
- COLUMN.colnumber = colnumber;
- COLUMN.datatype = datatype;
- COLUMN.length = length;
- COLUMN.offset = offset;
- COLUMN.null_flag = null_flag;
+ COLUMN->colnumber = colnumber;
+ COLUMN->datatype = datatype;
+ COLUMN->length = length;
+ COLUMN->offset = offset;
+ COLUMN->setNullable(null_flag);
// Hardcode some fields here.
// All other fields (scale, precision, etc) default to zero!
- COLUMN.colclass = 'U';
- COLUMN.defaultClass = COM_NO_DEFAULT;
+ COLUMN->colclass = 'U';
+ COLUMN->setDefaultClass(COM_NO_DEFAULT);
if (DFS2REC::isAnyCharacter(datatype)) {
if (datacharset == SQLCHARSETCODE_UNKNOWN) {
- COLUMN.character_set = CharInfo::DefaultCharSet;
- COLUMN.encoding_charset = CharInfo::DefaultCharSet;
+ COLUMN->character_set = CharInfo::DefaultCharSet;
+ COLUMN->encoding_charset = CharInfo::DefaultCharSet;
}
else {
- COLUMN.character_set = (CharInfo::CharSet)datacharset;
- COLUMN.encoding_charset = (CharInfo::CharSet)datacharset;
+ COLUMN->character_set = (CharInfo::CharSet)datacharset;
+ COLUMN->encoding_charset = (CharInfo::CharSet)datacharset;
}
- COLUMN.collation_sequence = CharInfo::DefaultCollation;
+ COLUMN->collation_sequence = CharInfo::DefaultCollation;
if (DFS2REC::isSQLVarChar(datatype))
offset += SQL_VARCHAR_HDR_SIZE;
}
else { // datetime, interval, numeric, etc.
- COLUMN.datetimestart = COLUMN.datetimeend = REC_DATE_UNKNOWN;
+ COLUMN->datetimestart = COLUMN->datetimeend = REC_DATE_UNKNOWN;
}
colnumber++;
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/19c96b1e/core/sql/sqlcat/readRealArk.h
----------------------------------------------------------------------
diff --git a/core/sql/sqlcat/readRealArk.h b/core/sql/sqlcat/readRealArk.h
index bc70266..cb2867b 100644
--- a/core/sql/sqlcat/readRealArk.h
+++ b/core/sql/sqlcat/readRealArk.h
@@ -24,7 +24,6 @@
#ifndef READREALARK_H
#define READREALARK_H
-#include "desc.h"
#include "ComSmallDefs.h"
#include "ObjectNames.h"
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/19c96b1e/core/sql/sqlcomp/CmpDDLCatErrorCodes.h
----------------------------------------------------------------------
diff --git a/core/sql/sqlcomp/CmpDDLCatErrorCodes.h b/core/sql/sqlcomp/CmpDDLCatErrorCodes.h
index d79bf2a..25f439c 100644
--- a/core/sql/sqlcomp/CmpDDLCatErrorCodes.h
+++ b/core/sql/sqlcomp/CmpDDLCatErrorCodes.h
@@ -285,6 +285,7 @@ enum CatErrorCode { CAT_FIRST_ERROR = 1000
, CAT_COLUMN_WRONG_DEFAULT_TYPE = 1295
, CAT_COLUMN_MISMATCHED_DEFAULT_TYPES = 1296
, CAT_VOLATILE_SCHEMA_PRESENT = 1297
+ , CAT_UNABLE_TO_ALTER_SCHEMA = 1298
// Restrict and No Action referential action Messages.
, CAT_REF_CONSTRAINT_NO_ACTION_NOT_SUPPORTED = 1301
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/19c96b1e/core/sql/sqlcomp/CmpDescribe.cpp
----------------------------------------------------------------------
diff --git a/core/sql/sqlcomp/CmpDescribe.cpp b/core/sql/sqlcomp/CmpDescribe.cpp
index c663fb4..97cd5b5 100644
--- a/core/sql/sqlcomp/CmpDescribe.cpp
+++ b/core/sql/sqlcomp/CmpDescribe.cpp
@@ -96,6 +96,7 @@
#include "Analyzer.h"
#include "ComSqlId.h"
#include "ExExeUtilCli.h"
+#include "TrafDDLdesc.h"
#define CM_SIM_NAME_LEN 32
@@ -230,8 +231,8 @@ bool CmpDescribeIsAuthorized(
// ## This only applies to CatSim; remove it!
#define CONSTRAINT_IS_NAMED(constrdesc) \
- (constrdesc->body.constrnts_desc.constrntname && \
- *constrdesc->body.constrnts_desc.constrntname)
+ (constrdesc->constrnts_desc.constrntname && \
+ *constrdesc->constrnts_desc.constrntname)
// Define a shorter synonym.
#define SpacePrefix CmpDescribeSpaceCountPrefix
@@ -872,7 +873,7 @@ short CmpDescribe(const char *query, const RelExpr *queryExpr,
goto finally; // we are done
}
- desc_struct *tabledesc = NULL;
+ TrafDesc *tabledesc = NULL;
if ( ExtendedQualName::isDescribableTableType(tType) )
{
*CmpCommon::diags() << DgSqlCode(-4222)
@@ -909,7 +910,7 @@ short CmpDescribe(const char *query, const RelExpr *queryExpr,
goto finally;
}
- NAString tableName(tabledesc->body.table_desc.tablename) ;
+ NAString tableName(tabledesc->tableDesc()->tablename) ;
NABoolean external = d->getIsExternal();
//strip catalog off of table name
@@ -942,7 +943,7 @@ short CmpDescribe(const char *query, const RelExpr *queryExpr,
buf = new (CmpCommon::statementHeap()) char[LOCAL_BIGBUF_SIZE];
CMPASSERT(buf);
- desc_struct *viewdesc = tabledesc->body.table_desc.views_desc;
+ TrafDesc *viewdesc = tabledesc->tableDesc()->views_desc;
if (d->getFormat() == Describe::INVOKE_)
{
@@ -1010,7 +1011,6 @@ short CmpDescribe(const char *query, const RelExpr *queryExpr,
space.makeContiguous(outbuf, outbuflen);
NADELETEBASIC(buf, CmpCommon::statementHeap());
- CmpCommon::context()->readTableDef_->deleteTree(tabledesc);
goto finally; // we are done and rc is already 0
}
@@ -1060,7 +1060,6 @@ short CmpDescribe(const char *query, const RelExpr *queryExpr,
Reset_SqlParser_Flags(ALLOW_VOLATILE_SCHEMA_IN_TABLE_NAME);
NADELETEBASIC(buf, CmpCommon::statementHeap());
- CmpCommon::context()->readTableDef_->deleteTree(tabledesc);
} // end of try block
@@ -3737,7 +3736,7 @@ bool CmpDescribeLibrary(
ExeCliInterface cliInterface(heap);
- desc_struct *tDesc = cmpSBD.getSeabaseLibraryDesc(libCatNamePart,
+ TrafDesc *tDesc = cmpSBD.getSeabaseLibraryDesc(libCatNamePart,
libSchNamePart,
libObjNamePart);
if (tDesc == NULL)
@@ -3748,7 +3747,7 @@ bool CmpDescribeLibrary(
}
- Int64 libraryUID = tDesc->body.library_desc.libraryUID;
+ Int64 libraryUID = tDesc->libraryDesc()->libraryUID;
if (libraryUID <= 0) // does not exist
{
@@ -3793,7 +3792,7 @@ Space * space = &localSpace;
char buf[1000];
sprintf(buf,"CREATE LIBRARY %s FILE '%s'",
- extLibraryName.data(), tDesc->body.library_desc.libraryFilename);
+ extLibraryName.data(), tDesc->libraryDesc()->libraryFilename);
outputShortLine(*space,buf);
outputShortLine(*space,";");
@@ -3819,8 +3818,8 @@ char buf[1000];
std::string privilegeText;
PrivMgrObjectInfo objectInfo (
libraryUID, extLibraryName.data(),
- tDesc->body.library_desc.libraryOwnerID,
- tDesc->body.library_desc.librarySchemaOwnerID,
+ tDesc->libraryDesc()->libraryOwnerID,
+ tDesc->libraryDesc()->librarySchemaOwnerID,
COM_LIBRARY_OBJECT );
if (cmpSBD.switchCompiler())
{
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/19c96b1e/core/sql/sqlcomp/CmpSeabaseDDL.h
----------------------------------------------------------------------
diff --git a/core/sql/sqlcomp/CmpSeabaseDDL.h b/core/sql/sqlcomp/CmpSeabaseDDL.h
index a00a7ec..3b583e7 100644
--- a/core/sql/sqlcomp/CmpSeabaseDDL.h
+++ b/core/sql/sqlcomp/CmpSeabaseDDL.h
@@ -40,7 +40,6 @@
#include "ExpLOBenums.h"
#include "NADefaults.h"
#include "NAColumn.h"
-#include "desc.h"
#include "CmpMessage.h"
#include "PrivMgrDefs.h"
#include "PrivMgrMD.h"
@@ -81,6 +80,7 @@ class StmtDDLCreateSequence;
class StmtDDLDropSequence;
class StmtDDLDropSchema;
+class StmtDDLAlterSchema;
// Classes for user management
class StmtDDLRegisterUser;
@@ -111,7 +111,7 @@ class NADefaults;
class NAType;
-struct desc_struct;
+struct TrafDesc;
class OutputInfo;
class HbaseCreateOption;
@@ -120,7 +120,7 @@ class Parser;
class NAColumnArray;
-struct routine_desc_struct;
+class TrafRoutineDesc;
struct MDDescsInfo;
class CmpDDLwithStatusInfo;
@@ -232,7 +232,7 @@ class CmpSeabaseDDL
NAString &currCatName, NAString &currSchName,
CmpDDLwithStatusInfo *dws = NULL);
- desc_struct * getSeabaseTableDesc(const NAString &catName,
+ TrafDesc * getSeabaseTableDesc(const NAString &catName,
const NAString &schName,
const NAString &objName,
const ComObjectType objType,
@@ -279,12 +279,12 @@ class CmpSeabaseDDL
Int64 objectUID,
ElemDDLHbaseOptions * edhbo);
- desc_struct * getSeabaseLibraryDesc(
+ TrafDesc * getSeabaseLibraryDesc(
const NAString &catName,
const NAString &schName,
const NAString &libraryName);
- desc_struct *getSeabaseRoutineDesc(const NAString &catName,
+ TrafDesc *getSeabaseRoutineDesc(const NAString &catName,
const NAString &schName,
const NAString &objName);
@@ -334,19 +334,19 @@ class CmpSeabaseDDL
// 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 desc_struct
+ // These methods convert VirtTable*Info classes to corresponding TrafDesc
// objects
void convertVirtTableColumnInfoToDescStruct(
const ComTdbVirtTableColumnInfo * colInfo,
const ComObjectName * objectName,
- desc_struct * column_desc);
+ TrafDesc * column_desc);
- desc_struct * convertVirtTableColumnInfoArrayToDescStructs(
+ TrafDesc * convertVirtTableColumnInfoArrayToDescStructs(
const ComObjectName * objectName,
const ComTdbVirtTableColumnInfo * colInfoArray,
Lng32 numCols);
- desc_struct * convertVirtTableKeyInfoArrayToDescStructs(
+ TrafDesc * convertVirtTableKeyInfoArrayToDescStructs(
const ComTdbVirtTableKeyInfo *keyInfoArray,
const ComTdbVirtTableColumnInfo *colInfoArray,
Lng32 numKeys);
@@ -430,7 +430,13 @@ class CmpSeabaseDDL
enum {
// set if we need to get the hbase snapshot info of the table
- GET_SNAPSHOTS = 0x0002
+ 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
};
protected:
@@ -482,7 +488,7 @@ protected:
void getColName(const char * colFam, const char * colQual,
NAString &colName);
- desc_struct *getSeabaseRoutineDescInternal(const NAString &catName,
+ TrafDesc *getSeabaseRoutineDescInternal(const NAString &catName,
const NAString &schName,
const NAString &objName);
@@ -720,13 +726,22 @@ protected:
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 rt = -1,
+ Int64 objUID = -1,
+ NABoolean force = FALSE);
short updateObjectValidDef(
ExeCliInterface *cliInterface,
@@ -744,6 +759,12 @@ protected:
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,
@@ -752,6 +773,15 @@ protected:
NAString &text,
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,
@@ -764,7 +794,7 @@ protected:
short createEncodedKeysBuffer(char** &encodedKeysBuffer,
int &numSplits,
- desc_struct * colDescs, desc_struct * keyDescs,
+ TrafDesc * colDescs, TrafDesc * keyDescs,
int numSaltPartitions,
Lng32 numSaltSplits,
NAString *splitByClause,
@@ -946,12 +976,14 @@ protected:
ExeCliInterface &cliInterface,
StmtDDLCreateTable * createTableNode,
NAString &currCatName, NAString &currSchName,
- NABoolean isCompound = FALSE);
+ NABoolean isCompound,
+ Int64 &objUID);
void createSeabaseTable(
StmtDDLCreateTable * createTableNode,
NAString &currCatName, NAString &currSchName,
- NABoolean isCompound = FALSE);
+ NABoolean isCompound = FALSE,
+ Int64 * retObjUID = NULL);
void createSeabaseTableCompound(
StmtDDLCreateTable * createTableNode,
@@ -1012,6 +1044,10 @@ protected:
StmtDDLAlterTableRename * renameTableNode,
NAString &currCatName, NAString &currSchName);
+ void alterSeabaseTableStoredDesc(
+ StmtDDLAlterTableStoredDesc * alterStoredDesc,
+ NAString &currCatName, NAString &currSchName);
+
void alterSeabaseTableHBaseOptions(
StmtDDLAlterTableHBaseOptions * hbaseOptionsNode,
NAString &currCatName, NAString &currSchName);
@@ -1227,6 +1263,9 @@ protected:
NAString &currCatName, NAString &currSchName);
void dropSeabaseSchema(StmtDDLDropSchema * dropSchemaNode);
+
+ void alterSeabaseSchema(StmtDDLAlterSchema * alterSchemaNode);
+
bool dropOneTableorView(
ExeCliInterface & cliInterface,
@@ -1315,12 +1354,12 @@ protected:
ComTdbVirtTableTableInfo* &tableInfo
);
- desc_struct * getSeabaseMDTableDesc(const NAString &catName,
+ TrafDesc * getSeabaseMDTableDesc(const NAString &catName,
const NAString &schName,
const NAString &objName,
const ComObjectType objType);
- desc_struct * getSeabaseHistTableDesc(const NAString &catName,
+ TrafDesc * getSeabaseHistTableDesc(const NAString &catName,
const NAString &schName,
const NAString &objName);
@@ -1333,7 +1372,7 @@ protected:
Int32 & schemaOwner,
Int64 & seqUID);
- desc_struct * getSeabaseSequenceDesc(const NAString &catName,
+ TrafDesc * getSeabaseSequenceDesc(const NAString &catName,
const NAString &schName,
const NAString &seqName);
@@ -1348,12 +1387,13 @@ protected:
Lng32 *numCols,
ComTdbVirtTableColumnInfo **colInfoArray);
- desc_struct * getSeabaseUserTableDesc(const NAString &catName,
+ TrafDesc * getSeabaseUserTableDesc(const NAString &catName,
const NAString &schName,
const NAString &objName,
const ComObjectType objType,
NABoolean includeInvalidDefs,
- Int32 ctlFlags);
+ Int32 ctlFlags,
+ Int32 &packedDescLen);
static NABoolean getMDtableInfo(const ComObjectName &ansiName,
ComTdbVirtTableTableInfo* &tableInfo,
@@ -1452,7 +1492,4 @@ private:
NABoolean cmpSwitched_;
};
-desc_struct* assembleDescs(NAArray<HbaseStr>*keyArray, populateFuncT func, NAMemory* heap);
-
-
#endif // _CMP_SEABASE_DDL_H_
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/19c96b1e/core/sql/sqlcomp/CmpSeabaseDDLcommon.cpp
----------------------------------------------------------------------
diff --git a/core/sql/sqlcomp/CmpSeabaseDDLcommon.cpp b/core/sql/sqlcomp/CmpSeabaseDDLcommon.cpp
index 6b51feb..1a8f16f 100644
--- a/core/sql/sqlcomp/CmpSeabaseDDLcommon.cpp
+++ b/core/sql/sqlcomp/CmpSeabaseDDLcommon.cpp
@@ -71,6 +71,8 @@
#include "hdfs.h"
#include "StmtDDLAlterLibrary.h"
#include "logmxevent_traf.h"
+#include "exp_clause_derived.h"
+#include "TrafDDLdesc.h"
void cleanupLOBDataDescFiles(const char*, int, const char *);
@@ -406,29 +408,34 @@ short CmpSeabaseDDL::convertColAndKeyInfoArrays(
{
ComTdbVirtTableColumnInfo &ci = btColInfoArray[i];
- columns_desc_struct column_desc;
- column_desc.datatype = ci.datatype;
- column_desc.length = ci.length;
- column_desc.precision = ci.precision;
- column_desc.scale = ci.scale;
- column_desc.null_flag = ci.nullable;
- column_desc.character_set/*CharInfo::CharSet*/
+ Lng32 colnum, offset;
+ TrafDesc * desc =
+ TrafMakeColumnDesc(NULL, NULL, colnum, ci.datatype, ci.length,
+ offset, ci.nullable, ci.charset, NULL);
+ TrafColumnsDesc *column_desc = desc->columnsDesc();
+
+ column_desc->datatype = ci.datatype;
+ column_desc->length = ci.length;
+ column_desc->precision = ci.precision;
+ column_desc->scale = ci.scale;
+ column_desc->setNullable(ci.nullable);
+ column_desc->character_set/*CharInfo::CharSet*/
= (CharInfo::CharSet)ci.charset;
- column_desc.upshift = ci.upshifted;
- column_desc.caseinsensitive = 0;
- column_desc.collation_sequence = CharInfo::DefaultCollation;
- column_desc.encoding_charset = (CharInfo::CharSet)ci.charset;
+ column_desc->setUpshifted(ci.upshifted);
+ column_desc->setCaseInsensitive(FALSE);
+ column_desc->collation_sequence = CharInfo::DefaultCollation;
+ column_desc->encoding_charset = (CharInfo::CharSet)ci.charset;
- column_desc.datetimestart = (rec_datetime_field)ci.dtStart;
- column_desc.datetimeend = (rec_datetime_field)ci.dtEnd;
- column_desc.datetimefractprec = ci.scale;
+ column_desc->datetimestart = (rec_datetime_field)ci.dtStart;
+ column_desc->datetimeend = (rec_datetime_field)ci.dtEnd;
+ column_desc->datetimefractprec = ci.scale;
- column_desc.intervalleadingprec = ci.precision;
- column_desc.defaultClass = ci.defaultClass;
- column_desc.colFlags = ci.colFlags;
+ column_desc->intervalleadingprec = ci.precision;
+ column_desc->setDefaultClass(ci.defaultClass);
+ column_desc->colFlags = ci.colFlags;
NAType *type;
- NAColumn::createNAType(&column_desc, NULL, type, STMTHEAP);
+ NAColumn::createNAType(column_desc, NULL, type, STMTHEAP);
NAColumn * nac = new(STMTHEAP) NAColumn(ci.colName, i, type, STMTHEAP);
naColArray->insert(nac);
@@ -5302,13 +5309,79 @@ short CmpSeabaseDDL::deleteConstraintInfoFromSeabaseMDTables(
return 0;
}
+short CmpSeabaseDDL::checkAndGetStoredObjectDesc(
+ ExeCliInterface *cliInterface,
+ Int64 objUID,
+ TrafDesc* *retDesc)
+{
+ Lng32 cliRC = 0;
+
+ NAString packedDesc;
+ cliRC = getTextFromMD(
+ cliInterface, objUID, COM_STORED_DESC_TEXT, 0, packedDesc);
+ if (cliRC < 0)
+ {
+ *CmpCommon::diags() << DgSqlCode(-4493)
+ << DgString0("Error reading from metadata.");
+
+ processReturn();
+ return -1;
+ }
+
+ if (packedDesc.length() == 0)
+ {
+ // stored desc doesn't exist
+ *CmpCommon::diags() << DgSqlCode(-4493)
+ << DgString0("Does not exist. It needs to be regenerated.");
+
+ processReturn();
+ return -2;
+ }
+
+ char * descBuf = new(STMTHEAP) char[packedDesc.length()];
+ str_cpy_all(descBuf, packedDesc.data(), packedDesc.length());
+
+ TrafDesc * desc = (TrafDesc*)descBuf;
+ TrafDesc dummyDesc;
+ desc = (TrafDesc*)desc->driveUnpack((void*)desc, &dummyDesc, NULL);
+
+ if (! desc)
+ {
+ NADELETEBASIC(descBuf, STMTHEAP);
+
+ // error during unpack. Desc need to be regenerated.
+ *CmpCommon::diags() << DgSqlCode(-4493)
+ << DgString0("Error during unpacking due to change in stored structures. It needs to be regenerated.");
+
+ processReturn();
+ return -3;
+ }
+
+ // all good
+ *CmpCommon::diags() << DgSqlCode(4493)
+ << DgString0("Uptodate and current.");
+
+ if (retDesc)
+ *retDesc = desc;
+ else
+ NADELETEBASIC(descBuf, STMTHEAP);
+
+ return 0;
+}
+
+// rt = -1, generate redef time. rt = -2, dont update redef time.
+// otherwise use provided redef time.
+//
+// Also generate and update object descriptor in metadata.
short CmpSeabaseDDL::updateObjectRedefTime(
ExeCliInterface *cliInterface,
const NAString &catName,
const NAString &schName,
const NAString &objName,
const char * objType,
- Int64 rt)
+ Int64 rt,
+ Int64 objUID,
+ NABoolean force)
{
Lng32 retcode = 0;
Lng32 cliRC = 0;
@@ -5322,11 +5395,66 @@ short CmpSeabaseDDL::updateObjectRedefTime(
NAString quotedObjName;
ToQuotedString(quotedObjName, NAString(objName), FALSE);
- str_sprintf(buf, "update %s.\"%s\".%s set redef_time = %Ld where catalog_name = '%s' and schema_name = '%s' and object_name = '%s' and object_type = '%s' ",
- getSystemCatalog(), SEABASE_MD_SCHEMA, SEABASE_OBJECTS,
- redefTime,
- catName.data(), quotedSchName.data(), quotedObjName.data(),
- objType);
+ Int64 flags = 0;
+ if (((CmpCommon::getDefault(TRAF_STORE_OBJECT_DESC) == DF_ON) ||
+ (force)) &&
+ (objUID > 0) &&
+ (NOT isSeabaseReservedSchema(catName, schName)) &&
+ ((strcmp(objType, COM_BASE_TABLE_OBJECT_LIT) == 0) ||
+ (strcmp(objType, COM_VIEW_OBJECT_LIT) == 0)))
+ {
+ Int32 ctlFlags = GEN_PACKED_DESC | GET_SNAPSHOTS;
+ Int32 packedDescLen = 0;
+ TrafDesc * ds =
+ getSeabaseUserTableDesc(catName, schName, objName,
+ (strcmp(objType, COM_BASE_TABLE_OBJECT_LIT) == 0
+ ? COM_BASE_TABLE_OBJECT : COM_VIEW_OBJECT),
+ FALSE, ctlFlags, packedDescLen);
+ if (! ds)
+ {
+ processReturn();
+ return -1;
+ }
+
+ cliRC = updateTextTableWithBinaryData
+ (cliInterface, objUID,
+ COM_STORED_DESC_TEXT, 0,
+ (char*)ds, packedDescLen,
+ TRUE /*delete existing data*/);
+ if (cliRC < 0)
+ {
+ processReturn();
+ return -1;
+ }
+
+ CmpSeabaseDDL::setMDflags(flags, MD_OBJECTS_STORED_DESC);
+ }
+
+ if ((flags & MD_OBJECTS_STORED_DESC) != 0)
+ {
+ if (rt == -2)
+ str_sprintf(buf, "update %s.\"%s\".%s set flags = bitor(flags, %Ld) where catalog_name = '%s' and schema_name = '%s' and object_name = '%s' and object_type = '%s' ",
+ getSystemCatalog(), SEABASE_MD_SCHEMA, SEABASE_OBJECTS,
+ flags,
+ catName.data(), quotedSchName.data(), quotedObjName.data(),
+ objType);
+ else
+ str_sprintf(buf, "update %s.\"%s\".%s set redef_time = %Ld, flags = bitor(flags, %Ld) where catalog_name = '%s' and schema_name = '%s' and object_name = '%s' and object_type = '%s' ",
+ getSystemCatalog(), SEABASE_MD_SCHEMA, SEABASE_OBJECTS,
+ redefTime,
+ flags,
+ catName.data(), quotedSchName.data(), quotedObjName.data(),
+ objType);
+ }
+ else
+ {
+ str_sprintf(buf, "update %s.\"%s\".%s set redef_time = %Ld where catalog_name = '%s' and schema_name = '%s' and object_name = '%s' and object_type = '%s' ",
+ getSystemCatalog(), SEABASE_MD_SCHEMA, SEABASE_OBJECTS,
+ redefTime,
+ catName.data(), quotedSchName.data(), quotedObjName.data(),
+ objType);
+ }
+
cliRC = cliInterface->executeImmediate(buf);
if (cliRC < 0)
@@ -5334,7 +5462,7 @@ short CmpSeabaseDDL::updateObjectRedefTime(
cliInterface->retrieveSQLDiagnostics(CmpCommon::diags());
return -1;
}
-
+
return 0;
}
@@ -5436,6 +5564,40 @@ short CmpSeabaseDDL::updateObjectAuditAttr(
return 0;
}
+short CmpSeabaseDDL::updateObjectFlags(
+ ExeCliInterface *cliInterface,
+ const Int64 objUID,
+ const Int64 inFlags,
+ NABoolean reset)
+{
+ Lng32 retcode = 0;
+ Lng32 cliRC = 0;
+
+ char buf[4000];
+
+ Int64 flags = inFlags;
+ if (reset)
+ flags = ~inFlags;
+
+ if (reset)
+ str_sprintf(buf, "update %s.\"%s\".%s set flags = bitand(flags, %Ld) where object_uid = %Ld",
+ getSystemCatalog(), SEABASE_MD_SCHEMA, SEABASE_OBJECTS,
+ flags, objUID);
+ else
+ str_sprintf(buf, "update %s.\"%s\".%s set flags = bitor(flags, %Ld) where object_uid = %Ld",
+ getSystemCatalog(), SEABASE_MD_SCHEMA, SEABASE_OBJECTS,
+ flags, objUID);
+ cliRC = cliInterface->executeImmediate(buf);
+ if (cliRC < 0)
+ {
+ cliInterface->retrieveSQLDiagnostics(CmpCommon::diags());
+
+ return -1;
+ }
+
+ return 0;
+}
+
void CmpSeabaseDDL::cleanupObjectAfterError(
ExeCliInterface &cliInterface,
const NAString &catName,
@@ -6019,6 +6181,93 @@ short CmpSeabaseDDL::updateTextTable(ExeCliInterface *cliInterface,
return 0;
}
+short CmpSeabaseDDL::updateTextTableWithBinaryData
+(ExeCliInterface *cliInterface,
+ Int64 objUID,
+ ComTextType textType,
+ Lng32 subID,
+ char * inputData,
+ Int32 inputDataLen,
+ NABoolean withDelete)
+{
+ Lng32 cliRC = 0;
+ if (withDelete)
+ {
+ // Note: It might be tempting to try an upsert instead of a
+ // delete followed by an insert, but this won't work. It is
+ // possible that the metadata text could shrink and take fewer
+ // rows in its new form than the old. So we do the simple thing
+ // to avoid such complications.
+ cliRC = deleteFromTextTable(cliInterface, objUID, textType, subID);
+ if (cliRC < 0)
+ {
+ return -1;
+ }
+ }
+
+ // convert input data to utf8 first.
+ ComDiagsArea * diagsArea = CmpCommon::diags();
+ char * inputDataUTF8 = new(STMTHEAP) char[inputDataLen*4];
+ Lng32 inputDataLenUTF8 = 0;
+ ex_expr::exp_return_type rc =
+ convDoIt(inputData,
+ inputDataLen,
+ REC_BYTE_F_ASCII,
+ 0,
+ (Int32)CharInfo::ISO88591,
+ inputDataUTF8,
+ inputDataLen*4,
+ REC_BYTE_V_ASCII,
+ inputDataLen,
+ (Int32)CharInfo::UTF8,
+ (char*)&inputDataLenUTF8,
+ sizeof(Lng32),
+ STMTHEAP,
+ &diagsArea,
+ CONV_ASCII_F_V);
+ if ((rc != ex_expr::EXPR_OK) ||
+ (inputDataLenUTF8 <= 0))
+ {
+ return -1;
+ }
+
+ Int32 maxLen = TEXTLEN;
+ char queryBuf[1000];
+ Lng32 numRows = (inputDataLenUTF8 / maxLen) + 1;
+ Lng32 currPos = 0;
+ Int32 currDataLen = 0;
+
+ for (Lng32 i = 0; i < numRows; i++)
+ {
+ NAString temp;
+
+ if (i < numRows-1)
+ currDataLen = maxLen;
+ else
+ currDataLen = inputDataLenUTF8 - currPos;
+
+ str_sprintf(queryBuf, "insert into %s.\"%s\".%s values (%Ld, %d, %d, %d, 0, cast(? as char(%d bytes) character set utf8 not null))",
+ getSystemCatalog(), SEABASE_MD_SCHEMA, SEABASE_TEXT,
+ objUID,
+ textType,
+ subID,
+ i,
+ currDataLen);
+ cliRC = cliInterface->executeImmediateCEFC
+ (queryBuf, &inputData[currPos], currDataLen, NULL, NULL, NULL);
+
+ if (cliRC < 0)
+ {
+ cliInterface->retrieveSQLDiagnostics(CmpCommon::diags());
+ return -1;
+ }
+
+ currPos += maxLen;
+ }
+
+ return 0;
+}
+
short CmpSeabaseDDL::deleteFromTextTable(ExeCliInterface *cliInterface,
Int64 objUID,
ComTextType textType,
@@ -6457,8 +6706,8 @@ short CmpSeabaseDDL::validateDivisionByExprForDDL(ItemExpr *divExpr)
short CmpSeabaseDDL::createEncodedKeysBuffer(char** &encodedKeysBuffer,
int &numSplits,
- desc_struct * colDescs,
- desc_struct * keyDescs,
+ TrafDesc * colDescs,
+ TrafDesc * keyDescs,
int numSaltPartitions,
Lng32 numSaltSplits,
NAString *splitByClause,
@@ -8209,9 +8458,9 @@ short CmpSeabaseDDL::truncateHbaseTable(const NAString &catalogNamePart,
Lng32 keyLength = naf->getKeyLength();
char ** encodedKeysBuffer = NULL;
- const desc_struct * tableDesc = naTable->getTableDesc();
- desc_struct * colDescs = tableDesc->body.table_desc.columns_desc;
- desc_struct * keyDescs = (desc_struct*)naf->getKeysDesc();
+ TrafDesc * tableDesc = (TrafDesc*)naTable->getTableDesc();
+ TrafDesc * colDescs = tableDesc->tableDesc()->columns_desc;
+ TrafDesc * keyDescs = (TrafDesc*)naf->getKeysDesc();
if (createEncodedKeysBuffer(encodedKeysBuffer/*out*/,
numSplits/*out*/,
@@ -8857,6 +9106,13 @@ short CmpSeabaseDDL::executeSeabaseDDL(DDLExpr * ddlExpr, ExprNode * ddlNode,
renameSeabaseTable(alterRenameTable,
currCatName, currSchName);
}
+ else if (ddlNode->getOperatorType() == DDL_ALTER_TABLE_STORED_DESC)
+ {
+ StmtDDLAlterTableStoredDesc * alterStoredDesc =
+ ddlNode->castToStmtDDLNode()->castToStmtDDLAlterTableStoredDesc();
+
+ alterSeabaseTableStoredDesc(alterStoredDesc, currCatName, currSchName);
+ }
else if (ddlNode->getOperatorType() == DDL_ALTER_TABLE_ALTER_HBASE_OPTIONS)
{
StmtDDLAlterTableHBaseOptions * athbo =
@@ -9001,6 +9257,13 @@ short CmpSeabaseDDL::executeSeabaseDDL(DDLExpr * ddlExpr, ExprNode * ddlNode,
dropSeabaseSchema(dropSchemaParseNode);
}
+ else if (ddlNode->getOperatorType() == DDL_ALTER_SCHEMA)
+ {
+ StmtDDLAlterSchema * alterSchemaParseNode =
+ ddlNode->castToStmtDDLNode()->castToStmtDDLAlterSchema();
+
+ alterSeabaseSchema(alterSchemaParseNode);
+ }
else if (ddlNode->getOperatorType() == DDL_CREATE_LIBRARY)
{
// create seabase library
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/19c96b1e/core/sql/sqlcomp/CmpSeabaseDDLincludes.h
----------------------------------------------------------------------
diff --git a/core/sql/sqlcomp/CmpSeabaseDDLincludes.h b/core/sql/sqlcomp/CmpSeabaseDDLincludes.h
index 80fed40..2743bdd 100644
--- a/core/sql/sqlcomp/CmpSeabaseDDLincludes.h
+++ b/core/sql/sqlcomp/CmpSeabaseDDLincludes.h
@@ -40,6 +40,7 @@
#include "StmtDDLCreateTable.h"
#include "StmtDDLDropTable.h"
#include "StmtDDLAlterTableRename.h"
+#include "StmtDDLAlterTableStoredDesc.h"
#include "StmtDDLCreateIndex.h"
#include "StmtDDLPopulateIndex.h"
#include "StmtDDLDropIndex.h"
@@ -86,7 +87,6 @@
#include "ExExeUtilCli.h"
#include "Generator.h"
-#include "desc.h"
#include "ComCextdecs.h"
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/19c96b1e/core/sql/sqlcomp/CmpSeabaseDDLindex.cpp
----------------------------------------------------------------------
diff --git a/core/sql/sqlcomp/CmpSeabaseDDLindex.cpp b/core/sql/sqlcomp/CmpSeabaseDDLindex.cpp
index 718934a..9234c66 100644
--- a/core/sql/sqlcomp/CmpSeabaseDDLindex.cpp
+++ b/core/sql/sqlcomp/CmpSeabaseDDLindex.cpp
@@ -58,7 +58,6 @@
#include "ExExeUtilCli.h"
#include "Generator.h"
-#include "desc.h"
#include "ComCextdecs.h"
#include "ComUser.h"
@@ -556,6 +555,8 @@ void CmpSeabaseDDL::createSeabaseIndex( StmtDDLCreateIndex * createIndexNode,
return;
}
+ Int64 btObjUID = naTable->objectUid().castToInt64();
+
NAString &indexColFam = naTable->defaultColFam();
NAString trafColFam;
if (indexColFam != SEABASE_DEFAULT_COL_FAMILY)
@@ -859,11 +860,11 @@ void CmpSeabaseDDL::createSeabaseIndex( StmtDDLCreateIndex * createIndexNode,
char ** encodedKeysBuffer = NULL;
if (numSplits > 0) {
- desc_struct * colDescs =
+ TrafDesc * colDescs =
convertVirtTableColumnInfoArrayToDescStructs(&tableName,
colInfoArray,
totalColCount) ;
- desc_struct * keyDescs =
+ TrafDesc * keyDescs =
convertVirtTableKeyInfoArrayToDescStructs(keyInfoArray,
colInfoArray,
keyColCount) ;
@@ -1027,7 +1028,7 @@ void CmpSeabaseDDL::createSeabaseIndex( StmtDDLCreateIndex * createIndexNode,
if (updateObjectRedefTime(&cliInterface,
btCatalogNamePart, btSchemaNamePart, btObjectNamePart,
- COM_BASE_TABLE_OBJECT_LIT))
+ COM_BASE_TABLE_OBJECT_LIT, -1, btObjUID))
{
goto label_error_drop_index;
}
@@ -1244,7 +1245,7 @@ void CmpSeabaseDDL::populateSeabaseIndex(
// Create a table descriptor that contains information on both valid and
// invalid indexes. Pass that to getNATable method which will use this
// table desc to create the NATable struct.
- desc_struct * tableDesc =
+ TrafDesc * tableDesc =
getSeabaseTableDesc(
tableName.getCatalogNamePart().getInternalName(),
tableName.getSchemaNamePart().getInternalName(),
@@ -1698,7 +1699,7 @@ void CmpSeabaseDDL::dropSeabaseIndex(
if (updateObjectRedefTime(&cliInterface,
btCatName, btSchName, btObjName,
- COM_BASE_TABLE_OBJECT_LIT))
+ COM_BASE_TABLE_OBJECT_LIT, -1, btUID))
{
processReturn();
@@ -1819,10 +1820,10 @@ void CmpSeabaseDDL::alterSeabaseTableDisableOrEnableIndex(
Int32 btObjOwner = 0;
Int32 btSchemaOwner = 0;
Int64 btObjectFlags = 0;
- if ((getObjectInfo(&cliInterface,
- btCatName, btSchName, btObjName,
- COM_BASE_TABLE_OBJECT,
- btObjOwner, btSchemaOwner, btObjectFlags)) < 0)
+ if ((btUID = getObjectInfo(&cliInterface,
+ btCatName, btSchName, btObjName,
+ COM_BASE_TABLE_OBJECT,
+ btObjOwner, btSchemaOwner, btObjectFlags, btUID)) < 0)
{
processReturn();
@@ -1850,6 +1851,15 @@ void CmpSeabaseDDL::alterSeabaseTableDisableOrEnableIndex(
return;
}
+ if (updateObjectRedefTime(&cliInterface,
+ btCatName, btSchName, btObjName,
+ COM_BASE_TABLE_OBJECT_LIT, -1, btUID))
+ {
+ processReturn();
+
+ return;
+ }
+
// remove NATable for the base table of this index
CorrName cn(btObjName, STMTHEAP, btSchName, btCatName);
ActiveSchemaDB()->getNATableDB()->removeNATable
@@ -2148,6 +2158,16 @@ void CmpSeabaseDDL::alterSeabaseIndexHBaseOptions(
return;
}
+ if (updateObjectRedefTime(&cliInterface,
+ btCatName, btSchName, btObjName,
+ COM_BASE_TABLE_OBJECT_LIT, -1, btUID))
+ {
+ deallocEHI(ehi);
+ processReturn();
+
+ return;
+ }
+
// invalidate cached NATable info on this table for all users
ActiveSchemaDB()->getNATableDB()->removeNATable
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/19c96b1e/core/sql/sqlcomp/CmpSeabaseDDLmd.h
----------------------------------------------------------------------
diff --git a/core/sql/sqlcomp/CmpSeabaseDDLmd.h b/core/sql/sqlcomp/CmpSeabaseDDLmd.h
index 83d72c5..e9d6a6f 100644
--- a/core/sql/sqlcomp/CmpSeabaseDDLmd.h
+++ b/core/sql/sqlcomp/CmpSeabaseDDLmd.h
@@ -245,10 +245,15 @@ enum SeabaseObjectsFlags {
SEABASE_OBJECT_IS_EXTERNAL_HIVE = 0x0000000000000001, // set if this object
// references external
// HIVE table
- SEABASE_OBJECT_IS_EXTERNAL_HBASE = 0x0000000000000002 // set if this object
+ SEABASE_OBJECT_IS_EXTERNAL_HBASE = 0x0000000000000002, // set if this object
// references external
// HBASE table
+
+ // descriptor was generated for this table and is stored in TEXT table
+ MD_OBJECTS_STORED_DESC = 0x0000000000000004,
+ // stored descriptor is disabled, should not be used
+ MD_OBJECTS_DISABLE_STORED_DESC = 0x0000000000000008
};
static const QString seabaseRefConstraintsDDL[] =
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/19c96b1e/core/sql/sqlcomp/CmpSeabaseDDLroutine.cpp
----------------------------------------------------------------------
diff --git a/core/sql/sqlcomp/CmpSeabaseDDLroutine.cpp b/core/sql/sqlcomp/CmpSeabaseDDLroutine.cpp
index e2f891f..d6996a6 100644
--- a/core/sql/sqlcomp/CmpSeabaseDDLroutine.cpp
+++ b/core/sql/sqlcomp/CmpSeabaseDDLroutine.cpp
@@ -60,7 +60,6 @@
#include "ExExeUtilCli.h"
#include "Generator.h"
-#include "desc.h"
#include "ComSmallDefs.h"
#include "CmpDDLCatErrorCodes.h"
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/19c96b1e/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp
----------------------------------------------------------------------
diff --git a/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp b/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp
index 03a700e..b914961 100644
--- a/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp
+++ b/core/sql/sqlcomp/CmpSeabaseDDLschema.cpp
@@ -39,6 +39,7 @@
#include "CmpSeabaseDDLincludes.h"
#include "StmtDDLCreateSchema.h"
#include "StmtDDLDropSchema.h"
+#include "StmtDDLAlterSchema.h"
#include "StmtDDLGive.h"
#include "ElemDDLColDefault.h"
#include "NumericType.h"
@@ -971,6 +972,251 @@ label_error:
// *****************************************************************************
// * *
+// * Function: CmpSeabaseDDL::alterSeabaseSchema *
+// * *
+// * Implements the ALTER SCHEMA command. *
+// * *
+// *****************************************************************************
+// * *
+// * Parameters: *
+// * *
+// * <alterSchemaNode> StmtDDLAlterSchema * In *
+// * is a pointer to a create schema parser node. *
+// * *
+// *****************************************************************************
+void CmpSeabaseDDL::alterSeabaseSchema(StmtDDLAlterSchema * alterSchemaNode)
+
+{
+ Lng32 cliRC = 0;
+
+ ComSchemaName schemaName(alterSchemaNode->getSchemaName());
+ NAString catName = schemaName.getCatalogNamePartAsAnsiString();
+ ComAnsiNamePart schNameAsComAnsi = schemaName.getSchemaNamePart();
+ NAString schName = schNameAsComAnsi.getInternalName();
+ ComObjectName objName(catName,schName,NAString("dummy"),COM_TABLE_NAME,TRUE);
+
+ ExeCliInterface cliInterface(STMTHEAP, NULL, NULL,
+ CmpCommon::context()->sqlSession()->getParentQid());
+ Int32 objectOwnerID = 0;
+ Int32 schemaOwnerID = 0;
+ ComObjectType objectType;
+
+ bool isVolatile = (memcmp(schName.data(),"VOLATILE_SCHEMA",strlen("VOLATILE_SCHEMA")) == 0);
+ int32_t length = 0;
+ int32_t rowCount = 0;
+ bool someObjectsCouldNotBeAltered = false;
+ char errorObjs[1010];
+ Queue * objectsQueue = NULL;
+ Queue * otherObjectsQueue = NULL;
+
+ NABoolean dirtiedMetadata = FALSE;
+ Int32 checkErr = 0;
+
+ StmtDDLAlterTableStoredDesc::AlterStoredDescType sdo =
+ alterSchemaNode->getStoredDescOperation();
+
+ errorObjs[0] = 0;
+
+ Int64 schemaUID = getObjectTypeandOwner(&cliInterface,catName.data(),schName.data(),
+ SEABASE_SCHEMA_OBJECTNAME,objectType,schemaOwnerID);
+
+ // if schemaUID == -1, then either the schema does not exist or an unexpected error occurred
+ if (schemaUID == -1)
+ {
+ // If an error occurred, return
+ if (CmpCommon::diags()->getNumber(DgSqlCode::ERROR_) > 0)
+ goto label_error;
+
+ // A Trafodion schema does not exist if the schema object row is not
+ // present: CATALOG-NAME.SCHEMA-NAME.__SCHEMA__.
+ *CmpCommon::diags() << DgSqlCode(-CAT_SCHEMA_DOES_NOT_EXIST_ERROR)
+ << DgSchemaName(schemaName.getExternalName().data());
+ goto label_error;
+ }
+
+ if (!isDDLOperationAuthorized(SQLOperation::DROP_SCHEMA,
+ schemaOwnerID,schemaOwnerID))
+ {
+ *CmpCommon::diags() << DgSqlCode(-CAT_NOT_AUTHORIZED);
+ goto label_error;
+ }
+
+ if ((isSeabaseReservedSchema(objName) ||
+ (schName == SEABASE_SYSTEM_SCHEMA)) &&
+ !Get_SqlParser_Flags(INTERNAL_QUERY_FROM_EXEUTIL))
+ {
+ *CmpCommon::diags() << DgSqlCode(-CAT_USER_CANNOT_DROP_SMD_SCHEMA)
+ << DgSchemaName(schemaName.getExternalName().data());
+ goto label_error;
+ }
+
+ // Can't alter a schema whose name begins with VOLATILE_SCHEMA unless the
+ // keyword VOLATILE was specified in the ALTER SCHEMA command.
+ if (isVolatile && !alterSchemaNode->isVolatile())
+ {
+ *CmpCommon::diags() << DgSqlCode(-CAT_RESERVED_METADATA_SCHEMA_NAME)
+ << DgTableName(schName);
+ goto label_error;
+ }
+
+ if (alterSchemaNode->isDropAllTables())
+ {
+ // should not reach here, is transformed to DropSchema during parsing
+ *CmpCommon::diags() << DgSqlCode(-3242)
+ << DgString0("Should not reach here. Should have been transformed to DropSchema during parsing.");
+ goto label_error;
+ }
+
+ if (alterSchemaNode->isRenameSchema())
+ {
+ // Not yet supported
+ *CmpCommon::diags() << DgSqlCode(-3242)
+ << DgString0("Cannot rename a schema.");
+ goto label_error;
+ }
+
+ if (NOT alterSchemaNode->isAlterStoredDesc())
+ {
+ // unsupported option
+ *CmpCommon::diags() << DgSqlCode(-3242)
+ << DgString0("Unsupported option specified.");
+ goto label_error;
+ }
+
+ // Get a list of all objects in the schema, excluding the schema object itself.
+ char query[4000];
+
+ // select objects in the schema to alter
+ str_sprintf(query,"SELECT distinct TRIM(object_name), TRIM(object_type), object_uid "
+ "FROM %s.\"%s\".%s "
+ "WHERE catalog_name = '%s' AND schema_name = '%s' AND "
+ "object_name <> '"SEABASE_SCHEMA_OBJECTNAME"' AND "
+ "(object_type = 'BT' OR "
+ " object_type = 'VI') "
+ "FOR READ COMMITTED ACCESS",
+ getSystemCatalog(),SEABASE_MD_SCHEMA,SEABASE_OBJECTS,
+ (char*)catName.data(),(char*)schName.data());
+
+ cliRC = cliInterface.fetchAllRows(objectsQueue, query, 0, FALSE, FALSE, TRUE);
+ if (cliRC < 0)
+ {
+ cliInterface.retrieveSQLDiagnostics(CmpCommon::diags());
+ goto label_error;
+ }
+
+ objectsQueue->position();
+ for (int idx = 0; idx < objectsQueue->numEntries(); idx++)
+ {
+ OutputInfo * vi = (OutputInfo*)objectsQueue->getNext();
+
+ NAString objName = vi->get(0);
+ NAString objType = vi->get(1);
+ Int64 objUID = *(Int64*)vi->get(2);
+
+ if (sdo == StmtDDLAlterTableStoredDesc::GENERATE)
+ {
+ cliRC =
+ updateObjectRedefTime(&cliInterface,
+ getSystemCatalog(), schName, objName,
+ COM_BASE_TABLE_OBJECT_LIT,
+ -1, objUID, TRUE);
+ if (cliRC < 0)
+ {
+ // append error and move on to next one
+ appendErrorObjName(errorObjs, objName);
+ someObjectsCouldNotBeAltered = true;
+
+ CmpCommon::diags()->clear();
+ }
+ }
+ else if (sdo == StmtDDLAlterTableStoredDesc::DELETE)
+ {
+ cliRC = deleteFromTextTable
+ (&cliInterface, objUID, COM_STORED_DESC_TEXT, 0);
+ if (cliRC < 0)
+ {
+ // append error and move on to next one
+ appendErrorObjName(errorObjs, objName);
+ someObjectsCouldNotBeAltered = true;
+
+ CmpCommon::diags()->clear();
+ }
+
+ } // delete stored desc
+ else if (sdo == StmtDDLAlterTableStoredDesc::ENABLE)
+ {
+ Int64 flags = MD_OBJECTS_DISABLE_STORED_DESC;
+ cliRC = updateObjectFlags(&cliInterface, objUID, flags, TRUE);
+ if (cliRC < 0)
+ {
+ appendErrorObjName(errorObjs, objName);
+ someObjectsCouldNotBeAltered = true;
+
+ CmpCommon::diags()->clear();
+ }
+ }
+ else if (sdo == StmtDDLAlterTableStoredDesc::DISABLE)
+ {
+ Int64 flags = MD_OBJECTS_DISABLE_STORED_DESC;
+ cliRC = updateObjectFlags(&cliInterface, objUID, flags, FALSE);
+ if (cliRC < 0)
+ {
+ appendErrorObjName(errorObjs, objName);
+ someObjectsCouldNotBeAltered = true;
+
+ CmpCommon::diags()->clear();
+ }
+ }
+ else if (sdo == StmtDDLAlterTableStoredDesc::CHECK)
+ {
+ cliRC = checkAndGetStoredObjectDesc(&cliInterface, objUID, NULL);
+ CmpCommon::diags()->clear();
+ if (cliRC < 0)
+ {
+ checkErr = cliRC;
+ appendErrorObjName(errorObjs, objName);
+ someObjectsCouldNotBeAltered = true;
+ }
+ }
+
+ } // for
+
+ if (someObjectsCouldNotBeAltered)
+ {
+ NAString reason;
+ if (sdo == StmtDDLAlterTableStoredDesc::CHECK)
+ {
+ reason = "Reason: Following objects failed stored descriptor check";
+ if (checkErr == -1)
+ reason += " (object could not be accessed) ";
+ else if (checkErr == -2)
+ reason += " (object does not exist) ";
+ else if (checkErr == -3)
+ reason += " (change in stored structures) ";
+ reason += ": ";
+ reason += errorObjs;
+ }
+ else
+ reason = "Reason: Some objects could not be accessed in schema "
+ + schName + ". ObjectsInSchema: "
+ + errorObjs;
+ *CmpCommon::diags() << DgSqlCode(-CAT_UNABLE_TO_ALTER_SCHEMA)
+ << DgSchemaName(catName + "." + schName)
+ << DgString0(reason);
+ goto label_error;
+ }
+
+ // Everything succeeded, return
+ return;
+
+label_error:
+ return;
+}
+//****************** End of CmpSeabaseDDL::alterSeabaseSchema *****************
+
+
+// *****************************************************************************
+// * *
// * Function: CmpSeabaseDDL::giveSeabaseSchema *
// * *
// * Implements the GIVE SCHEMA command. *