blob: 296fe69fdd454b1da4681b09712dc27f20f12073 [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 @@@
**********************************************************************/
#ifndef EXP_LOB_EXPR_H
#define EXP_LOB_EXPR_H
/* -*-C++-*-
*****************************************************************************
*
* File: ExpLOB.h
* Description:
*
*
* Created: 11/30/2012
* Language: C++
*
*
*
*
*****************************************************************************
*/
#include "SqlExpDllDefines.h"
#include "exp_clause.h"
#include "ExpLOBenums.h"
#define LOB_HANDLE_LEN 1024
class ExLobInMemoryDescChunksEntry;
////////////////////////////////
// class LOBglobals
////////////////////////////////
class LobLoadInfo
{
private:
class LobLoadEntry
{
public:
LobLoadEntry()
{
handle_ = NULL;
handleLen_ = 0;
};
char* &handle() { return handle_; }
Lng32 &handleLen() { return handleLen_; }
private:
char *handle_;
Lng32 handleLen_;
};
public:
LobLoadInfo(CollHeap * heap)
: heap_(heap)
, lobEntryList_(heap)
{};
~LobLoadInfo(){}
void setLobLoadEntries(Lng32 num)
{
}
void setLobHandle(Lng32 pos, Lng32 handleLen, char * handle)
{
if (lobEntryList_.used(pos))
{
NADELETEBASIC(lobEntryList_[pos]->handle(), heap_);
}
else
{
LobLoadEntry* lle = new(heap_) LobLoadEntry();
lobEntryList_.insertAt(pos, lle);
}
lobEntryList_[pos]->handleLen() = handleLen;
lobEntryList_[pos]->handle() = new(heap_) char[handleLen];
str_cpy_all(lobEntryList_[pos]->handle(), handle, handleLen);
}
char * lobHandle(Lng32 pos)
{
if (lobEntryList_.used(pos))
return lobEntryList_[pos]->handle();
else
return NULL;
};
Lng32 lobHandleLen(Lng32 pos)
{
if (lobEntryList_.used(pos))
return lobEntryList_[pos]->handleLen();
else
return -1;
};
private:
CollHeap * heap_;
NAArray<LobLoadEntry*> lobEntryList_;
};
class LOBglobals : public NABasicObject {
public:
LOBglobals(CollHeap * heap) : heap_(heap),
lobAccessGlobals_(NULL),
xnId_(-1),
lobOperInProgressList_(heap)
{
lobLoadInfo_ = new(heap) LobLoadInfo(heap);
};
~LOBglobals() { NADELETE(lobLoadInfo_,LobLoadInfo,heap_); lobLoadInfo_=NULL;}
void* &lobAccessGlobals() { return lobAccessGlobals_; };
LobLoadInfo * lobLoadInfo() { return lobLoadInfo_; }
Int64 &xnId() { return xnId_; };
void setLobOperInProgress(Lng32 pos, NABoolean v)
{
if (lobOperInProgressList_.used(pos))
lobOperInProgressList_[pos] = (v ? 1 : 0);
else
lobOperInProgressList_.insertAt(pos, v);
}
NABoolean getLobOperInProgress(Lng32 pos)
{
return (lobOperInProgressList_[pos] != 0);
}
void setCurrLobOperInProgress(NABoolean v) { currLobOperInProgress_ = v; }
NABoolean getCurrLobOperInProgress() { return currLobOperInProgress_; }
private:
CollHeap * heap_;
void * lobAccessGlobals_;
LobLoadInfo * lobLoadInfo_;
// transaction id of the current transaction in progress.
// -1, if no transaction is associated with the current request.
Int64 xnId_;
NAArray<Lng32> lobOperInProgressList_;
NABoolean currLobOperInProgress_;
};
/////////////////////////////////////////
// Class ExpLOBoper //
/////////////////////////////////////////
class ExpLOBoper : public ex_clause {
public:
// Construction
//
ExpLOBoper();
ExpLOBoper(OperatorTypeEnum oper_type,
short num_operands,
Attributes ** attr,
Space * space);
virtual ex_expr::exp_return_type pCodeGenerate(Space *space, UInt32 f);
// Display
//
virtual void displayContents(Space * space, const char * displayStr,
Int32 clauseNum, char * constsArea);
// ---------------------------------------------------------------------
// Redefinition of methods inherited from NAVersionedObject.
// ---------------------------------------------------------------------
virtual unsigned char getClassVersionID()
{
return 1;
}
virtual void populateImageVersionIDArray()
{
setImageVersionID(1,getClassVersionID());
ex_clause::populateImageVersionIDArray();
}
virtual short getClassSize() { return (short)sizeof(*this); }
// ---------------------------------------------------------------------
// LOB hdfs name format for permanent lobs.
// Length: 30 bytes
//
// LOBP_<objectUid>_<LOBnum>
// <---20----> <--4--->
static char * ExpGetLOBname(Int64 uid, Lng32 lobNum,
char * outBuf, Lng32 outBufLen);
static char * ExpGetLOBDescName(Lng32 schNameLen, char * schName,
Int64 uid, Lng32 lobNum,
char * outBuf, Lng32 outBufLen);
static char * ExpGetLOBDescHandleObjNamePrefix(Int64 uid,
char * outBuf, Lng32 outBufLen);
static char * ExpGetLOBDescHandleName(Lng32 schNameLen, char * schName,
Int64 uid, Lng32 lobNum,
char * outBuf, Lng32 outBufLen);
static char * ExpGetLOBDescChunksName(Lng32 schNameLen, char * schName,
Int64 uid, Lng32 lobNum,
char * outBuf, Lng32 outBufLen);
static Lng32 ExpGetLOBnumFromDescName(char * descName, Lng32 descNameLen);
static char * ExpGetLOBMDName(Lng32 schNameLen, char * schName,
Int64 uid,
char * outBuf, Lng32 outBufLen);
static void calculateNewOffsets(ExLobInMemoryDescChunksEntry *dcArray, Lng32 numEntries);
static Lng32 compactLobDataFile(void *lobGlob, ExLobInMemoryDescChunksEntry *dcArray, Int32 numEntries, char *tgtLobName, Int64 lobMaxChunkSize, void *lobHeap,void *currContext,char *hdfsServer, Int32 hdfsPort,char *lobLocation);
static Int32 restoreLobDataFile(void *lobGlob, char *lobName, void *lobHeap, void *currContext,char *hdfsServer, Int32 hdfsPort,char *lobLocation );
static Int32 purgeBackupLobDataFile(void *lobGlob,char *lobName, void *lobHeap, void *currContext, char *hdfsServer, Int32 hdfsPort, char *lobLocation);
static Lng32 createLOB(void * lobGlob, void *currContext,void * lobHeap,
char * lobLoc, Int32 hdfsPort, char *hdfsServer,
Int64 uid, Lng32 lobNum, Int64 lobMAxSize);
static Lng32 dropLOB(void * lobGlob, void *currContext,void * lobHeap,
char * lobLoc,Int32 hdfsPort, char *hdfsServer,
Int64 uid, Lng32 lobNum);
static Lng32 purgedataLOB(void * lobGlob,
char * lobLob,
Int64 uid, Lng32 lobNum);
static Lng32 initLOBglobal(void *& lobGlob, void * heap, void *currContext,char *server, Int32 port );
// Extracts values from the LOB handle stored at ptr
static Lng32 extractFromLOBhandle(Int16 *flags,
Lng32 *lobType,
Lng32 *lobNum,
Int64 *uid,
Int64 *descSyskey,
Int64 *descPartnKey,
short *schNameLen,
char * schName,
char * ptrToLobHandle,
Lng32 handleLen = 0);
// Generates LOB handle that is stored in the SQL row.
// LOB handle max len: 512 bytes
// <flags><LOBType><LOBnum><objectUid><LOBlen><descKey><descTS><chunkNum><schNameLen><schName>
// <--4--><--4----><--4---><----8----><---8--><---8---><--8---><----2---><---2------><--vc--->
static void genLOBhandle(Int64 uid,
Lng32 lobNum,
Int32 lobType,
Int64 descKey,
Int64 descTS,
Lng32 flags,
short schNameLen,
char * schName,
Lng32 &handleLen,
char * ptr);
static void updLOBhandle(Int64 descSyskey,
Lng32 flags,
char * ptr);
static Lng32 genLOBhandleFromHandleString(char * lobHandleString,
Lng32 lobHandleStringLen,
char * lobHandle,
Lng32 &lobHandleLen);
short &lobNum() {return lobNum_; }
LobsStorage lobStorageType() { return (LobsStorage)lobStorageType_; }
void setLobStorageType(LobsStorage v) { lobStorageType_ = (short)v; };
char * lobStorageLocation() { return lobStorageLocation_; }
void setLobStorageLocation(char * loc) { strcpy(lobStorageLocation_, loc); }
Long pack(void *);
Lng32 unpack(void *, void * reallocator);
void setDescSchNameLen(short v) { descSchNameLen_ = v; }
virtual Lng32 initClause();
void setLobMaxSize(Int64 maxsize) { lobMaxSize_ = maxsize;}
Int64 getLobMaxSize() { return lobMaxSize_;}
void setLobSize(Int64 lobsize) { lobSize_ = lobsize;}
Int64 getLobSize() { return lobSize_;}
void setLobMaxChunkMemSize(Int64 maxsize) { lobMaxChunkMemSize_ = maxsize;}
Int64 getLobMaxChunkMemSize() { return lobMaxChunkMemSize_;}
void setLobGCLimit(Int64 gclimit) { lobGCLimit_ = gclimit;}
Int64 getLobGCLimit() { return lobGCLimit_;}
void setLobHdfsServer(char *hdfsServer)
{strcpy(lobHdfsServer_,hdfsServer);}
void setLobHdfsPort(Int32 hdfsPort)
{lobHdfsPort_ = hdfsPort;}
protected:
typedef enum
{
DO_NOTHING_,
CHECK_STATUS_,
START_LOB_OPER_
} LobOperStatus;
static Lng32 extractFromLOBstring(Int64 &uid,
Int32 &lobNum,
Int64 &descPartnKey,
Int64 &descSyskey,
Int16 &flags,
Int32 &lobType,
short &schNameLen,
char * schName,
char * handle,
Int32 handleLen);
void createLOBhandleString(Int16 flags,
Int32 lobType,
Int64 uid,
Lng32 lobNum,
Int64 descKey,
Int64 descTS,
Int16 schNameLen,
char * schName,
char * ptrToLobHandle);
struct LOBHandle
{
Int32 flags_;
Int32 lobType_;
Lng32 lobNum_;
Int64 objUID_;
Int64 descSyskey_;
Int64 descPartnkey_;
short schNameLen_;
char schName_;
};
Lng32 checkLobOperStatus();
protected:
char * descSchName() { return descSchName_; }
char * getLobHdfsServer() { return (strlen(lobHdfsServer_) == 0 ? NULL : lobHdfsServer_); }
Lng32 getLobHdfsPort() { return lobHdfsPort_; }
short flags_; // 00-02
short lobNum_;
short lobStorageType_;
short lobHandleLenSaved_;
// identifier returned by ExLobsOper during a nowaited operation.
// Used to check status of the request.
Int64 requestTag_;
char lobHandleSaved_[LOB_HANDLE_LEN];
char outLobHandle_[LOB_HANDLE_LEN];
Int32 outHandleLen_;
char blackBox_[1024];
Int64 blackBoxLen_;
char lobStorageLocation_[1024];
char lobHdfsServer_[512];
Lng32 lobHdfsPort_;
short descSchNameLen_;
char descSchName_[510];
Int64 lobSize_;
Int64 lobMaxSize_;
Int64 lobMaxChunkMemSize_;
Int64 lobGCLimit_;
// NABasicPtr lobStorageLocation_;
}
;
class ExpLOBiud : public ExpLOBoper {
public:
ExpLOBiud(OperatorTypeEnum oper_type,
Lng32 numAttrs,
Attributes ** attr,
Int64 objectUID,
short descSchNameLen,
char * descSchName,
Space * space);
ExpLOBiud();
ex_expr::exp_return_type insertDesc(char *op_data[],
CollHeap*h,
ComDiagsArea** diagsArea);
ex_expr::exp_return_type insertData(Lng32 handleLen,
char * handle,
char *op_data[],
CollHeap*h,
ComDiagsArea** diagsArea);
NA_EIDPROC NABoolean isAppend()
{
return ((liudFlags_ & IS_APPEND) != 0);
};
NA_EIDPROC inline void setIsAppend(NABoolean v)
{
(v) ? liudFlags_ |= IS_APPEND: liudFlags_ &= ~IS_APPEND;
};
NA_EIDPROC NABoolean fromString()
{
return ((liudFlags_ & FROM_STRING) != 0);
};
NA_EIDPROC inline void setFromString(NABoolean v)
{
(v) ? liudFlags_ |= FROM_STRING: liudFlags_ &= ~FROM_STRING;
};
NA_EIDPROC NABoolean fromBuffer()
{
return ((liudFlags_ & FROM_BUFFER) != 0);
};
NA_EIDPROC inline void setFromBuffer(NABoolean v)
{
(v) ? liudFlags_ |= FROM_BUFFER: liudFlags_ &= ~FROM_BUFFER;
};
NA_EIDPROC inline void setFromEmpty(NABoolean v)
{
(v) ? liudFlags_ |= FROM_EMPTY: liudFlags_ &= ~FROM_EMPTY;
};
NA_EIDPROC NABoolean fromEmpty()
{
return ((liudFlags_ & FROM_EMPTY) != 0);
};
NA_EIDPROC NABoolean fromFile()
{
return ((liudFlags_ & FROM_FILE) != 0);
};
NA_EIDPROC inline void setFromFile(NABoolean v)
{
(v) ? liudFlags_ |= FROM_FILE: liudFlags_ &= ~FROM_FILE;
};
NA_EIDPROC NABoolean fromLoad()
{
return ((liudFlags_ & FROM_LOAD) != 0);
};
NA_EIDPROC inline void setFromLoad(NABoolean v)
{
(v) ? liudFlags_ |= FROM_LOAD: liudFlags_ &= ~FROM_LOAD;
};
NA_EIDPROC NABoolean fromLob()
{
return ((liudFlags_ & FROM_LOB) != 0);
};
NA_EIDPROC inline void setFromLob(NABoolean v)
{
(v) ? liudFlags_ |= FROM_LOB: liudFlags_ &= ~FROM_LOB;
};
NA_EIDPROC NABoolean fromExternal()
{
return ((liudFlags_ & FROM_EXTERNAL) != 0);
};
NA_EIDPROC inline void setFromExternal(NABoolean v)
{
(v) ? liudFlags_ |= FROM_EXTERNAL: liudFlags_ &= ~FROM_EXTERNAL;
};
protected:
Int64 objectUID_;
enum
{
IS_APPEND = 0x0001,
FROM_STRING = 0x0002,
FROM_FILE = 0x0004,
FROM_LOAD = 0x0008,
FROM_LOB = 0x0010,
FROM_EXTERNAL = 0x0020,
FROM_BUFFER = 0x0040,
FROM_EMPTY = 0x0080
};
Lng32 liudFlags_;
char filler1_[4];
};
class ExpLOBinsert : public ExpLOBiud {
public:
ExpLOBinsert(OperatorTypeEnum oper_type,
Lng32 numAttrs,
Attributes ** attr,
Int64 objectUID,
short descSchNameLen,
char * descSchName,
Space * space);
ExpLOBinsert();
virtual ex_expr::exp_return_type eval(char *op_data[],
CollHeap*,
ComDiagsArea** diagsArea = 0);
// Display
//
virtual void displayContents(Space * space, const char * displayStr,
Int32 clauseNum, char * constsArea);
// ---------------------------------------------------------------------
// Redefinition of methods inherited from NAVersionedObject.
// ---------------------------------------------------------------------
virtual unsigned char getClassVersionID()
{
return 1;
}
virtual void populateImageVersionIDArray()
{
setImageVersionID(2,getClassVersionID());
ExpLOBoper::populateImageVersionIDArray();
}
virtual short getClassSize() { return (short)sizeof(*this); }
// ---------------------------------------------------------------------
private:
Lng32 liFlags_;
char filler1_[4];
};
class ExpLOBdelete : public ExpLOBiud {
public:
ExpLOBdelete(OperatorTypeEnum oper_type,
Attributes ** attr,
Space * space);
ExpLOBdelete();
virtual ex_expr::exp_return_type eval(char *op_data[],
CollHeap*,
ComDiagsArea** diagsArea = 0);
// Display
//
virtual void displayContents(Space * space, const char * displayStr,
Int32 clauseNum, char * constsArea);
// ---------------------------------------------------------------------
// Redefinition of methods inherited from NAVersionedObject.
// ---------------------------------------------------------------------
virtual unsigned char getClassVersionID()
{
return 1;
}
virtual void populateImageVersionIDArray()
{
setImageVersionID(2,getClassVersionID());
ExpLOBoper::populateImageVersionIDArray();
}
virtual short getClassSize() { return (short)sizeof(*this); }
// ---------------------------------------------------------------------
private:
Lng32 ldFlags_;
char filler1_[4];
};
class ExpLOBupdate : public ExpLOBiud {
public:
ExpLOBupdate(OperatorTypeEnum oper_type,
Lng32 numAttrs,
Attributes ** attr,
Int64 objectUID,
short descSchNameLen,
char * descSchName,
Space * space);
ExpLOBupdate();
// Null Semantics
//
Int32 isNullInNullOut() const { return 0; };
Int32 isNullRelevant() const { return 1; };
virtual ex_expr::exp_return_type processNulls(char *op_data[], CollHeap *heap,
ComDiagsArea **diagsArea);
virtual ex_expr::exp_return_type eval(char *op_data[],
CollHeap*,
ComDiagsArea** diagsArea = 0);
// Display
//
virtual void displayContents(Space * space, const char * displayStr,
Int32 clauseNum, char * constsArea);
// ---------------------------------------------------------------------
// Redefinition of methods inherited from NAVersionedObject.
// ---------------------------------------------------------------------
virtual unsigned char getClassVersionID()
{
return 1;
}
virtual void populateImageVersionIDArray()
{
setImageVersionID(2,getClassVersionID());
ExpLOBoper::populateImageVersionIDArray();
}
virtual short getClassSize() { return (short)sizeof(*this); }
// ---------------------------------------------------------------------
private:
Lng32 luFlags_;
short nullValue_;
char filler1_[2];
};
class ExpLOBselect : public ExpLOBoper {
public:
ExpLOBselect(OperatorTypeEnum oper_type,
Attributes ** attr,
Space * space);
ExpLOBselect();
virtual ex_expr::exp_return_type eval(char *op_data[],
CollHeap*,
ComDiagsArea** diagsArea = 0);
// Display
//
virtual void displayContents(Space * space, const char * displayStr,
Int32 clauseNum, char * constsArea);
// ---------------------------------------------------------------------
// Redefinition of methods inherited from NAVersionedObject.
// ---------------------------------------------------------------------
virtual unsigned char getClassVersionID()
{
return 1;
}
virtual void populateImageVersionIDArray()
{
setImageVersionID(2,getClassVersionID());
ExpLOBoper::populateImageVersionIDArray();
}
virtual short getClassSize() { return (short)sizeof(*this); }
// ---------------------------------------------------------------------
NA_EIDPROC NABoolean toLob()
{
return ((lsFlags_ & TO_LOB) != 0);
};
NA_EIDPROC inline void setToLob(NABoolean v)
{
(v) ? lsFlags_ |= TO_LOB: lsFlags_ &= ~TO_LOB;
};
NA_EIDPROC NABoolean toFile()
{
return ((lsFlags_ & TO_FILE) != 0);
};
NA_EIDPROC inline void setToFile(NABoolean v)
{
(v) ? lsFlags_ |= TO_FILE: lsFlags_ &= ~TO_FILE;
};
void setTgtFile(char *tgtFile)
{
strcpy(tgtFile_,tgtFile);
}
char *getTgtFile()
{
return tgtFile_;
}
void setTgtLocation(char *tgtLoc)
{
strcpy(tgtLocation_,tgtLoc);
}
char *getTgtLocation()
{
return tgtLocation_;
}
private:
enum
{
TO_LOB = 0x0001,
TO_FILE = 0x0002
};
Lng32 lsFlags_;
char filler1_[4];
char tgtLocation_[512];
char tgtFile_[512];
};
class ExpLOBconvert : public ExpLOBoper {
public:
ExpLOBconvert(OperatorTypeEnum oper_type,
Attributes ** attr,
Space * space);
ExpLOBconvert();
virtual ex_expr::exp_return_type eval(char *op_data[],
CollHeap*,
ComDiagsArea** diagsArea = 0);
// Display
//
virtual void displayContents(Space * space, const char * displayStr,
Int32 clauseNum, char * constsArea);
// ---------------------------------------------------------------------
// Redefinition of methods inherited from NAVersionedObject.
// ---------------------------------------------------------------------
virtual unsigned char getClassVersionID()
{
return 1;
}
virtual void populateImageVersionIDArray()
{
setImageVersionID(2,getClassVersionID());
ExpLOBoper::populateImageVersionIDArray();
}
virtual short getClassSize() { return (short)sizeof(*this); }
// ---------------------------------------------------------------------
NA_EIDPROC NABoolean toString()
{
return ((lcFlags_ & TO_STRING) != 0);
};
NA_EIDPROC inline void setToString(NABoolean v)
{
(v) ? lcFlags_ |= TO_STRING: lcFlags_ &= ~TO_STRING;
};
NA_EIDPROC NABoolean toLob()
{
return ((lcFlags_ & TO_LOB) != 0);
};
NA_EIDPROC inline void setToLob(NABoolean v)
{
(v) ? lcFlags_ |= TO_LOB: lcFlags_ &= ~TO_LOB;
};
NA_EIDPROC NABoolean toFile()
{
return ((lcFlags_ & TO_FILE) != 0);
};
NA_EIDPROC inline void setToFile(NABoolean v)
{
(v) ? lcFlags_ |= TO_FILE: lcFlags_ &= ~TO_FILE;
};
void setConvertSize(Int64 size)
{
convertSize_ = size;
}
Int64 getConvertSize()
{
return convertSize_;
}
void setTgtFile(char *tgtFile)
{
tgtFileName_ = tgtFile;
}
char *getTgtFile()
{
return tgtFileName_;
}
private:
enum
{
TO_STRING = 0x0001,
TO_LOB = 0x0002,
TO_FILE = 0x0004
};
Lng32 lcFlags_;
char filler1_[4];
Int64 convertSize_;
char * tgtFileName_;
};
class ExpLOBconvertHandle : public ExpLOBoper {
public:
ExpLOBconvertHandle(OperatorTypeEnum oper_type,
Attributes ** attr,
Space * space);
ExpLOBconvertHandle();
virtual ex_expr::exp_return_type eval(char *op_data[],
CollHeap*,
ComDiagsArea** diagsArea = 0);
// Display
//
virtual void displayContents(Space * space, const char * displayStr,
Int32 clauseNum, char * constsArea);
// ---------------------------------------------------------------------
// Redefinition of methods inherited from NAVersionedObject.
// ---------------------------------------------------------------------
virtual unsigned char getClassVersionID()
{
return 1;
}
virtual void populateImageVersionIDArray()
{
setImageVersionID(2,getClassVersionID());
ExpLOBoper::populateImageVersionIDArray();
}
virtual short getClassSize() { return (short)sizeof(*this); }
// ---------------------------------------------------------------------
NA_EIDPROC NABoolean toString()
{
return ((lchFlags_ & TO_STRING) != 0);
};
NA_EIDPROC inline void setToString(NABoolean v)
{
(v) ? lchFlags_ |= TO_STRING: lchFlags_ &= ~TO_STRING;
};
NA_EIDPROC NABoolean toLob()
{
return ((lchFlags_ & TO_LOB) != 0);
};
NA_EIDPROC inline void setToLob(NABoolean v)
{
(v) ? lchFlags_ |= TO_LOB: lchFlags_ &= ~TO_LOB;
};
private:
enum
{
TO_STRING = 0x0001,
TO_LOB = 0x0002
};
Lng32 lchFlags_;
char filler1_[4];
};
class ExpLOBload : public ExpLOBinsert {
public:
ExpLOBload(OperatorTypeEnum oper_type,
Lng32 numAttrs,
Attributes ** attr,
Int64 objectUID,
short descSchNameLen,
char * descSchName,
Space * space);
ExpLOBload();
virtual ex_expr::exp_return_type eval(char *op_data[],
CollHeap*,
ComDiagsArea** diagsArea = 0);
// Display
//
virtual void displayContents(Space * space, const char * displayStr,
Int32 clauseNum, char * constsArea);
// ---------------------------------------------------------------------
// Redefinition of methods inherited from NAVersionedObject.
// ---------------------------------------------------------------------
virtual unsigned char getClassVersionID()
{
return 1;
}
virtual void populateImageVersionIDArray()
{
setImageVersionID(2,getClassVersionID());
ExpLOBoper::populateImageVersionIDArray();
}
virtual short getClassSize() { return (short)sizeof(*this); }
// ---------------------------------------------------------------------
private:
Lng32 llFlags_;
char filler1_[4];
};
/////////////////////////////////////////
// Class ExpLOBfunction //
/////////////////////////////////////////
class ExpLOBfunction : public ExpLOBoper {
public:
// Construction
//
ExpLOBfunction();
ExpLOBfunction(OperatorTypeEnum oper_type,
short num_operands,
Attributes ** attr,
Space * space);
protected:
private:
Int64 funcFlags_;
}
;
/////////////////////////////////////////
// Class ExpLOBfuncSubstring
/////////////////////////////////////////
class ExpLOBfuncSubstring : public ExpLOBfunction {
public:
// Construction
//
ExpLOBfuncSubstring();
ExpLOBfuncSubstring(OperatorTypeEnum oper_type,
short num_operands,
Attributes ** attr,
Space * space);
// Display
//
virtual void displayContents(Space * space, const char * displayStr,
Int32 clauseNum, char * constsArea);
virtual ex_expr::exp_return_type eval(char *op_data[], CollHeap*,
ComDiagsArea** = 0);
// ---------------------------------------------------------------------
// Redefinition of methods inherited from NAVersionedObject.
// ---------------------------------------------------------------------
NA_EIDPROC virtual unsigned char getClassVersionID()
{
return 1;
}
NA_EIDPROC virtual void populateImageVersionIDArray()
{
setImageVersionID(2,getClassVersionID());
ExpLOBoper::populateImageVersionIDArray();
}
NA_EIDPROC virtual short getClassSize() { return (short)sizeof(*this); }
private:
}
;
#endif