blob: 38afb4048d013fad4777112f4a0fe7c59271c383 [file] [log] [blame]
/**********************************************************************
// @@@ 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 @@@
**********************************************************************/
/* -*-C++-*-
****************************************************************************
*
* File: LateBindInfo.h
* Description:
*
* Created: 5/6/98
* Language: C++
*
*
*
*
****************************************************************************
*/
#ifndef LATEBINDINFO_H
#define LATEBINDINFO_H
#include "NAStdlib.h" // memset()
#include "NABoolean.h"
#include "ComSizeDefs.h"
#include "ComSmallDefs.h"
#include "NAVersionedObject.h"
#include "exp_tuple_desc.h"
#include "ComQueue.h"
#include "ComAnsiNamePart.h"
#include "Collections.h"
class Queue;
class NAMemory;
class ExpTupleDesc;
class AnsiOrNskName;
class ResolvedNameListPre1800;
// ---------------------------------------------------------------------
// Template instantiation to produce a 64-bit pointer emulator class
// for ArkFsKeyClass
// ---------------------------------------------------------------------
//////////////////////////////////////////////////////////////////
// Class: UninitializedMvName
// Description:
// The purpose of this class is to keep track of all
// uninitialized mv names found during compile time.
//
//////////////////////////////////////////////////////////////////
#define MAX_PHYSICAL_NAME_LENGTH ComMAX_EXTERNAL_GUARDIAN_FNAME_LEN+3
#define MAX_ANSI_NAME_LENGTH ComMAX_3_PART_EXTERNAL_UTF8_NAME_LEN_IN_BYTES+1
class UninitializedMvName : public NABasicObject
{
public:
NA_EIDPROC UninitializedMvName();
char * getPhysicalName() { return physicalName_; }
char * getAnsiName() { return ansiName_; }
void setPhysicalName( const char *physicalName );
void setAnsiName( const char *ansiName );
private:
char physicalName_[MAX_PHYSICAL_NAME_LENGTH];
char ansiName_[MAX_ANSI_NAME_LENGTH];
};
typedef LIST(UninitializedMvName*) UninitializedMvNameList;
typedef NABasicPtrTempl<UninitializedMvName> UninitializedMvNamePtr;
//////////////////////////////////////////////////////////////////
// The purpose of this class is to keep track of
// late name resolution information generated at compile-time,
// and used that at runtime to compute the physical gua name.
// Late name resolution is done at fixup time of root master
// executor node. At that time, field resolvedGuaName_ is
// filled with the physical gua name.
// Field resolvedGuaName_ is allocated in this class
// so we can ship this class to ESPs without packing/unpacking.
// ESPs need this so the PA nodes there
// can get to this field at runtime.
// All other pointer fields are only used in the
// master executor and need not be shipped anywhere and could
// be allocated from heap.
////////////////////////////////////////////////////////////////
class LateNameInfo : public NAVersionedObject
{
public:
LateNameInfo()
: NAVersionedObject(-1)
{
flags_ = 0;
runtimeFlags_ = 0;
varName_[0] = 0;
compileTimeAnsiName_[0] = 0;
lastUsedAnsiName_[0] = 0;
resolvedPhyName_[0] = 0;
};
// ---------------------------------------------------------------------
// Redefine virtual functions required for Versioning.
//----------------------------------------------------------------------
virtual unsigned char getClassVersionID()
{
return 1;
}
virtual void populateImageVersionIDArray()
{
setImageVersionID(0,getClassVersionID());
}
virtual short getClassSize() { return (short)sizeof(LateNameInfo); }
// ComAnsiNameSpace &nameSpace() { return nameSpace_; };
void setNameSpace(ComAnsiNameSpace ns) { nameSpace_ = ns; };
ComAnsiNameSpace getNameSpace() { return (ComAnsiNameSpace)nameSpace_; };
// short &inputListIndex() { return inputListIndex_; };
short getInputListIndex() { return inputListIndex_; };
void setInputListIndex(short ilix) { inputListIndex_ = ilix; };
Int32 getCachedParamOffset() { return cachedParamOffset_; }
void setCachedParamOffset(Int32 o) { cachedParamOffset_ = o; }
char * variableName() { return varName_; };
char * compileTimeAnsiName();
char * lastUsedAnsiName();
char * resolvedPhyName() { return resolvedPhyName_; };
void zeroLastUsedAnsiName();
char * lastUsedExtAnsiName();
void setVariable(short v) {(v ? flags_ |= VARIABLE : flags_ &= ~VARIABLE); };
NABoolean isVariable() { return (flags_ & VARIABLE) != 0; };
void setEnvVar(short v) { (v ? flags_ |= ENV_VAR : flags_ &= ~ENV_VAR); };
NABoolean isEnvVar() { return (flags_ & ENV_VAR) != 0; };
void setDefine(short v) { (v ? flags_ |= DEFINE : flags_ &= ~DEFINE); };
NABoolean isDefine() { return (flags_ & DEFINE) != 0; };
void setCachedParam(short v) { (v ? flags_ |= CACHED_PARAM : flags_ &= ~CACHED_PARAM); };
NABoolean isCachedParam() { return (flags_ & CACHED_PARAM) != 0; };
void setAnsiPhySame(short v) { (v ? flags_ |= ANSI_PHY_SAME : flags_ &= ~ANSI_PHY_SAME); };
NABoolean isAnsiPhySame() { return (flags_ & ANSI_PHY_SAME) != 0; };
void setIndex(short v) {(v ? flags_ |= IS_INDEX : flags_ &= ~IS_INDEX); };
NABoolean isIndex() { return (flags_ & IS_INDEX) != 0; };
void setView(short v) {(v ? flags_ |= IS_VIEW : flags_ &= ~IS_VIEW); };
NABoolean isView() { return (flags_ & IS_VIEW) != 0; };
void setMPalias(short v) {(v ? flags_ |= IS_MPALIAS : flags_ &= ~IS_MPALIAS); };
NABoolean isMPalias() { return (flags_ & IS_MPALIAS) != 0; };
// Set to avoid similarity check and recompilation
void setAvoidSimCheck(short v)
{
if (v) flags_ |= NAME_ONLY; else flags_ &= ~NAME_ONLY;
}
// Force skipping the similarity check (while still resolving the
// physical name.) Used in special statements (e.g., SET TABLE TIMEOUT)
// when only the table name is needed, not its meta data
NABoolean isAvoidSimCheck() { return((flags_ & NAME_ONLY) ? TRUE : FALSE); };
void setAnsiNameChange(short v) { (v ? runtimeFlags_ |= ANSI_NAME_CHANGE : runtimeFlags_ &= ~ANSI_NAME_CHANGE); };
NABoolean isAnsiNameChange() { return (runtimeFlags_ & ANSI_NAME_CHANGE) != 0; };
void setViewNameChange(short v) { (v ? runtimeFlags_ |= VIEW_NAME_CHANGE : runtimeFlags_ &= ~VIEW_NAME_CHANGE); };
NABoolean isViewNameChange() { return (runtimeFlags_ & VIEW_NAME_CHANGE) != 0; };
void setIgnoreTS(short v) { (v ? runtimeFlags_ |= IGNORE_TS : runtimeFlags_ &= ~IGNORE_TS); };
NABoolean ignoreTS() { return (runtimeFlags_ & IGNORE_TS) != 0; };
void setReservedName(short v) { (v ? runtimeFlags_ |= RESERVED_NAME : runtimeFlags_ &= ~RESERVED_NAME); };
NABoolean reservedName() { return (runtimeFlags_ & RESERVED_NAME) != 0; };
void resetRuntimeFlags();
NABoolean isLastUsedNameCompEmbedded() { return (runtimeFlags_ & LASTUSED_NAME_STR_PTR) == 0; };
static NABoolean makeSQLIdentifier(char * invalue, char * outvalue);
static NABoolean applyMPAliasDefaults(char * invalue,
char * outvalue,
char * defValString);
AnsiOrNskName *getLastUsedName(NAMemory *heap);
void setCompileTimeName(char *name, NAMemory *heap);
void setLastUsedName(char *name, NAMemory *heap);
void setLastUsedName(AnsiOrNskName *name);
Long pack(void *);
Lng32 unpack(void *, void * reallocator);
static NABoolean extractParts
(const char * inName, // IN: inName separated by "."s
char * outBuffer, // IN/OUT: space where parts will be moved.
// Must be allocated by caller
Lng32 &numParts, // OUT: number of parts extracted
char * parts[], // IN/OUT: array entries initialized to parts on return
NABoolean dQuote); // IN: if TRUE, parts are double quoted.
private:
void setCompileNameCompMode(short v)
{ (v ? flags_ |= COMP_NAME_STR_PTR :flags_ &= ~COMP_NAME_STR_PTR); };
NABoolean isCompileNameCompEmbedded() { return (flags_ & COMP_NAME_STR_PTR) == 0; };
void setLastUsedNameMode(short v)
{
if (v)
{
runtimeFlags_ |= LASTUSED_NAME_CLASS_PTR;
runtimeFlags_ &= ~LASTUSED_NAME_STR_PTR;
}
else
runtimeFlags_ &= ~LASTUSED_NAME_CLASS_PTR;
};
NABoolean isLastUsedNameEmbedded() { return (runtimeFlags_ & LASTUSED_NAME_CLASS_PTR) == 0; };
void setLastUsedNameCompMode(short v)
{
if (v)
{
runtimeFlags_ |= LASTUSED_NAME_STR_PTR;
runtimeFlags_ &= ~LASTUSED_NAME_CLASS_PTR;
}
else
runtimeFlags_ &= ~LASTUSED_NAME_STR_PTR;
};
enum { MAX_ANSI_IDENTIFIER_LEN = 258 }; // See common/ComAnsiNamePart.h
enum CompileTimeFlags
{
VARIABLE = 0x0001, // name is a hvar/param/envVar
ENV_VAR = 0x0002, // name is an envVar
ANSI_PHY_SAME = 0x0004, // name is a variable but the runtime value of
// variable is the resolved physical name.
// Used when the variable name is the
// name of a resource fork.
IS_INDEX = 0x0008, // this is an index.
DEFINE = 0x0010, // name is a guardian Define
IS_VIEW = 0x0020, // this is a view
IS_MPALIAS = 0x0040, // the variable contains an mpalias name.
NAME_ONLY = 0x0080, // variable, but only the table-name is needed
// (not the table's meta-data.) So avoid simila
// check and recompilation. Used by SET TIMEOUT
COMP_NAME_STR_PTR = 0x0100, // If not set, compileTimeAnsiName is the embedded string
CACHED_PARAM = 0x0200 // prototyped hvar for cached tablenames.
};
enum RunTimeFlags
{
ANSI_NAME_CHANGE = 0x0001, IGNORE_TS = 0x0002, VIEW_NAME_CHANGE = 0x0004,
RESERVED_NAME = 0x0008,
LASTUSED_NAME_STR_PTR = 0x0010,
LASTUSED_NAME_CLASS_PTR =0x0020, // If set, LastUsedName points to AnsiOrNskName, else is the
// character string embedded in LateBindInfo
};
UInt32 flags_; // 00- 03
UInt32 runtimeFlags_; // 04- 07
// Is this a base table or index being resolved? ComAnsiNameSpace (see
// ComSmallDefs.h)
//
Int32 nameSpace_; // 08- 11
// index into the input hvar/param descriptors
// where the table name host variable or param is.
// Valid if this is a variable name and not an env var.
Int16 inputListIndex_; // 12- 13
// name of hvar/param/envVar/define used to input the table name.
char varName_[MAX_ANSI_IDENTIFIER_LEN+1/*null terminator*/]; // 14-272
// the ANSI name as known at compile time. Could be:
// -- the specified table identifier, if name is not a variable.
// -- the value of env var, if name is an env var.
// -- the prototype value, if name is a hostvar/param.
char compileTimeAnsiName_[MAX_ANSI_IDENTIFIER_LEN+1/*null terminator*/];
// 273-531
// the corresponding guardian (physical) name for
// runtimeAnsiValue_(next field). This field is filled in at
// compile time initially. It could change at runtime if the
// physical name corresponding to the lastUsedAnsiName changes.
// Could happen: if the variable ANSI name changes, or the physical
// name changes as a result of drop and recreate of table/view with
// the same ansi name.
char resolvedPhyName_[MAX_PHYSICAL_NAME_LENGTH]; // 532-581
// Ansi name we used last. Intially set at compile time to
// compileTimeAnsiName_. Changed at runtime for variable name
// depending on the 'current' ansi name.
char lastUsedAnsiName_[MAX_ANSI_IDENTIFIER_LEN+1]; // 582-840
char filler1_[3]; // 841-843
Int32 cachedParamOffset_; // 844-847
char fillersLateNameInfo_[102]; // 848-949
};
// ---------------------------------------------------------------------
// Template instantiation to produce a 64-bit pointer emulator class
// for LateNameInfo
// ---------------------------------------------------------------------
typedef NAVersionedObjectPtrTempl<LateNameInfo> LateNameInfoPtr;
// ---------------------------------------------------------------------
// Template instantiation to produce a 64-bit pointer emulator class
// for LateNameInfoPtr
// ---------------------------------------------------------------------
typedef NAVersionedObjectPtrArrayTempl<LateNameInfoPtr> LateNameInfoPtrArray;
// ---------------------------------------------------------------------
// An array of LateNameInfo_ generated at compiled time.
// ---------------------------------------------------------------------
class LateNameInfoList : public NAVersionedObject
{
public:
LateNameInfoList()
: NAVersionedObject(-1)
{ flags_ = 0; numEntries_ = 0; };
// ---------------------------------------------------------------------
// Redefine virtual functions required for Versioning.
//----------------------------------------------------------------------
virtual unsigned char getClassVersionID()
{
return 1;
}
virtual void populateImageVersionIDArray()
{
setImageVersionID(0,getClassVersionID());
}
virtual short getClassSize() { return (short)sizeof(LateNameInfoList); }
virtual Long pack(void *);
virtual Lng32 unpack(void *, void * reallocator);
void allocateList(Space *space, Lng32 numEntries)
{
numEntries_ = numEntries;
lateNameInfo_.allocatePtrArray(space,numEntries);
}
LateNameInfo &getLateNameInfo(Int32 i)
{
return *(lateNameInfo_[i]);
};
void setLateNameInfo(Int32 i, LateNameInfo *lni)
{
lateNameInfo_[i] = lni;
}
// unsigned long &numEntries() { return numEntries_; };
ULng32 getNumEntries() { return numEntries_; };
void setNumEntries(ULng32 num) { numEntries_ = num; };
// returns the length of total info that needs to be sent to compiler
// at recomp time. This info is used to get to the actual tablename
// (and not the prototype name) that was specified thru a hvar/param/env
// var.
ULng32 getRecompLateNameInfoListLen();
// puts recomp info into 'buffer'. Space is to be allocated by caller.
void getRecompLateNameInfoList(char * buffer);
ULng32 getRecompLateNameInfoListLenPre1800();
// puts recomp info into 'buffer'. Space is to be allocated by caller.
void getRecompLateNameInfoListPre1800(char * buffer);
void resetRuntimeFlags();
NABoolean definePresent() { return (flags_ & DEFINE_PRESENT) != 0; };
void setDefinePresent(short v)
{ (v ? flags_ |= DEFINE_PRESENT : flags_ &= ~DEFINE_PRESENT); };
NABoolean viewPresent() { return (flags_ & VIEW_PRESENT) != 0; };
void setViewPresent(short v)
{ (v ? flags_ |= VIEW_PRESENT : flags_ &= ~VIEW_PRESENT); };
NABoolean envvarsPresent() { return (flags_ & ENVVARS_PRESENT) != 0; };
void setEnvvarsPresent(short v)
{ (v ? flags_ |= ENVVARS_PRESENT : flags_ &= ~ENVVARS_PRESENT); };
NABoolean variablePresent() { return (flags_ & VARIABLE_PRESENT) != 0; };
void setVariablePresent(short v)
{ (v ? flags_ |= VARIABLE_PRESENT : flags_ &= ~VARIABLE_PRESENT); };
private:
enum Flags
{
DEFINE_PRESENT = 0x0001, // one or more DEFINEs used in query
VIEW_PRESENT = 0x0002, // one or more views used in query
ENVVARS_PRESENT = 0x0004, // one or more envvars as tablenames used
// in the query.
VARIABLE_PRESENT = 0x0008 // one of more tablenames used in the query
// are passed in as variables.
// (hostvar, defines or envvars)
};
UInt32 flags_; // 00- 03
UInt32 numEntries_; // 04- 07
LateNameInfoPtrArray lateNameInfo_; // 08- 15
char fillersLateNameInfoList_[16]; // 16- 31
};
// ---------------------------------------------------------------------
// Template instantiation to produce a 64-bit pointer emulator class
// for LateNameInfoList
// ---------------------------------------------------------------------
typedef NAVersionedObjectPtrTempl<LateNameInfoList> LateNameInfoListPtr;
class AnsiOrNskName : public NABasicObject
{
public:
AnsiOrNskName(char *inName);
char *getInternalName() ;
char *getExternalName() ;
Int16 extractParts(Lng32 &numParts,
char *parts[]);
Int16 equals(AnsiOrNskName *name);
Int16 convertAnsiOrNskName(bool doCheck = TRUE);
Int16 fillInMissingParts(char *schemaName);
bool isNskName();
Int16 updateNSKInternalName(char *inName);
Int16 quoteNSKExtName();
private:
char extName_[MAX_ANSI_NAME_LENGTH]; // Given (external) 3-part name
// The ansi name with quotes stripped out and checked for ANSI name conventions.
// The maximum length (in bytes) of a UTF8 internal name is almost as long as
// that of the corresponding external name therefore we make the size of the array
// for the 3-part interal name the same as that for the 3-part external name.
char intName_[MAX_ANSI_NAME_LENGTH];
Int16 noOfParts_;
bool isNskName_; // TRUE if NSK name, FALSE if ansi name
char parts_[4][ComMAX_1_PART_EXTERNAL_UTF8_NAME_LEN_IN_BYTES+1]; // in UTF8
bool isValid_; // The flag that denotes if the name is checked and extracted into parts
bool isError_;
};
///////////////////////////////////////////////////////////
// class TrafSimilarityTableInfo
///////////////////////////////////////////////////////////
class TrafSimilarityTableInfo : public NAVersionedObject
{
public:
TrafSimilarityTableInfo(char * tableName,
NABoolean isHive,
char * hdfsRootDir,
Int64 modTS, Int32 numPartnLevels,
Queue * hdfsDirsToCheck,
char * hdfsHostName,
Int32 hdfsPort);
TrafSimilarityTableInfo();
~TrafSimilarityTableInfo();
NABoolean operator==(TrafSimilarityTableInfo &o);
// ---------------------------------------------------------------------
// Redefine virtual functions required for Versioning.
//----------------------------------------------------------------------
virtual unsigned char getClassVersionID()
{
return 1;
}
virtual void populateImageVersionIDArray()
{
setImageVersionID(0,getClassVersionID());
}
virtual short getClassSize() { return (short)sizeof(TrafSimilarityTableInfo); }
Long pack(void * space);
Lng32 unpack(void *, void * reallocator);
Int64 modTS() { return modTS_; }
Int32 numPartnLevels() { return numPartnLevels_; }
char * tableName() { return tableName_; }
char * hdfsRootDir() { return hdfsRootDir_; }
Queue * hdfsDirsToCheck() { return hdfsDirsToCheck_; }
char * hdfsHostName() { return hdfsHostName_; }
Int32 hdfsPort() { return hdfsPort_; }
NABoolean isHive() {return ((flags_ & HIVE) != 0);};
void setIsHive(NABoolean v)
{ (v ? flags_ |= HIVE : flags_ &= ~HIVE); };
private:
enum Flags
{
HIVE = 0x0001
};
Int64 modTS_;
Int32 numPartnLevels_;
UInt32 flags_;
NABasicPtr tableName_;
NABasicPtr hdfsRootDir_;
QueuePtr hdfsDirsToCheck_;
NABasicPtr hdfsHostName_;
Int32 hdfsPort_;
char fillers_[12];
};
typedef NAVersionedObjectPtrTempl<TrafSimilarityTableInfo> TrafSimilarityTableInfoPtr;
///////////////////////////////////////////////////////////////////
// class TrafQuerySimilarityInfo
///////////////////////////////////////////////////////////////////
class TrafQuerySimilarityInfo : public NAVersionedObject
{
public:
TrafQuerySimilarityInfo(Queue * siList);
TrafQuerySimilarityInfo();
~TrafQuerySimilarityInfo();
// ---------------------------------------------------------------------
// Redefine virtual functions required for Versioning.
//----------------------------------------------------------------------
virtual unsigned char getClassVersionID()
{
return 1;
}
virtual void populateImageVersionIDArray()
{
setImageVersionID(0,getClassVersionID());
}
virtual short getClassSize() { return (short)sizeof(TrafQuerySimilarityInfo); }
Queue * siList() { return siList_; };
Long pack(void * space);
Lng32 unpack(void *, void * reallocator);
NABoolean disableSimCheck()
{return ((flags_ & DISABLE_SIM_CHECK) != 0);};
void setDisableSimCheck(NABoolean v)
{(v ? flags_ |= DISABLE_SIM_CHECK : flags_ &= ~DISABLE_SIM_CHECK);};
NABoolean disableAutoRecomp()
{return ((flags_ & DISABLE_AUTO_RECOMP) != 0);};
void setDisableAutoRecomp(NABoolean v)
{(v ? flags_ |= DISABLE_AUTO_RECOMP : flags_ &= ~DISABLE_AUTO_RECOMP);};
private:
enum Flags
{
DISABLE_SIM_CHECK = 0x0002,
DISABLE_AUTO_RECOMP = 0x0004
};
// Queue of class TrafSimilarityTableInfo
QueuePtr siList_; // 00-07
Int16 option_; // 08-09
Int16 flags_; // 10-11
char fillersQuerySimilarityInfo_[36]; // 12-47
};
// ---------------------------------------------------------------------
// Template instantiation to produce a 64-bit pointer emulator class
// for TrafQuerySimilarityInfo
// ---------------------------------------------------------------------
typedef NAVersionedObjectPtrTempl<TrafQuerySimilarityInfo> TrafQuerySimilarityInfoPtr;
#endif // EX_LATEBIND_H