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/04/21 01:05:14 UTC
[2/7] incubator-trafodion git commit: support for get command for LOB
tables. Support for tracing LOB operations.
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/bbe87c92/core/sql/exp/ExpLOBaccess.cpp
----------------------------------------------------------------------
diff --git a/core/sql/exp/ExpLOBaccess.cpp b/core/sql/exp/ExpLOBaccess.cpp
index 217f96a..929db63 100644
--- a/core/sql/exp/ExpLOBaccess.cpp
+++ b/core/sql/exp/ExpLOBaccess.cpp
@@ -81,7 +81,8 @@ ExLob::ExLob() :
lobGlobalHeap_(NULL),
fs_(NULL),
fdData_(NULL),
- openFlags_(0)
+ openFlags_(0),
+ lobTrace_(FALSE)
{
lobDataFile_[0] = '\0';
@@ -211,6 +212,9 @@ Ex_Lob_Error ExLob::fetchCursor(char *handleIn, Int32 handleLenIn, Int64 &outOff
Int64 offset = 0;
Int64 size = 0;
lobCursors_it it = lobCursors_.find(string(handleIn, handleLenIn));
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::fetchCursor",0,__LINE__,lobTrace_);
+
if (it == lobCursors_.end())
{
@@ -227,10 +231,14 @@ Ex_Lob_Error ExLob::fetchCursor(char *handleIn, Int32 handleLenIn, Int64 &outOff
&offset, &size,
&dummyParam, &dummyParam,
&cliInterface,
- transId);
- if (err != LOB_OPER_OK)
+ transId,lobTrace_);
+ if (cliErr <0 )
{
- return err;
+ str_sprintf(logBuf, "LOB_CLI_SELECT_FETCH Returned cli error %d",cliErr);
+ lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
+
+ err = LOB_DESC_READ_ERROR;
+ return err;
}
if (cliErr == 100 )
{
@@ -242,7 +250,14 @@ Ex_Lob_Error ExLob::fetchCursor(char *handleIn, Int32 handleLenIn, Int64 &outOff
&dummyParam, &dummyParam,
&dummyParam, &dummyParam,
&cliInterface,
- transId);
+ transId,lobTrace_);
+ if (cliErr <0 )
+ {
+ str_sprintf(logBuf, "LOB_CLI_SELECT_CLOSE Returned cli error %d",cliErr);
+ lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
+ err = LOB_DESC_READ_ERROR;
+ return err;
+ }
}
else
@@ -251,7 +266,8 @@ Ex_Lob_Error ExLob::fetchCursor(char *handleIn, Int32 handleLenIn, Int64 &outOff
outSize = size;
}
-
+ str_sprintf(logBuf, " Returned after ::fetchCursor %Ld,%Ld",outOffset,outSize);
+ lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
return err;
}
@@ -264,7 +280,9 @@ Ex_Lob_Error ExLob::getDesc(ExLobDesc &desc,char * handleIn, Int32 handleInLen,
NABoolean multipleChunks = FALSE;
Int32 clierr = 0;
Int64 size,offset,dummyParam = 0;
-
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::getDesc",0,__LINE__,lobTrace_);
+
clierr = SQL_EXEC_LOBcliInterface(handleIn,
handleInLen,
@@ -274,13 +292,15 @@ Ex_Lob_Error ExLob::getDesc(ExLobDesc &desc,char * handleIn, Int32 handleInLen,
&offset, &size,
&dummyParam, &dummyParam,
0,
- transId);
+ transId,lobTrace_);
if (clierr < 0)
return LOB_DESC_READ_ERROR;
desc.setOffset(offset);
desc.setSize(size);
-
+
+ str_sprintf(logBuf,"After Cli LOB_CLI_SELECT_UNIQUE:descOffset:%Ld, descSize: %Ld",offset,size);
+ lobDebugInfo(logBuf, 0,__LINE__,lobTrace_);
return err;
}
@@ -288,7 +308,8 @@ Ex_Lob_Error ExLob::getDesc(ExLobDesc &desc,char * handleIn, Int32 handleInLen,
Ex_Lob_Error ExLob::writeData(Int64 offset, char *data, Int32 size, Int64 &operLen)
{
Ex_Lob_Error err;
- if (!fdData_ || (openFlags_ != (O_WRONLY | O_APPEND))) // file is not open for write
+ lobDebugInfo("In ExLob::writeData",0,__LINE__,lobTrace_);
+ if (!fdData_ || (openFlags_ != (O_WRONLY | O_APPEND))) // file is not open for write
{
// get file info
hdfsFileInfo *fInfo = hdfsGetPathInfo(fs_, lobDataFile_);
@@ -427,6 +448,8 @@ static size_t header_throw_away(void *ptr, size_t size, size_t nmemb, void *data
Ex_Lob_Error ExLob::statSourceFile(char *srcfile, Int64 &sourceEOF)
{
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::statSourceFile",0,__LINE__,lobTrace_);
// check if the source file is a hdfs file or from local file system.
LobInputOutputFileType srcType = fileType(srcfile);
if (srcType == HDFS_FILE)
@@ -440,7 +463,9 @@ Ex_Lob_Error ExLob::statSourceFile(char *srcfile, Int64 &sourceEOF)
sourceEOF = sourceFileInfo->mSize;
else
return LOB_SOURCE_FILE_OPEN_ERROR;
-
+
+ str_sprintf(logBuf,"Returning EOF of %Ld for file %s", sourceEOF,srcfile);
+ lobDebugInfo(logBuf, 0,__LINE__,lobTrace_);
}
else if (srcType == LOCAL_FILE)
@@ -466,7 +491,8 @@ Ex_Lob_Error ExLob::statSourceFile(char *srcfile, Int64 &sourceEOF)
flock(fdSrcFile, LOCK_UN);
close(fdSrcFile);
-
+ str_sprintf(logBuf,"Returning EOF of %Ld for file %s", sourceEOF,srcfile);
+ lobDebugInfo(logBuf, 0,__LINE__,lobTrace_);
}
else if (srcType == CURL_FILE)
@@ -507,6 +533,8 @@ Ex_Lob_Error ExLob::statSourceFile(char *srcfile, Int64 &sourceEOF)
}
}
+
+
return LOB_OPER_OK;
}
@@ -537,7 +565,11 @@ Ex_Lob_Error ExLob::readSourceFile(char *srcfile, char *&fileData, Int32 &size,
}
Ex_Lob_Error ExLob::readHdfsSourceFile(char *srcfile, char *&fileData, Int32 &size, Int64 offset)
{
-
+ char logBuf[4096];
+ str_sprintf(logBuf,"Calling ::readHdfsSourceFile: %s Offset:%Ld, Size: %Ld",srcfile, offset,size);
+ lobDebugInfo(logBuf, 0,__LINE__,lobTrace_);
+
+
int openFlags = O_RDONLY;
hdfsFile fdSrcFile = hdfsOpenFile(fs_,srcfile, openFlags,0,0,0);
if (fdSrcFile == NULL) {
@@ -564,6 +596,10 @@ Ex_Lob_Error ExLob::readHdfsSourceFile(char *srcfile, char *&fileData, Int32 &si
}
Ex_Lob_Error ExLob::readLocalSourceFile(char *srcfile, char *&fileData, Int32 &size, Int64 offset)
{
+ char logBuf[4096];
+ str_sprintf(logBuf,"Calling ::readLocalSourceFile: %s Offset:%Ld, Size: %Ld",srcfile, offset,size);
+ lobDebugInfo(logBuf, 0,__LINE__,lobTrace_);
+
int openFlags = O_RDONLY;
int fdSrcFile = open(srcfile, openFlags);
if (fdSrcFile < 0 ) {
@@ -632,7 +668,8 @@ Ex_Lob_Error ExLob::writeDesc(Int64 &sourceLen, char *source, LobsSubOper subOpe
Int64 outDescPartnKey = 0;
Int64 outDescSyskey = 0;
Int32 clierr = 0;
-
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::writeDesc",0,__LINE__,lobTrace_);
// Calculate sourceLen for each subOper.
if (subOper == Lob_File)
{
@@ -645,12 +682,13 @@ Ex_Lob_Error ExLob::writeDesc(Int64 &sourceLen, char *source, LobsSubOper subOpe
return LOB_MAX_LIMIT_ERROR; //exceeded the size of the max lob size
//TBD trigger compaction
}
+ lobDebugInfo("Calling ExLob::allocateDesc",0,__LINE__,lobTrace_);
err = allocateDesc((unsigned int)sourceLen, descNumOut, dataOffset, lobMaxSize, lobMaxChunkMemSize,handleIn, handleInLen, lobGCLimit,lobGlobals);
operLen = 0;
if (err != LOB_OPER_OK)
return err;
-
+ lobDebugInfo("Calling cli LOB_CLI_INSERT",0,__LINE__,lobTrace_);
clierr = SQL_EXEC_LOBcliInterface(handleIn,
handleInLen,
NULL, blackBoxLen,
@@ -659,8 +697,11 @@ Ex_Lob_Error ExLob::writeDesc(Int64 &sourceLen, char *source, LobsSubOper subOpe
&dataOffset, &sourceLen,
&outDescPartnKey, &outDescSyskey,
0,
- 0);
+ 0,lobTrace_);
if (clierr < 0 ) {
+ str_sprintf(logBuf,"CLI LOB_CLI_INSERT returned error %d",clierr);
+ lobDebugInfo(logBuf, 0,__LINE__,lobTrace_);
+
return LOB_DESC_WRITE_ERROR;
}
return err;
@@ -678,7 +719,11 @@ Ex_Lob_Error ExLob::insertDesc(Int64 offset, Int64 size, char *handleIn, Int32
Int32 chunkNum = 1;
NABoolean foundUnused = FALSE;
-
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::InsertDesc",0,__LINE__,lobTrace_);
+ str_sprintf(logBuf,"Calling Cli LOB_CLI_INSERT: Offset:%Ld, Size: %Ld",
+ offset,size);
+ lobDebugInfo(logBuf, 0,__LINE__,lobTrace_);
clierr = SQL_EXEC_LOBcliInterface(handleIn,
handleInLen,
NULL, &chunkNum,
@@ -687,10 +732,14 @@ Ex_Lob_Error ExLob::insertDesc(Int64 offset, Int64 size, char *handleIn, Int32
&offset, &size,
&outDescPartnKey, &outDescSyskey,
0,
- 0);
-
+ 0,lobTrace_);
+ str_sprintf(logBuf,"After LOB_CLI_INSERT: ChunkNum: OutSyskey:%Ld",
+ chunkNum,outDescSyskey);
+ lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
+ lobDebugInfo("Leaving ExLob::InsertDesc",0,__LINE__,lobTrace_);
if (clierr < 0 ) {
- return LOB_DESC_WRITE_ERROR;
+ lobDebugInfo("LOB_CLI_INSERT cli call returned error :",clierr,__LINE__,TRUE);
+ return LOB_DESC_WRITE_ERROR;
}
return LOB_OPER_OK;
}
@@ -699,7 +748,8 @@ Ex_Lob_Error ExLob::insertDesc(Int64 offset, Int64 size, char *handleIn, Int32
Ex_Lob_Error ExLob::writeLobData(char *source, Int64 sourceLen, LobsSubOper subOperation, Int64 tgtOffset,Int64 &operLen, Int64 lobMaxChunkMemSize)
{
Ex_Lob_Error err;
-
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::writeLobData",0,__LINE__,lobTrace_);
char *inputAddr = source;
Int64 readOffset = 0;
Int32 allocMemSize = 0;
@@ -710,9 +760,14 @@ Ex_Lob_Error ExLob::writeLobData(char *source, Int64 sourceLen, LobsSubOper subO
allocMemSize = MINOF(lobMaxChunkMemSize, inputSize);
if (subOperation == Lob_File)
{
+ str_sprintf(logBuf,"reading source file %s allocMemSize : %Ld, readOffset:%Ld", source,allocMemSize,readOffset);
+ lobDebugInfo(logBuf, 0,__LINE__,lobTrace_);
err = readSourceFile(source, inputAddr, allocMemSize, readOffset);
if (err != LOB_OPER_OK)
- return err;
+ {
+ lobDebugInfo("readSouceFile returned an error",0,__LINE__,lobTrace_);
+ return err;
+ }
}
else
{ // in memory
@@ -721,6 +776,8 @@ Ex_Lob_Error ExLob::writeLobData(char *source, Int64 sourceLen, LobsSubOper subO
err = writeData(writeOffset, inputAddr, allocMemSize, operLen);
if (err != LOB_OPER_OK)
{
+ str_sprintf(logBuf,"::writeData returned error .writeOffset:%Ld, allocMemSize:%Ld, operLen %Ld ", writeOffset,allocMemSize,operLen);
+ lobDebugInfo(logBuf, 0,__LINE__,lobTrace_);
//handle errors that happen in one of the chunks.
return err;
}
@@ -729,15 +786,19 @@ Ex_Lob_Error ExLob::writeLobData(char *source, Int64 sourceLen, LobsSubOper subO
readOffset = readOffset+allocMemSize;
inputSize = inputSize-lobMaxChunkMemSize;
getLobGlobalHeap()->deallocateMemory(inputAddr);
+ str_sprintf(logBuf,"Bookkeeping for Lob_File source.writeOffset:%Ld, readOffset:%Ld, inputSize: %Ld ", writeOffset,readOffset, inputSize);
+ lobDebugInfo(logBuf, 0,__LINE__,lobTrace_);
}
else
{
writeOffset = writeOffset+allocMemSize;
inputSize = inputSize-lobMaxChunkMemSize;
inputAddr = inputAddr+allocMemSize;
+ str_sprintf(logBuf,"Bookkeeping for Lob_Memory source. writeOffset:%Ld, inputSize: %Ld ", writeOffset, inputSize);
+ lobDebugInfo(logBuf, 0,__LINE__,lobTrace_);
}
}
-
+ lobDebugInfo("Leaving ExLob::writeLobData",0,__LINE__,lobTrace_);
hdfsCloseFile(fs_, fdData_);
fdData_=NULL;
return err;
@@ -753,7 +814,8 @@ Ex_Lob_Error ExLob::readToMem(char *memAddr, Int64 size, Int64 &operLen,char *
operLen = 0;
ExLobDesc desc;
Int64 sizeToRead = 0;
-
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::readToMem",0,__LINE__,lobTrace_);
err = getDesc(desc,handleIn,handleInLen,blackBox, &blackBoxLen,handleOut,handleOutLen,transId);
if (err != LOB_OPER_OK)
@@ -764,9 +826,12 @@ Ex_Lob_Error ExLob::readToMem(char *memAddr, Int64 size, Int64 &operLen,char *
if (blackBoxLen == -1)
{
+ lobDebugInfo("Reading multiple chunks",0,__LINE__,lobTrace_);
sizeToRead = size;
multipleChunks = TRUE;
}
+ str_sprintf(logBuf,"sizeToRead:%Ld, desc.size :%Ld", sizeToRead, desc.getSize());
+ lobDebugInfo(logBuf, 0,__LINE__,lobTrace_);
err = readDataToMem(memAddr, desc.getOffset(),sizeToRead, operLen, handleIn,handleInLen, multipleChunks,transId);
return err;
@@ -801,6 +866,8 @@ LobInputOutputFileType ExLob::fileType(char *ioFileName)
}
Ex_Lob_Error ExLob::readToFile(char *tgtFileName, Int64 tgtLength, Int64 &operLen, Int64 lobMaxChunkMemLen, Int32 fileflags,char *handleIn,Int32 handleInLen, char *blackBox, Int32 blackBoxLen, char * handleOut, Int32 &handleOutLen, Int64 transId)
{
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::readToFile",0,__LINE__,lobTrace_);
Ex_Lob_Error err = LOB_OPER_OK;
Int64 srcOffset = 0;
Int64 srcLength = 0;
@@ -812,6 +879,7 @@ Ex_Lob_Error ExLob::readToFile(char *tgtFileName, Int64 tgtLength, Int64 &operLe
return err;
if (blackBoxLen == -1) // mxlobsrvr returned -1 indicating multiple chunks for this particular lob handle
{
+ lobDebugInfo("Reading multiple chunks",0,__LINE__,lobTrace_);
multipleChunks = TRUE;
//the data retrieval in chunks is handled in readDataToMem.
}
@@ -857,6 +925,9 @@ Ex_Lob_Error ExLob::append(char *data, Int64 size, LobsSubOper so, Int64 headDes
Int32 clierr = 0;
Int32 chunkNum = 0;
Int64 outDescPartnKey, outDescSyskey = 0;
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::append",0,__LINE__,lobTrace_);
+
if (so == Lob_File)
{
err = statSourceFile(data, sourceLen);
@@ -870,7 +941,7 @@ Ex_Lob_Error ExLob::append(char *data, Int64 size, LobsSubOper so, Int64 headDes
err = allocateDesc((unsigned int)sourceLen, dummyParam, dataOffset, lobMaxSize,lobMaxChunkMemSize,handleIn, handleInLen,lobGCLimit,lobGlobals);
if (err != LOB_OPER_OK)
return err;
-
+ lobDebugInfo("Calling cli LOB_CLI_INSERT_APPEND",0,__LINE__,lobTrace_);
clierr = SQL_EXEC_LOBcliInterface(handleIn, handleInLen,
0, &chunkNum,
handleOut, &handleOutLen,
@@ -878,11 +949,13 @@ Ex_Lob_Error ExLob::append(char *data, Int64 size, LobsSubOper so, Int64 headDes
&dataOffset, &sourceLen,
&outDescPartnKey, &outDescSyskey,
0,
- 0);
+ 0,lobTrace_);
if (clierr < 0 || clierr == 100) { // some error or EOD.
- return LOB_DESC_APPEND_ERROR;
+ str_sprintf(logBuf,"cli LOB_CLI_INSERT_APPEND returned :%d", clierr);
+ lobDebugInfo(logBuf, 0,__LINE__,lobTrace_);
+ return LOB_DESC_APPEND_ERROR;
}
char *inputAddr = data;
@@ -890,9 +963,13 @@ Ex_Lob_Error ExLob::append(char *data, Int64 size, LobsSubOper so, Int64 headDes
{
inputAddr = (char *)(*(long *)data);
}
+ str_sprintf(logBuf,"Calling writeLobData: inputAddr: %Ld, InputSize%Ld, tgtOffset:%Ld",(long)inputAddr,sourceLen,dataOffset);
err = writeLobData(inputAddr, sourceLen,so,dataOffset,operLen,lobMaxChunkMemSize);
if (err != LOB_OPER_OK)
- return err;
+ {
+ lobDebugInfo("writeLobData returned error",0,__LINE__,lobTrace_);
+ return err;
+ }
return LOB_OPER_OK;
}
Ex_Lob_Error ExLob::insertData(char *data, Int64 size, LobsSubOper so,Int64 headDescNum, Int64 &operLen, Int64 lobMaxSize, Int64 lobMaxChunkMemSize,char * handleIn, Int32 handleInLen, char *blackBox, Int32 blackBoxLen, char * handleOut, Int32 &handleOutLen, void *lobGlobals)
@@ -901,14 +978,17 @@ Ex_Lob_Error ExLob::insertData(char *data, Int64 size, LobsSubOper so,Int64 head
ExLobDesc desc;
int clierr = 0;
operLen = 0;
-
- // get offset and input size from desc (the one that was just inserted into the descriptor handle table)
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::InsertData",0,__LINE__,lobTrace_);
+ str_sprintf(logBuf,"data:%Ld, size %Ld, lobMaxSize:%Ld, lobMaxChunkMemSize:%Ld", (long)data, size,lobMaxSize,lobMaxChunkMemSize);
- err = getDesc(desc,handleIn,handleInLen,blackBox, &blackBoxLen,handleOut,handleOutLen,0);
-
-
+ // get offset and input size from desc (the one that was just
+ // inserted into the descriptor handle table)
+ err = getDesc(desc,handleIn,handleInLen,blackBox, &blackBoxLen,handleOut,handleOutLen,0);
+
if (err !=LOB_OPER_OK) { // some error or EOD.
+ lobDebugInfo("getDesc returned error",0,__LINE__,lobTrace_);
return LOB_DESC_READ_ERROR;
}
@@ -923,10 +1003,15 @@ Ex_Lob_Error ExLob::insertData(char *data, Int64 size, LobsSubOper so,Int64 head
}
Int64 inputSize = desc.getSize();
Int64 tgtOffset = desc.getOffset();
+ str_sprintf(logBuf,"Calling writeLobData: inputAddr: %Ld, InputSize%Ld, tgtOffset:%Ld",(long)inputAddr,inputSize,tgtOffset);
+
+ lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
err = writeLobData(inputAddr, inputSize,so, tgtOffset,
operLen,lobMaxChunkMemSize);
- if (err != LOB_OPER_OK)
+ if (err != LOB_OPER_OK){
+ lobDebugInfo("writeLobData returned error",0,__LINE__,lobTrace_);
return err;
+ }
return LOB_OPER_OK;
}
Ex_Lob_Error ExLob::update(char *data, Int64 size, LobsSubOper so,Int64 headDescNum, Int64 &operLen, Int64 lobMaxSize, Int64 lobMaxChunkMemSize, Int64 lobGCLimit, char *handleIn, Int32 handleInLen, char *handleOut, Int32 &handleOutLen, void *lobGlobals)
@@ -938,8 +1023,13 @@ Ex_Lob_Error ExLob::update(char *data, Int64 size, LobsSubOper so,Int64 headDesc
Int32 clierr = 0;
Int64 outDescPartnKey,outDescSyskey = 0;
Int32 chunkNum = 0;
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::update",0,__LINE__,lobTrace_);
if (so == Lob_File)
{
+ str_sprintf(logBuf,"Calling statSourceFile: source:%s, sourceLen: %Ld",
+ data,sourceLen);
+ lobDebugInfo(logBuf, 0,__LINE__,lobTrace_);
err = statSourceFile(data, sourceLen);
if (err != LOB_OPER_OK)
return err;
@@ -948,10 +1038,11 @@ Ex_Lob_Error ExLob::update(char *data, Int64 size, LobsSubOper so,Int64 headDesc
{
return LOB_MAX_LIMIT_ERROR; //exceeded the size of the max lob size
}
+ lobDebugInfo("Calling allocateDesc",0,__LINE__,lobTrace_);
err = allocateDesc((unsigned int)sourceLen, dummyParam, dataOffset, lobMaxSize, lobMaxChunkMemSize, handleIn, handleInLen, lobGCLimit,lobGlobals);
if (err != LOB_OPER_OK)
return err;
-
+ lobDebugInfo("Calling CLI LOB_CLI_UPDATE_UNIQUE",0,__LINE__,lobTrace_);
clierr = SQL_EXEC_LOBcliInterface(handleIn,
handleInLen,
0, &chunkNum,
@@ -960,9 +1051,10 @@ Ex_Lob_Error ExLob::update(char *data, Int64 size, LobsSubOper so,Int64 headDesc
&dataOffset, &sourceLen,
&outDescPartnKey, &outDescSyskey,
0,
- 0);
+ 0,lobTrace_);
if (clierr < 0 || clierr == 100) { // some error or EOD.
+
return LOB_DESC_UPDATE_ERROR;
}
char *inputAddr = data;
@@ -970,10 +1062,16 @@ Ex_Lob_Error ExLob::update(char *data, Int64 size, LobsSubOper so,Int64 headDesc
{
inputAddr = (char *)(*(long *)data);
}
-
+ str_sprintf(logBuf,"Calling writeLobData.sourceLen:%Ld, dataOffset:%Ld",sourceLen,dataOffset);
+ lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
+
err = writeLobData(inputAddr, sourceLen,so,dataOffset,operLen,lobMaxChunkMemSize);
- if (err != LOB_OPER_OK)
- return err;
+ str_sprintf(logBuf,"writeLobData returned. operLen:%Ld",operLen);
+ lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
+ if (err != LOB_OPER_OK){
+ lobDebugInfo("writeLobData Failed",0,__LINE__,lobTrace_);
+ return err;
+ }
return LOB_OPER_OK;
}
@@ -991,7 +1089,7 @@ Ex_Lob_Error ExLob::delDesc(char *handleIn, Int32 handleInLen, Int64 transId)
&dummyParam, &dummyParam,
&dummyParam, &dummyParam,
0,
- transId);
+ transId,lobTrace_);
if (clierr < 0)
return LOB_DESC_FILE_DELETE_ERROR;
@@ -1002,9 +1100,11 @@ Ex_Lob_Error ExLob::delDesc(char *handleIn, Int32 handleInLen, Int64 transId)
Ex_Lob_Error ExLob::purgeLob()
{
-
+ char logBuf[4096];
if (hdfsDelete(fs_, lobDataFile_, 0) != 0)
{
+ str_sprintf(logBuf,"hdfsDelete of %s returned error",lobDataFile_);
+ lobDebugInfo(lobDataFile_,0,__LINE__,lobTrace_);
return LOB_DATA_FILE_DELETE_ERROR;
}
@@ -1018,18 +1118,20 @@ Ex_Lob_Error ExLob::openCursor(char *handleIn, Int32 handleInLen,Int64 transId)
Int32 clierr;
Int64 dummyParam = 0;
void *cliInterface = NULL;
-
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::openCursor",0,__LINE__,lobTrace_);
clierr = SQL_EXEC_LOBcliInterface(handleIn,
handleInLen,
0, 0,
- (char *)&dummyParam, (Lng32 *)&dummyParam,
- LOB_CLI_SELECT_CURSOR, LOB_CLI_ExecImmed,
- &dummyParam, &dummyParam,
- &dummyParam, &dummyParam,
- &cliInterface,
- transId);
+ (char *)&dummyParam, (Lng32 *)&dummyParam,
+ LOB_CLI_SELECT_CURSOR, LOB_CLI_ExecImmed,
+ &dummyParam, &dummyParam,
+ &dummyParam, &dummyParam,
+ &cliInterface,
+ transId,lobTrace_);
if (clierr <0 ) {
+ str_sprintf(logBuf,"openCursor returned cliErr %d",clierr);
return LOB_DESC_READ_ERROR;
}
@@ -1042,6 +1144,7 @@ Ex_Lob_Error ExLob::openCursor(char *handleIn, Int32 handleInLen,Int64 transId)
cursor.eor_ = false;
cursor.eol_ = false;
+
lobCursors_it it = lobCursors_.find(string(handleIn, handleInLen));
if (it == lobCursors_.end())
@@ -1053,7 +1156,6 @@ Ex_Lob_Error ExLob::openCursor(char *handleIn, Int32 handleInLen,Int64 transId)
{
it->second = cursor;
}
-
return LOB_OPER_OK;
}
@@ -1145,9 +1247,9 @@ Ex_Lob_Error ExLob::readCursor(char *tgt, Int64 tgtSize, char *handleIn, Int32 h
int dataOffset;
Ex_Lob_Error result;
cursor_t cursor;
-
+ char logBuf[4096];
lobCursors_it it = lobCursors_.find(string(handleIn, handleInLen));
-
+ lobDebugInfo("In ExLob::readCursor",0,__LINE__,lobTrace_);
if (it == lobCursors_.end())
{
return LOB_CURSOR_NOT_OPEN;
@@ -1156,7 +1258,8 @@ Ex_Lob_Error ExLob::readCursor(char *tgt, Int64 tgtSize, char *handleIn, Int32 h
{
cursor = it->second;
}
-
+ str_sprintf(logBuf,"ExLob::readCursor:: cliInterface:%Ld,bytesRead_:%Ld,descOffset_:%LddescSize_:%Ld,eod_:%d,eor_:%d,eol_:%d,",(long)cursor.cliInterface_,cursor.bytesRead_,cursor.descOffset_,cursor.descSize_,cursor.eod_,cursor.eor_,cursor.eol_);
+ lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
if (cursor.eod_) {
// remove cursor from the map.
// server has already closed the cursor.
@@ -1165,7 +1268,7 @@ Ex_Lob_Error ExLob::readCursor(char *tgt, Int64 tgtSize, char *handleIn, Int32 h
operLen = 0;
return LOB_OPER_OK;
}
-
+
result = readCursorData(tgt, tgtSize, cursor, operLen, handleIn,handleInLen,transId); // increments cursor
if (result != LOB_OPER_OK)
@@ -1181,9 +1284,12 @@ Ex_Lob_Error ExLob::readCursor(char *tgt, Int64 tgtSize, char *handleIn, Int32 h
Ex_Lob_Error ExLob::closeCursor(char *handleIn, Int32 handleInLen)
{
- lobCursors_it it = lobCursors_.find(string(handleIn, handleInLen));
- if (it != lobCursors_.end())
+ char logBuf[4096];
+ lobCursors_it it = lobCursors_.find(string(handleIn, handleInLen));
+ if (it != lobCursors_.end())
{
+ str_sprintf(logBuf,"closing cursor for handle");
+ lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
lobCursors_.erase(it);
}
return LOB_OPER_OK;
@@ -1235,41 +1341,50 @@ Ex_Lob_Error ExLob::allocateDesc(ULng32 size, Int64 &descNum, Int64 &dataOffset,
Int64 dummyParam = 0;
if (size > lobMaxSize)
return LOB_MAX_LIMIT_ERROR;
-
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::allocateDesc",0,__LINE__,lobTrace_);
Int32 openFlags = O_RDONLY ;
- fdData_ = hdfsOpenFile(fs_, lobDataFile_, O_RDONLY, 0, 0,0);
- if (!fdData_) {
- hdfsCloseFile(fs_,fdData_);
- fdData_ = NULL;
- return LOB_DATA_FILE_OPEN_ERROR;
- }
- hdfsFileInfo *fInfo = hdfsGetPathInfo(fs_, lobDataFile_);
- if (fInfo)
- dataOffset = fInfo->mSize;
+
+ hdfsFileInfo *fInfo = hdfsGetPathInfo(fs_, lobDataFile_);
+ if (fInfo)
+ dataOffset = fInfo->mSize;
- if (dataOffset > lobGCLimit) // 5 GB default
- {
- GCDone = TRUE;
- /* Int32 rc = SQL_EXEC_LOBcliInterface(handleIn, handleInLen,
- 0,0,
- (char *)dummyParam, (Lng32 *)&dummyParam,
- LOB_CLI_PERFORM_LOB_GC, LOB_CLI_ExecImmed,
- &dummyParam, &dummyParam,
- &dummyParam, &dummyParam,
- NULL,
- 0); //don't pass transid */
- Int32 rc = SQL_EXEC_LOB_GC_Interface(lobGlobals,handleIn,handleInLen,
- hdfsServer_,hdfsPort_,
- lobLocation_,
- lobMaxChunkMemLen);
+ if (dataOffset > lobGCLimit) // 5 GB default
+ {
+ str_sprintf(logBuf,"Starting GC. Current Offset : %Ld",dataOffset);
+ lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
- }
- if (GCDone) // recalculate the new offset
- fInfo = hdfsGetPathInfo(fs_, lobDataFile_);
+
+ Int32 rc = SQL_EXEC_LOB_GC_Interface(lobGlobals,handleIn,handleInLen,
+ hdfsServer_,hdfsPort_,
+ lobLocation_,
+ lobMaxChunkMemLen,lobTrace_);
+
+ if (rc<0)
+ {
+ lobDebugInfo("GC failed",0,__LINE__,lobTrace_);
+ GCDone = FALSE;
+ }
+ else
+ GCDone = TRUE;
+
+
+ }
+ if (GCDone) // recalculate the new offset
+ {
+ hdfsFreeFileInfo(fInfo, 1);
+ fInfo = hdfsGetPathInfo(fs_, lobDataFile_);
+ }
+
if (fInfo)
dataOffset = fInfo->mSize;
-
-
+ if (GCDone)
+ str_sprintf(logBuf,"Done GC. Allocating new Offset %Ld in %s",
+ dataOffset,lobDataFile_);
+ else
+ str_sprintf(logBuf,"Allocating new Offset %Ld in %s ",
+ dataOffset,lobDataFile_);
+ lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
//Find the last offset in the file
// dataOffset = hdfsTell(fs_,fdData_); //commenting out.hdfsTell always returns 0 !!
@@ -1278,12 +1393,17 @@ Ex_Lob_Error ExLob::allocateDesc(ULng32 size, Int64 &descNum, Int64 &dataOffset,
Ex_Lob_Error ExLob::compactLobDataFile(ExLobInMemoryDescChunksEntry *dcArray,Int32 numEntries)
{
Ex_Lob_Error rc = LOB_OPER_OK;
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::compactLobDataFile",0,__LINE__,lobTrace_);
Int64 maxMemChunk = 1024*1024*1024; //1GB limit for intermediate buffer for transfering data
char * saveLobDataFile = new(getLobGlobalHeap()) char[MAX_LOB_FILE_NAME_LEN+6];
str_sprintf(saveLobDataFile, "%s_save",lobDataFile_);
char * tmpLobDataFile = new(getLobGlobalHeap()) char[MAX_LOB_FILE_NAME_LEN+5];
str_sprintf(tmpLobDataFile, "%s_tmp",lobDataFile_);
+ str_sprintf(logBuf,"DataFile %s, TempDataFile : %s, SaveDataFile : %s ",lobDataFile_,tmpLobDataFile, saveLobDataFile);
+
+ lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
hdfsFS fs = hdfsConnect(hdfsServer_,hdfsPort_);
if (fs == NULL)
return LOB_DATA_FILE_OPEN_ERROR;
@@ -1291,7 +1411,9 @@ Ex_Lob_Error ExLob::compactLobDataFile(ExLobInMemoryDescChunksEntry *dcArray,Int
hdfsFile fdData = hdfsOpenFile(fs, lobDataFile_, O_RDONLY, 0, 0,0);
if (!fdData)
- {
+ {
+ str_sprintf(logBuf,"Could not open file:%s",lobDataFile_);
+ lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
hdfsCloseFile(fs,fdData);
fdData = NULL;
return LOB_DATA_FILE_OPEN_ERROR;
@@ -1300,6 +1422,8 @@ Ex_Lob_Error ExLob::compactLobDataFile(ExLobInMemoryDescChunksEntry *dcArray,Int
hdfsFile fdTemp = hdfsOpenFile(fs, tmpLobDataFile,O_WRONLY|O_CREAT,0,0,0);
if (!fdTemp)
{
+ str_sprintf(logBuf,"Could not open file:%s",tmpLobDataFile);
+ lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
hdfsCloseFile(fs,fdTemp);
fdTemp = NULL;
return LOB_DATA_FILE_OPEN_ERROR;
@@ -1322,12 +1446,14 @@ Ex_Lob_Error ExLob::compactLobDataFile(ExLobInMemoryDescChunksEntry *dcArray,Int
bytesRead = hdfsPread(fs,fdData,dcArray[i].getCurrentOffset(),tgt,maxMemChunk);
if (bytesRead != maxMemChunk)
{
+ lobDebugInfo("Problem reading from data file",0,__LINE__,lobTrace_);
getLobGlobalHeap()->deallocateMemory(tgt);
return LOB_DATA_READ_ERROR;
}
bytesWritten = hdfsWrite(fs,fdTemp, tgt,maxMemChunk);
if (bytesWritten != size)
{
+ lobDebugInfo("Problem writing temp data file",0,__LINE__,lobTrace_);
getLobGlobalHeap()->deallocateMemory(tgt);
return LOB_TARGET_FILE_WRITE_ERROR;
}
@@ -1341,30 +1467,34 @@ Ex_Lob_Error ExLob::compactLobDataFile(ExLobInMemoryDescChunksEntry *dcArray,Int
bytesRead = hdfsPread(fs,fdData,dcArray[i].getCurrentOffset(),tgt,chunkLen);
if (bytesRead != chunkLen)
{
+ lobDebugInfo("Problem reading from data file",0,__LINE__,lobTrace_);
getLobGlobalHeap()->deallocateMemory(tgt);
return LOB_DATA_READ_ERROR;
}
bytesWritten = hdfsWrite(fs,fdTemp, tgt,chunkLen);
if (bytesWritten != chunkLen)
{
+ lobDebugInfo("Problem writing to temp data file",0,__LINE__,lobTrace_);
getLobGlobalHeap()->deallocateMemory(tgt);
return LOB_TARGET_FILE_WRITE_ERROR;
}
}
if (hdfsFlush(fs, fdTemp)) {
+ lobDebugInfo("Problem flushing to temp data file",0,__LINE__,lobTrace_);
return LOB_DATA_FLUSH_ERROR;
}
getLobGlobalHeap()->deallocateMemory(tgt);
i++;
}
hdfsCloseFile(fs,fdTemp);
- hdfsCloseFile(fs,fdData);
+ hdfsCloseFile(fs,fdData);
//Now save the data file and rename the tempfile to the original datafile
Int32 rc2 = hdfsRename(fs,lobDataFile_,saveLobDataFile);
if (rc2 == -1)
{
+ lobDebugInfo("Problem renaming datafile to save data file",0,__LINE__,lobTrace_);
NADELETEBASIC(saveLobDataFile,getLobGlobalHeap());
NADELETEBASIC(tmpLobDataFile,getLobGlobalHeap());
return LOB_DATA_FILE_WRITE_ERROR;
@@ -1372,6 +1502,7 @@ Ex_Lob_Error ExLob::compactLobDataFile(ExLobInMemoryDescChunksEntry *dcArray,Int
rc2 = hdfsRename(fs,tmpLobDataFile, lobDataFile_);
if (rc2 == -1)
{
+ lobDebugInfo("Problem renaming temp datafile to data file",0,__LINE__,lobTrace_);
NADELETEBASIC(saveLobDataFile,getLobGlobalHeap());
NADELETEBASIC(tmpLobDataFile,getLobGlobalHeap());
return LOB_DATA_FILE_WRITE_ERROR;
@@ -1384,7 +1515,7 @@ Ex_Lob_Error ExLob::compactLobDataFile(ExLobInMemoryDescChunksEntry *dcArray,Int
Ex_Lob_Error ExLob::restoreLobDataFile()
{
Ex_Lob_Error rc = LOB_OPER_OK;
-
+ lobDebugInfo("In ExLob::restoreLobDataFile",0,__LINE__,lobTrace_);
hdfsFS fs = hdfsConnect(hdfsServer_,hdfsPort_);
if (fs == NULL)
@@ -1395,6 +1526,7 @@ Ex_Lob_Error ExLob::restoreLobDataFile()
rc2 = hdfsRename(fs,saveLobDataFile, lobDataFile_);
if (rc2)
{
+ lobDebugInfo("Problem renaming savedatafile to data file",0,__LINE__,lobTrace_);
NADELETEBASIC(saveLobDataFile,getLobGlobalHeap());
return LOB_OPER_ERROR;
}
@@ -1406,7 +1538,7 @@ Ex_Lob_Error ExLob::restoreLobDataFile()
Ex_Lob_Error ExLob::purgeBackupLobDataFile()
{
Ex_Lob_Error rc = LOB_OPER_OK;
-
+ lobDebugInfo("In ExLob::purgeBackupLobDataFile",0,__LINE__,lobTrace_);
hdfsFS fs = hdfsConnect(hdfsServer_,hdfsPort_);
if (fs == NULL)
return LOB_DATA_FILE_OPEN_ERROR;
@@ -1465,6 +1597,8 @@ Ex_Lob_Error ExLob::readCursorData(char *tgt, Int64 tgtSize, cursor_t &cursor, I
NABoolean isEOD=FALSE;
Int64 outOffset = 0;
Int64 outSize = 0;
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::readCursorData",0,__LINE__,lobTrace_);
while ( (operLen < tgtSize) && !cursor.eod_ )
{
@@ -1506,7 +1640,9 @@ Ex_Lob_Error ExLob::readCursorData(char *tgt, Int64 tgtSize, cursor_t &cursor, I
clock_gettime(CLOCK_MONOTONIC, &startTime);
bytesRead = hdfsPread(fs_, fdData_, offset, tgt, bytesToCopy);
-
+ str_sprintf(logBuf,"After hdfsPread: BytesToCopy:%Ld, Offset:%Ld, tgt:%Ld, BytesRead :%Ld",
+ bytesToCopy,offset,(long)tgt,bytesRead);
+ lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
clock_gettime(CLOCK_MONOTONIC, &endTime);
Int64 secs = endTime.tv_sec - startTime.tv_sec;
@@ -1546,10 +1682,11 @@ Ex_Lob_Error ExLob::readDataToMem(char *memAddr,
Ex_Lob_Error err = LOB_OPER_OK;
operLen = 0;
Int64 bytesRead = 0;
-
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::readToMem",0,__LINE__,lobTrace_);
if (multipleChunks)
{
-
+ lobDebugInfo("Reading in multiple chunks",0,__LINE__,lobTrace_);
err = openCursor(handleIn,
handleLenIn,transId);
//now we can fetch the descriptors for each chunk
@@ -1581,11 +1718,14 @@ Ex_Lob_Error ExLob::readDataToMem(char *memAddr,
if (!multipleChunks)
{
+ lobDebugInfo("Reading in single chunk",0,__LINE__,lobTrace_);
if ((bytesRead = hdfsPread(fs_, fdData_, offset,
memAddr, size)) == -1) {
return LOB_DATA_READ_ERROR;
- }
+ }
+ str_sprintf(logBuf,"After hdfsPread: File:%s, Offset:%Ld, Size:%Ld,Target Mem Addr:%Ld",lobDataFile_,offset,size,memAddr);
+ lobDebugInfo(logBuf,0,__LINE__,lobTrace_);
operLen = bytesRead;
return LOB_OPER_OK;
}
@@ -1616,7 +1756,8 @@ Ex_Lob_Error ExLob::readDataToLocalFile(char *fileName, Int64 offset, Int64 siz
Int64 tgtOffset = 0;
char *lobData = 0;
Int64 chunkSize = 0;
-
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::readDataToLocalFile",0,__LINE__,lobTrace_);
if (srcLen <=0)
return LOB_SOURCE_DATA_ALLOC_ERROR;
// open the target file for writing
@@ -1650,7 +1791,7 @@ Ex_Lob_Error ExLob::readDataToLocalFile(char *fileName, Int64 offset, Int64 siz
}
if ((srcLen < lobMaxChunkMemSize) && (multipleChunks ==FALSE)) // simple single I/O case
{
-
+ lobDebugInfo("Reading in single chunk",0,__LINE__,lobTrace_);
lobData = (char *) (getLobGlobalHeap())->allocateMemory(srcLen);
if (lobData == NULL)
@@ -1674,6 +1815,7 @@ Ex_Lob_Error ExLob::readDataToLocalFile(char *fileName, Int64 offset, Int64 siz
}
else // multiple chunks to read
{
+ lobDebugInfo("Reading in multiple chunks into local file",0,__LINE__,lobTrace_);
err = openCursor(handleIn,
handleInLen,transId);
if (err != LOB_OPER_OK)
@@ -1727,7 +1869,8 @@ Ex_Lob_Error ExLob::readDataToHdfsFile(char *tgtFileName, Int64 offset, Int64 s
char *lobData = 0;
Int64 chunkSize = 0;
hdfsFile fdTgtFile;
-
+ char logBuf[4096];
+ lobDebugInfo("In ExLob::readDataToHdfsFile",0,__LINE__,lobTrace_);
// open and write to the target file
int openFlags = O_WRONLY;
if ((LobTgtFileFlags)fileflags == Lob_Append_Or_Error )
@@ -1765,6 +1908,7 @@ Ex_Lob_Error ExLob::readDataToHdfsFile(char *tgtFileName, Int64 offset, Int64 s
if ((srcLen < lobMaxChunkMemLen) && (multipleChunks ==FALSE)) // simple single I/O case
{
+ lobDebugInfo("Reading in single chunk",0,__LINE__,lobTrace_);
lobData = (char *) (getLobGlobalHeap())->allocateMemory(srcLen);
if (lobData == NULL)
@@ -1793,6 +1937,7 @@ Ex_Lob_Error ExLob::readDataToHdfsFile(char *tgtFileName, Int64 offset, Int64 s
}
else
{// multiple chunks to read
+ lobDebugInfo("Reading in multiple chunks into local file",0,__LINE__,lobTrace_);
err = openCursor(handleIn,
handleInLen,
transId);
@@ -1966,7 +2111,12 @@ Ex_Lob_Error ExLobsOper (
err = lobPtr->initialize(fileName, (operation == Lob_Create) ? EX_LOB_CREATE : EX_LOB_RW, dir, storage, hdfsServer, hdfsPort, dir,bufferSize, replication, blockSize,lobMaxSize,lobGlobals);
if (err != LOB_OPER_OK)
- return err;
+ {
+ char buf[5000];
+ str_sprintf(buf,"Lob initialization failed;filename:%s;location:%s;hdfsserver:%s;hdfsPort:%d;lobMaxSize:%Ld",fileName,dir,hdfsServer,lobMaxSize);
+ lobDebugInfo(buf,err,__LINE__,lobGlobals->lobTrace_);
+ return err;
+ }
lobMap->insert(pair<string, ExLob*>(string(fileName), lobPtr));
}
@@ -1975,6 +2125,7 @@ Ex_Lob_Error ExLobsOper (
lobPtr = it->second;
}
+ lobPtr->lobTrace_ = lobGlobals->lobTrace_;
}
/*
// **Note** This is code that needs to get called before sneding a request to the
@@ -2001,10 +2152,18 @@ Ex_Lob_Error ExLobsOper (
case Lob_InsertDesc:
err = lobPtr->writeDesc(sourceLen, source, subOperation, descNumOut, retOperLen, lobMaxSize, lobMaxChunkMemSize,lobGCLimit,handleIn,handleInLen,(char *)blackBox, &blackBoxLen,handleOut,handleOutLen,lobGlobals);
+ if (err != LOB_OPER_OK)
+ {
+ lobDebugInfo("writeDesc failed ",err,__LINE__,lobGlobals->lobTrace_);
+ }
break;
case Lob_InsertData:
err = lobPtr->insertData(source, sourceLen, subOperation, descNumIn, retOperLen, lobMaxSize,lobMaxChunkMemSize,handleIn,handleInLen,(char *)blackBox, blackBoxLen,handleOut,handleOutLen,lobGlobals);
+ if (err != LOB_OPER_OK)
+ {
+ lobDebugInfo("insertData failed ",err,__LINE__,lobGlobals->lobTrace_);
+ }
break;
case Lob_InsertDataSimple:
@@ -2014,9 +2173,21 @@ Ex_Lob_Error ExLobsOper (
case Lob_Read:
if (subOperation == Lob_Memory)
- err = lobPtr->readToMem(source,sourceLen,retOperLen,handleIn,handleInLen,(char *)blackBox, blackBoxLen,handleOut,handleOutLen,transId);
+ {
+ err = lobPtr->readToMem(source,sourceLen,retOperLen,handleIn,handleInLen,(char *)blackBox, blackBoxLen,handleOut,handleOutLen,transId);
+ if (err != LOB_OPER_OK)
+ {
+ lobDebugInfo("readToMem failed ",err,__LINE__,lobGlobals->lobTrace_);
+ }
+ }
else if (subOperation == Lob_File)
- err = lobPtr->readToFile(source, sourceLen, retOperLen, lobMaxChunkMemSize, openType,handleIn,handleInLen,(char *)blackBox, blackBoxLen,handleOut,handleOutLen,transId);
+ {
+ err = lobPtr->readToFile(source, sourceLen, retOperLen, lobMaxChunkMemSize, openType,handleIn,handleInLen,(char *)blackBox, blackBoxLen,handleOut,handleOutLen,transId);
+ if (err != LOB_OPER_OK)
+ {
+ lobDebugInfo("readToFile failed ",err,__LINE__,lobGlobals->lobTrace_);
+ }
+ }
else
err = LOB_SUBOPER_ERROR;
break;
@@ -2080,18 +2251,42 @@ Ex_Lob_Error ExLobsOper (
case Lob_Append:
if ((subOperation == Lob_Memory) ||(subOperation == Lob_Buffer))
- err = lobPtr->append(source, sourceLen, subOperation, descNumIn, retOperLen,lobMaxSize, lobMaxChunkMemSize,lobGCLimit,handleIn,handleInLen,handleOut,handleOutLen,lobGlobals);
+ {
+ err = lobPtr->append(source, sourceLen, subOperation, descNumIn, retOperLen,lobMaxSize, lobMaxChunkMemSize,lobGCLimit,handleIn,handleInLen,handleOut,handleOutLen,lobGlobals);
+ if (err != LOB_OPER_OK)
+ {
+ lobDebugInfo("append(Memory,Buffer) failed ",err,__LINE__,lobGlobals->lobTrace_);
+ }
+ }
else if (subOperation == Lob_File)
- err = lobPtr->append(source, -1, subOperation, descNumIn, retOperLen,lobMaxSize, lobMaxChunkMemSize,lobGCLimit,handleIn,handleInLen,handleOut,handleOutLen,lobGlobals);
+ {
+ err = lobPtr->append(source, -1, subOperation, descNumIn, retOperLen,lobMaxSize, lobMaxChunkMemSize,lobGCLimit,handleIn,handleInLen,handleOut,handleOutLen,lobGlobals);
+ if (err != LOB_OPER_OK)
+ {
+ lobDebugInfo("append(File) failed ",err,__LINE__,lobGlobals->lobTrace_);
+ }
+ }
else
err = LOB_SUBOPER_ERROR;
break;
case Lob_Update:
if ((subOperation == Lob_Memory)||(subOperation == Lob_Buffer))
- err = lobPtr->update(source, sourceLen, subOperation, descNumIn, retOperLen, lobMaxSize, lobMaxChunkMemSize,lobGCLimit,handleIn,handleInLen,handleOut,handleOutLen,lobGlobals);
+ {
+ err = lobPtr->update(source, sourceLen, subOperation, descNumIn, retOperLen, lobMaxSize, lobMaxChunkMemSize,lobGCLimit,handleIn,handleInLen,handleOut,handleOutLen,lobGlobals);
+ if (err != LOB_OPER_OK)
+ {
+ lobDebugInfo("update(Memory,Buffer) failed ",err,__LINE__,lobGlobals->lobTrace_);
+ }
+ }
else if (subOperation == Lob_File)
- err = lobPtr->update(source, -1, subOperation,descNumIn, retOperLen,lobMaxSize, lobMaxChunkMemSize,lobGCLimit,handleIn,handleInLen,handleOut,handleOutLen,lobGlobals);
+ {
+ err = lobPtr->update(source, -1, subOperation,descNumIn, retOperLen,lobMaxSize, lobMaxChunkMemSize,lobGCLimit,handleIn,handleInLen,handleOut,handleOutLen,lobGlobals);
+ if (err != LOB_OPER_OK)
+ {
+ lobDebugInfo("update(Memory,Buffer) failed ",err,__LINE__,lobGlobals->lobTrace_);
+ }
+ }
else
err = LOB_SUBOPER_ERROR;
break;
@@ -2106,6 +2301,8 @@ Ex_Lob_Error ExLobsOper (
lobMap->erase(it);
delete lobPtr;
lobPtr = NULL;
+ if (err != LOB_OPER_OK)
+ lobDebugInfo("purgeLob failed ",err,__LINE__,lobGlobals->lobTrace_);
break;
case Lob_Purge:
@@ -2114,6 +2311,8 @@ Ex_Lob_Error ExLobsOper (
lobMap->erase(it);
delete lobPtr;
lobPtr = NULL;
+ if (err != LOB_OPER_OK)
+ lobDebugInfo("purgeLob failed ",err,__LINE__,lobGlobals->lobTrace_);
break;
@@ -2133,12 +2332,18 @@ Ex_Lob_Error ExLobsOper (
break;
case Lob_PerformGC:
err = lobPtr->compactLobDataFile((ExLobInMemoryDescChunksEntry *)source,sourceLen);
+ if (err != LOB_OPER_OK)
+ lobDebugInfo("compactLobDataFile failed ",err,__LINE__,lobGlobals->lobTrace_);
break;
case Lob_RestoreLobDataFile:
err = lobPtr->restoreLobDataFile();
+ if (err != LOB_OPER_OK)
+ lobDebugInfo("restoreLobDataFile failed ",err,__LINE__,lobGlobals->lobTrace_);
break;
case Lob_PurgeBackupLobDataFile:
err = lobPtr->purgeBackupLobDataFile();
+ if (err != LOB_OPER_OK)
+ lobDebugInfo("purgeBackupLobDataFile failed ",err,__LINE__,lobGlobals->lobTrace_);
break;
default:
err = LOB_OPER_ERROR;
@@ -2179,16 +2384,20 @@ void cleanupLOBDataDescFiles(const char *lobHdfsServer,int lobHdfsPort,const cha
{
int numExistingFiles=0;
hdfsFS fs;
+ int err = 0;
fs = hdfsConnect(lobHdfsServer, lobHdfsPort);
if (fs == NULL)
return;
// Get this list of all data and desc files in the lob sotrage location
hdfsFileInfo *fileInfos = hdfsListDirectory(fs, lobHdfsLoc, &numExistingFiles);
if (fileInfos == NULL)
- return ;
+ return ;
+
//Delete each one in a loop
- for (int i = 0; i < numExistingFiles; i++)
- hdfsDelete(fs, fileInfos[i].mName, 0);
+ for (int i = 0; i < numExistingFiles; i++)
+ {
+ err = hdfsDelete(fs, fileInfos[i].mName, 0);
+ }
// *Note* : delete the memory allocated by libhdfs for the file info array
if (fileInfos)
@@ -2601,6 +2810,7 @@ ExLobGlobals::ExLobGlobals() :
isCliInitialized_(FALSE),
isHive_(FALSE),
threadTraceFile_(NULL),
+ lobTrace_(FALSE),
heap_(NULL)
{
//initialize the log file
@@ -2610,6 +2820,8 @@ ExLobGlobals::ExLobGlobals() :
sprintf(logFileName,"trace_threads.%d",getpid());
threadTraceFile_ = fopen(logFileName,"a");
}
+ if(getenv("TRACE_LOB_ACTIONS"))
+ lobTrace_ = TRUE;
}
ExLobGlobals::~ExLobGlobals()
@@ -2955,6 +3167,23 @@ void ExLobGlobals::traceMessage(const char *logMessage, ExLobCursor *cursor,
}
+//Enable envvar TRACE_LOB_ACTIONS to enable tracing.
+//The output file will be in the masterexec.<pid> logs in the
+//$MY_SQROOT/logs directory on each node
+
+void lobDebugInfo(const char *logMessage,Int32 errorcode,
+ Int32 line, NABoolean lobTrace)
+{
+ if ( lobTrace)
+ {
+ NAString logString("LOB : ");
+ logString += logMessage;
+
+ SQLMXLoggingArea::logSQLMXDebugEvent(logString.data(),(short)errorcode,line);
+ }
+
+
+}
// ExLobRequest definitions
///////////////////////////////////////////////////////////////////////////////
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/bbe87c92/core/sql/exp/ExpLOBaccess.h
----------------------------------------------------------------------
diff --git a/core/sql/exp/ExpLOBaccess.h b/core/sql/exp/ExpLOBaccess.h
index bcdba44..452f769 100644
--- a/core/sql/exp/ExpLOBaccess.h
+++ b/core/sql/exp/ExpLOBaccess.h
@@ -483,7 +483,7 @@ class ExLob
ExLobStats *getStats() { return &stats_; }
NAHeap *getLobGlobalHeap() { return lobGlobalHeap_;}
ExLobRequest *getRequest() { return &request_; }
-
+
//The next 2 functions are not active at this point. They serve as an example
//on how to send requests across to the mxlobsrvr process from the master
//process
@@ -506,6 +506,7 @@ class ExLob
bool prefetchQueued_;
NAHeap *lobGlobalHeap_;
ExLobRequest request_;
+ NABoolean lobTrace_;
};
typedef map<string, ExLob *> lobMap_t;
@@ -563,7 +564,8 @@ class ExLobPreOpen
Int64 maxBytes_;
Int64 waited_;
};
-
+void lobDebugInfo(const char *logMessage,Int32 errorcode,
+ Int32 line, NABoolean lobTrace);
typedef list<ExLobPreOpen *> preOpenList_t;
typedef list<ExLobPreOpen *>::iterator preOpenList_it;
@@ -615,7 +617,8 @@ class ExLobGlobals
{
return heap_;
}
- void traceMessage(const char *logMessage, ExLobCursor *c, int line);
+ void traceMessage(const char *logMessage, ExLobCursor *c, int line);
+
public :
lobMap_t *lobMap_;
hdfsFS fs_;
@@ -632,6 +635,7 @@ class ExLobGlobals
NABoolean isHive_;
FILE *threadTraceFile_;
NAHeap *heap_;
+ NABoolean lobTrace_;
};
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/bbe87c92/core/sql/exp/ExpLOBexternal.h
----------------------------------------------------------------------
diff --git a/core/sql/exp/ExpLOBexternal.h b/core/sql/exp/ExpLOBexternal.h
index e8080f6..48905d3 100644
--- a/core/sql/exp/ExpLOBexternal.h
+++ b/core/sql/exp/ExpLOBexternal.h
@@ -137,7 +137,8 @@ Lng32 SQL_EXEC_LOBcliInterface
Used in case of cursor fetches.
OUT: if returned, save it and pass it back
in */
- /*IN*/ Int64 xnId /* xn id of the parent process, if non-zero */
+ /*IN*/ Int64 xnId, /* xn id of the parent process, if non-zero */
+ /*IN*/ NABoolean lobTrace
);
Lng32 SQL_EXEC_LOB_GC_Interface
(
@@ -147,7 +148,8 @@ Lng32 SQL_EXEC_LOB_GC_Interface
/*IN*/ char* hdfsServer,
/*IN*/ Lng32 hdfsPort,
/*IN*/ char *lobLocation,
- /*IN*/ Int64 lobMaxMemChunkLen // if passed in as 0, will use default value of 1G for the in memory buffer to do compaction.
+ /*IN*/ Int64 lobMaxMemChunkLen, // if passed in as 0, will use default value of 1G for the in memory buffer to do compaction.
+ /*IN*/ NABoolean lobTrace
);
Lng32 SQL_EXEC_LOBddlInterface
@@ -162,7 +164,8 @@ Lng32 SQL_EXEC_LOBddlInterface
/*IN*/ char* *lobLocList,
/*IN*/ char* hdfsServer,
/*IN*/ Lng32 hdfsPort,
- /*IN*/ Int64 lobMaxSize
+ /*IN*/ Int64 lobMaxSize,
+ /*IN*/ NABoolean lobTrace
);
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/bbe87c92/core/sql/exp/ExpLOBprocess.cpp
----------------------------------------------------------------------
diff --git a/core/sql/exp/ExpLOBprocess.cpp b/core/sql/exp/ExpLOBprocess.cpp
index e520c4c..92779ef 100644
--- a/core/sql/exp/ExpLOBprocess.cpp
+++ b/core/sql/exp/ExpLOBprocess.cpp
@@ -376,7 +376,7 @@ Ex_Lob_Error ExLob::getDesc(ExLobRequest *request)
&offset, &size,
&dummyParam, &dummyParam,
0,
- request->getTransId());
+ request->getTransId(), FALSE);
request->setHandleOutLen(handleOutLen);
request->setBlackBoxLen(blackBoxLen);
@@ -418,7 +418,7 @@ void processRequest(ExLobRequest *request)
0, 0,
0, 0,
0,
- 0);
+ 0,FALSE);
if (clierr < 0)
{
request->setError(LOB_INIT_ERROR);
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/bbe87c92/core/sql/export/ComDiags.cpp
----------------------------------------------------------------------
diff --git a/core/sql/export/ComDiags.cpp b/core/sql/export/ComDiags.cpp
index 40994d9..fe604fa 100644
--- a/core/sql/export/ComDiags.cpp
+++ b/core/sql/export/ComDiags.cpp
@@ -1405,7 +1405,7 @@ void ComCondition::setSQLCODE (Lng32 newSQLCODE)
// log a message (with the process ID) every three minutes
if ( loopCount == 60 )
- SQLMXLoggingArea::logSQLMXDebugEvent("Loop on error", reqError);
+ SQLMXLoggingArea::logSQLMXDebugEvent("Loop on error", reqError,__LINE__);
// Suspend the process for 'timeDelay'
sleep( timeDelay );
@@ -1423,7 +1423,7 @@ void ComCondition::setSQLCODE (Lng32 newSQLCODE)
releaseRTSSemaphore();
// log a message
- SQLMXLoggingArea::logSQLMXDebugEvent("Abort on error", reqError);
+ SQLMXLoggingArea::logSQLMXDebugEvent("Abort on error", reqError,__LINE__);
abort(); // dump core
}
@@ -1497,7 +1497,7 @@ void ComCondition::setNskCode( Lng32 newNskCode)
{
// log a message (with the process ID) every three minutes
if ( loopCount == 60 )
- SQLMXLoggingArea::logSQLMXDebugEvent("Loop on error", reqError);
+ SQLMXLoggingArea::logSQLMXDebugEvent("Loop on error", reqError,__LINE__);
// Suspend the process for 'timeDelay'
sleep( timeDelay );
@@ -1516,7 +1516,7 @@ void ComCondition::setNskCode( Lng32 newNskCode)
releaseRTSSemaphore();
// log a message
- SQLMXLoggingArea::logSQLMXDebugEvent("Abort on NSK error", reqError);
+ SQLMXLoggingArea::logSQLMXDebugEvent("Abort on NSK error", reqError,__LINE__);
abort(); // dump core
}
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/bbe87c92/core/sql/generator/GenRelExeUtil.cpp
----------------------------------------------------------------------
diff --git a/core/sql/generator/GenRelExeUtil.cpp b/core/sql/generator/GenRelExeUtil.cpp
index 6c49509..a3e3e80 100644
--- a/core/sql/generator/GenRelExeUtil.cpp
+++ b/core/sql/generator/GenRelExeUtil.cpp
@@ -3308,7 +3308,6 @@ desc_struct *ExeUtilRegionStats::createVirtualTableDesc()
ComTdbExeUtilRegionStats::getVirtTableKeyInfo());
return table_desc;
}
-
short ExeUtilRegionStats::codeGen(Generator * generator)
{
ExpGenerator * expGen = generator->getExpGenerator();
@@ -3406,6 +3405,158 @@ short ExeUtilRegionStats::codeGen(Generator * generator)
return 0;
}
+////////////////////////////////////////////////////////////////////
+// class ExeUtilLobInfo
+////////////////////////////////////////////////////////////////////
+const char * ExeUtilLobInfo::getVirtualTableName()
+{ return ("EXE_UTIL_LOB_INFO__"); }
+
+desc_struct *ExeUtilLobInfo::createVirtualTableDesc()
+{
+ desc_struct * table_desc = NULL;
+ if (tableFormat_)
+ table_desc = Generator::createVirtualTableDesc(
+ getVirtualTableName(),
+ ComTdbExeUtilLobInfo::getVirtTableNumCols(),
+ ComTdbExeUtilLobInfo::getVirtTableColumnInfo(),
+ ComTdbExeUtilLobInfo::getVirtTableNumKeys(),
+ ComTdbExeUtilLobInfo::getVirtTableKeyInfo());
+ else
+ table_desc = ExeUtilExpr::createVirtualTableDesc();
+
+ return table_desc;
+}
+
+short ExeUtilLobInfo::codeGen(Generator * generator)
+{
+ ExpGenerator * expGen = generator->getExpGenerator();
+ Space * space = generator->getSpace();
+
+ // allocate a map table for the retrieved columns
+ generator->appendAtEnd();
+
+ ex_cri_desc * givenDesc
+ = generator->getCriDesc(Generator::DOWN);
+
+ ex_cri_desc * returnedDesc
+ = new(space) ex_cri_desc(givenDesc->noTuples() + 1, space);
+
+ ex_cri_desc * workCriDesc = new(space) ex_cri_desc(4, space);
+ const int work_atp = 1;
+ const int exe_util_row_atp_index = 2;
+
+ short rc = processOutputRow(generator, work_atp, exe_util_row_atp_index,
+ returnedDesc);
+ if (rc)
+ {
+ return -1;
+ }
+
+ NAString tn = "\"";
+ tn += getTableName().getQualifiedNameObj().getCatalogName();
+ tn += "\".";
+ tn += getTableName().getQualifiedNameObj().getSchemaName();
+ tn += ".";
+ tn += getTableName().getQualifiedNameObj().getObjectName();
+ char * tablename = space->AllocateAndCopyToAlignedSpace(tn, 0);
+
+
+ char * schemaName =
+ space->AllocateAndCopyToAlignedSpace
+ (getTableName().getQualifiedNameObj().getSchemaName(), 0);
+ char * catalogName =
+ space->AllocateAndCopyToAlignedSpace
+ (getTableName().getQualifiedNameObj().getCatalogName(), 0);
+ char * objectName =
+ space->AllocateAndCopyToAlignedSpace
+ (getTableName().getQualifiedNameObj().getObjectName(), 0);
+
+ char *lobColArray = NULL;
+ char * lobNumArray = NULL;
+ char * lobLocArray = NULL;
+
+ const NATable * naTable = getUtilTableDesc()->getNATable();
+ Lng32 numLOBs = 0;
+
+ if (naTable->hasLobColumn())
+ {
+ for (CollIndex i = 0; i < naTable->getNAColumnArray().entries(); i++)
+ {
+
+ NAColumn *col = naTable->getNAColumnArray()[i];
+ if (col->getType()->isLob())
+ {
+ numLOBs++;
+ } // if
+ } // for
+ }
+
+ if (numLOBs > 0)
+ {
+ lobColArray = space->allocateAlignedSpace(numLOBs*LOBINFO_MAX_FILE_LEN);
+ lobNumArray = space->allocateAlignedSpace(numLOBs*2);
+ lobLocArray = space->allocateAlignedSpace(numLOBs * LOBINFO_MAX_FILE_LEN);
+
+ const NATable * naTable = getUtilTableDesc()->getNATable();
+ CollIndex j = 0;
+
+ for (CollIndex i = 0; i < naTable->getNAColumnArray().entries(); i++)
+ {
+
+ NAColumn *col = naTable->getNAColumnArray()[i];
+ if (col->getType()->isLob())
+ {
+ strcpy(&lobColArray[j*LOBINFO_MAX_FILE_LEN], col->getColName());
+ *(short*)(&lobNumArray[2*j]) = col->lobNum();
+
+ strcpy(&lobLocArray[j*LOBINFO_MAX_FILE_LEN], col->lobStorageLocation());
+
+ j++;
+ }
+ }
+ }
+ Lng32 hdfsPort = (Lng32)CmpCommon::getDefaultNumeric(LOB_HDFS_PORT);
+ const char* f = ActiveSchemaDB()->getDefaults().
+ getValue(LOB_HDFS_SERVER);
+ char * hdfsServer = space->allocateAlignedSpace(strlen(f) + 1);
+ strcpy(hdfsServer, f);
+
+ ComTdbExeUtilLobInfo *exe_util_tdb = new(space)
+ ComTdbExeUtilLobInfo(
+ tablename,
+ objectUID_,
+ numLOBs,
+ lobColArray,
+ lobNumArray,
+ lobLocArray,
+ hdfsPort,
+ hdfsServer,
+ tableFormat_,
+ workCriDesc,
+ exe_util_row_atp_index,
+ givenDesc,
+ returnedDesc,
+ (queue_index)64,
+ (queue_index)64,
+ 4,
+ 64000);
+ generator->initTdbFields(exe_util_tdb);
+
+ if(!generator->explainDisabled()) {
+ generator->setExplainTuple(
+ addExplainInfo(exe_util_tdb, 0, 0, generator));
+ }
+
+ generator->setCriDesc(givenDesc, Generator::DOWN);
+ generator->setCriDesc(returnedDesc, Generator::UP);
+ generator->setGenObj(this, exe_util_tdb);
+
+ // users should not start a transaction.
+ generator->setTransactionFlag(0);
+
+ return 0;
+}
+
// See ControlRunningQuery
@@ -3940,6 +4091,14 @@ short ExeUtilLobShowddl::codeGen(Generator * generator)
space->AllocateAndCopyToAlignedSpace
(getTableName().getQualifiedNameObj().getSchemaName(), 0);
+ char * catname =
+ space->AllocateAndCopyToAlignedSpace
+ (getTableName().getQualifiedNameObj().getCatalogName(), 0);
+
+ char * objectName =
+ space->AllocateAndCopyToAlignedSpace
+ (getTableName().getQualifiedNameObj().getObjectName(), 0);
+
char * lobNumArray = NULL;
char * lobLocArray = NULL;
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/bbe87c92/core/sql/optimizer/NATable.cpp
----------------------------------------------------------------------
diff --git a/core/sql/optimizer/NATable.cpp b/core/sql/optimizer/NATable.cpp
index c01998c..3396f13 100644
--- a/core/sql/optimizer/NATable.cpp
+++ b/core/sql/optimizer/NATable.cpp
@@ -5559,7 +5559,7 @@ NATable::NATable(BindWA *bindWA,
LOB_CLI_SELECT_CURSOR,
lobNumList,
lobTypList,
- lobLocList,(char *)lobHdfsServer,lobHdfsPort,0);
+ lobLocList,(char *)lobHdfsServer,lobHdfsPort,0,FALSE);
if (cliRC == 0)
{
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/bbe87c92/core/sql/optimizer/RelExeUtil.cpp
----------------------------------------------------------------------
diff --git a/core/sql/optimizer/RelExeUtil.cpp b/core/sql/optimizer/RelExeUtil.cpp
index e1b28ca..69ba114 100644
--- a/core/sql/optimizer/RelExeUtil.cpp
+++ b/core/sql/optimizer/RelExeUtil.cpp
@@ -3217,6 +3217,125 @@ void ExeUtilRegionStats::recomputeOuterReferences()
}
} // ExeUtilRegionStats::recomputeOuterReferences()
+// -----------------------------------------------------------------------
+// Member functions for class ExeUtilRegionStats
+// -----------------------------------------------------------------------
+ExeUtilLobInfo::ExeUtilLobInfo
+(const CorrName &objectName,
+ NABoolean tableFormat,
+ RelExpr * child,
+ CollHeap *oHeap)
+ : ExeUtilExpr(LOB_INFO_, objectName,
+ NULL, child, NULL, CharInfo::UnknownCharSet, oHeap),
+ errorInParams_(FALSE),
+ objectUID_(0)
+{
+ tableFormat_ = tableFormat;
+}
+
+RelExpr * ExeUtilLobInfo::copyTopNode(RelExpr *derivedNode, CollHeap* outHeap)
+{
+ ExeUtilLobInfo *result;
+
+ if (derivedNode == NULL)
+ result = new (outHeap) ExeUtilLobInfo(getTableName(),
+ FALSE,
+ NULL,
+ outHeap);
+ else
+ result = (ExeUtilLobInfo *) derivedNode;
+
+ result->errorInParams_ = errorInParams_;
+ result->objectUID_ = objectUID_;
+ return ExeUtilExpr::copyTopNode(result, outHeap);
+}
+
+// -----------------------------------------------------------------------
+// member functions for class ExeUtilLobInfo
+// -----------------------------------------------------------------------
+RelExpr * ExeUtilLobInfo::bindNode(BindWA *bindWA)
+{
+ if (errorInParams_)
+ {
+ *CmpCommon::diags() << DgSqlCode(-4218) << DgString0("GET ");
+
+ bindWA->setErrStatus();
+ return this;
+ }
+
+ if (nodeIsBound()) {
+ bindWA->getCurrentScope()->setRETDesc(getRETDesc());
+ return this;
+ }
+
+ if (getTableName().getQualifiedNameObj().getObjectName().isNull())
+ {
+ *CmpCommon::diags() << DgSqlCode(-4218) << DgString0("LOB INFO");
+
+ bindWA->setErrStatus();
+ return this;
+ }
+
+
+ NATable * naTable = bindWA->getNATable(getTableName());
+ if ((!naTable) || (bindWA->errStatus()))
+ return this;
+
+ // Allocate a TableDesc and attach it to this.
+ //
+ setUtilTableDesc(bindWA->createTableDesc(naTable, getTableName()));
+ if (bindWA->errStatus())
+ return this;
+
+ objectUID_ = naTable->objectUid().get_value();
+
+ RelExpr * childExpr = NULL;
+
+ if (getArity() > 0)
+ {
+ childExpr = child(0)->bindNode(bindWA);
+ if (bindWA->errStatus())
+ return NULL;
+
+ if ((childExpr->getRETDesc() == NULL) ||
+ (childExpr->getRETDesc()->getDegree() > 1) ||
+ (childExpr->getRETDesc()->getType(0).getTypeQualifier() != NA_CHARACTER_TYPE))
+ {
+ *CmpCommon::diags() << DgSqlCode(-4218) << DgString0("LOB INFO ");
+
+ bindWA->setErrStatus();
+ return this;
+ }
+
+
+
+ setChild(0, NULL);
+ }
+
+ RelExpr * boundExpr = ExeUtilExpr::bindNode(bindWA);
+ if (bindWA->errStatus())
+ return NULL;
+
+ if (childExpr)
+ {
+ RelExpr * re = new(PARSERHEAP()) Join
+ (childExpr, boundExpr, REL_TSJ_FLOW, NULL);
+ ((Join*)re)->doNotTransformToTSJ();
+ ((Join*)re)->setTSJForWrite(TRUE);
+
+ boundExpr = re->bindNode(bindWA);
+ if (bindWA->errStatus())
+ return NULL;
+ }
+
+ return boundExpr;
+}
+
+void ExeUtilLobInfo::recomputeOuterReferences()
+{
+
+} // ExeUtilLobInfo::recomputeOuterReferences()
+
// -----------------------------------------------------------------------
// Member functions for class ExeUtilLongRunning
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/bbe87c92/core/sql/optimizer/RelExeUtil.h
----------------------------------------------------------------------
diff --git a/core/sql/optimizer/RelExeUtil.h b/core/sql/optimizer/RelExeUtil.h
index a2ab73d..b5d7424 100644
--- a/core/sql/optimizer/RelExeUtil.h
+++ b/core/sql/optimizer/RelExeUtil.h
@@ -542,6 +542,7 @@ public:
GET_VERSION_INFO_ = 13,
SUSPEND_ACTIVATE_ = 14,
REGION_STATS_ = 15,
+ LOB_INFO_ =16,
SHOWSET_DEFAULTS_ = 18,
AQR_ = 19,
DISPLAY_EXPLAIN_COMPLEX_ = 20,
@@ -1762,6 +1763,47 @@ private:
NABoolean errorInParams_;
};
+class ExeUtilLobInfo : public ExeUtilExpr
+{
+public:
+
+ ExeUtilLobInfo(const CorrName &objectName,
+ NABoolean tableFormat = FALSE,
+ RelExpr * child = NULL,
+ CollHeap *oHeap = CmpCommon::statementHeap());
+
+ ExeUtilLobInfo()
+ {}
+
+ virtual RelExpr * bindNode(BindWA *bindWAPtr);
+
+ // a method used for recomputing the outer references (external dataflow
+ // input values) that are needed by this operator.
+ virtual void recomputeOuterReferences();
+
+ virtual RelExpr * copyTopNode(RelExpr *derivedNode = NULL,
+ CollHeap* outHeap = 0);
+
+ // method to do code generation
+ virtual short codeGen(Generator*);
+
+ virtual const char *getVirtualTableName();
+ static const char * getVirtualTableNameStr()
+ { return "EXE_UTIL_LOB_INFO__";}
+ virtual desc_struct *createVirtualTableDesc();
+
+ virtual NABoolean producesOutput() { return TRUE; }
+
+ virtual int getArity() const { return ((child(0) == NULL) ? 0 : 1); }
+
+ virtual NABoolean aqrSupported() { return TRUE; }
+
+private:
+ Int64 objectUID_;
+ NABoolean tableFormat_;
+ NABoolean errorInParams_;
+};
+
class ExeUtilLongRunning : public ExeUtilExpr
{
public:
http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/bbe87c92/core/sql/parser/sqlparser.y
----------------------------------------------------------------------
diff --git a/core/sql/parser/sqlparser.y b/core/sql/parser/sqlparser.y
index 5190988..c544281 100755
--- a/core/sql/parser/sqlparser.y
+++ b/core/sql/parser/sqlparser.y
@@ -2798,6 +2798,7 @@ static void enableMakeQuotedStringISO88591Mechanism()
%type <relx> exe_util_get_statistics
%type <relx> exe_util_get_uid
%type <relx> exe_util_get_qid
+%type <relx> exe_util_get_lob_info
%type <relx> exe_util_populate_in_memory_statistics
%type <relx> exe_util_lob_extract
%type <relx> unload_statement
@@ -6029,6 +6030,16 @@ TOK_TABLE '(' TOK_INTERNALSP '(' character_string_literal ')' ')'
$$ = new (PARSERHEAP())
ExeUtilRegionStats(*$7, FALSE, TRUE, FALSE, NULL, PARSERHEAP());
}
+| TOK_TABLE '(' TOK_LOB stats_or_statistics '(' ')' ')'
+ {
+ $$ = new (PARSERHEAP())
+ ExeUtilLobInfo(CorrName(""), TRUE, NULL, PARSERHEAP());
+ }
+| TOK_TABLE '(' TOK_LOB stats_or_statistics '(' table_name ')' ')'
+ {
+ $$ = new (PARSERHEAP())
+ ExeUtilLobInfo(*$6, TRUE, NULL, PARSERHEAP());
+ }
| TOK_TABLE '(' TOK_REGION stats_or_statistics '(' TOK_USING rel_subquery ')' ')'
{
$$ = new (PARSERHEAP())
@@ -13384,7 +13395,11 @@ query_specification : exe_util_get_qid
RelRoot($1, REL_ROOT);
}
-
+query_specification : exe_util_get_lob_info
+ {
+ RelRoot *root = new (PARSERHEAP())
+ RelRoot($1, REL_ROOT);
+ }
/* type relx */
query_specification : select_token '[' firstn_sorted NUMERIC_LITERAL_EXACT_NO_SCALE ']' set_quantifier query_spec_body
{
@@ -16340,6 +16355,12 @@ stats_or_statistics : TOK_STATS
$$ = TRUE;
}
+exe_util_get_lob_info : TOK_GET TOK_LOB stats_or_statistics TOK_FOR TOK_TABLE table_name
+ {
+ $$ = new (PARSERHEAP())
+ ExeUtilLobInfo(*$6, FALSE,NULL, PARSERHEAP());
+ }
+
/*
* The purpose of dummy_token_lookahead is to force the lexer to look
* one token ahead. This may be necessary in cases where the parser