insert/update LOB support from external user buffer
Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/3fcf1881 Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/3fcf1881 Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/3fcf1881 Branch: refs/heads/master Commit: 3fcf18813fd9f7b5ecce041b2675548e82f7e574 Parents: 96ac8eb Author: Sandhya Sundaresan <sand...@apache.org> Authored: Mon Jan 4 18:36:25 2016 +0000 Committer: Sandhya Sundaresan <sand...@apache.org> Committed: Mon Jan 4 18:36:25 2016 +0000 ---------------------------------------------------------------------- core/sql/bin/clitest.cpp | 48 ++++++++++++++++- core/sql/cli/sqlcli.h | 4 +- core/sql/clitest/blobtest.cpp | 91 +++++++++++++++++++++++++++++++++ core/sql/clitest/blobtest.h | 3 ++ core/sql/common/BaseTypes.cpp | 27 +++++++--- core/sql/exp/ExpLOB.cpp | 70 ++++++++++++++++--------- core/sql/exp/ExpLOB.h | 13 ++++- core/sql/exp/ExpLOBaccess.cpp | 24 ++++++--- core/sql/exp/ExpLOBinterface.cpp | 15 ++++-- core/sql/generator/GenItemFunc.cpp | 7 +++ core/sql/optimizer/ItemExpr.cpp | 4 +- core/sql/optimizer/ItemFunc.h | 17 +++--- core/sql/optimizer/SynthType.cpp | 33 +++++++++++- core/sql/parser/sqlparser.y | 43 +++++++++++----- 14 files changed, 329 insertions(+), 70 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3fcf1881/core/sql/bin/clitest.cpp ---------------------------------------------------------------------- diff --git a/core/sql/bin/clitest.cpp b/core/sql/bin/clitest.cpp index 261cdf6..360dadb 100644 --- a/core/sql/bin/clitest.cpp +++ b/core/sql/bin/clitest.cpp @@ -79,6 +79,10 @@ int main(int argc, const char * argv[]) cout << "-------------------------------------------"<<endl; cout << "Blob test extract to buffer 1 "<< endl; cout << "Blob test extract to file in chunks 2 "<< endl; + cout << "Blob test to insert to lob column 3 "<< endl; + cout << "Blob test to update lob column 4 "<< endl; + cout << "Blob test to append to lob column 5 "<< endl; + return 0; } Int32 retcode = 0; @@ -211,9 +215,51 @@ int main(int argc, const char * argv[]) } break; + + case 3: + { + + cout <<"*************************************" <<endl; + cout << "Blob test insert lobdata from a buffer " << endl; + cout << "Input lob table name (1st int column, 2nd blob column:" << endl; + cin.getline(tablename,40); + cout << "Table name : " << tablename << endl; + retcode = insertBufferToLob(cliGlob,tablename); + return retcode; + } + break; + case 4: + { + + cout <<"*************************************" <<endl; + cout << "Blob test update lobdata from a buffer " << endl; + cout << "Input lob table name :" << endl; + cin.getline(tablename,40); + cout << "Table name (1st int column ,2nd blob column): " << tablename << endl; + cout << "Input lob column name to update :" << endl; + cin.getline(columnname,40); + cout << "Column Name : " << columnname << endl; + retcode = updateBufferToLob(cliGlob,tablename,columnname); + return retcode; + } + break; + case 5: + { + + cout <<"*************************************" <<endl; + cout << "Blob test update append lobdata from a buffer " << endl; + cout << "Input lob table name :" << endl; + cin.getline(tablename,40); + cout << "Table name (1st int column , 2nd blob column: " << tablename << endl; + cout << "Input lob column name to update :" << endl; + cin.getline(columnname,40); + cout << "Column Name : " << columnname << endl; + retcode = updateAppendBufferToLob(cliGlob,tablename,columnname); + return retcode; + } + break; } - return 0; } http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3fcf1881/core/sql/cli/sqlcli.h ---------------------------------------------------------------------- diff --git a/core/sql/cli/sqlcli.h b/core/sql/cli/sqlcli.h index 07338db..e68bc30 100644 --- a/core/sql/cli/sqlcli.h +++ b/core/sql/cli/sqlcli.h @@ -409,7 +409,9 @@ enum SQLTYPE_CODE { /* LONG VARCHAR/ODBC CHARACTER VARYING */ SQLTYPECODE_VARCHAR_LONG = -1, /* ## NEGATIVE??? */ - + /* BLOB TYPE */ + SQLTYPECODE_BLOB = -602, + SQLTYPECODE_CLOB = -603, /* no ANSI value 13 */ /* BIT */ http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3fcf1881/core/sql/clitest/blobtest.cpp ---------------------------------------------------------------------- diff --git a/core/sql/clitest/blobtest.cpp b/core/sql/clitest/blobtest.cpp index 6abc04f..44570b0 100644 --- a/core/sql/clitest/blobtest.cpp +++ b/core/sql/clitest/blobtest.cpp @@ -129,3 +129,94 @@ Int32 extractLobToFileInChunks(CliGlobals *cliglob, char * lobHandle, char *fil return retcode; } + + +Int32 insertBufferToLob(CliGlobals *cliglob, char *tableName) +{ + Int32 retcode = 0; + ExeCliInterface cliInterface((cliglob->currContext())->exHeap(), (Int32)SQLCHARSETCODE_UTF8, cliglob->currContext(),NULL); + // Extract lob data into a buffer. + char * query = new char [500]; + + + char statusBuf[200] = {'\0'}; + Int32 statusBufLen = 0; + Int64 lobInsertLen = 10; + char *lobDataBuf = new char[lobInsertLen]; + memcpy(lobDataBuf, "xxxxxyyyyy",10); + str_sprintf(query,"insert into %s values (1, buffertolob (LOCATION %Ld, SIZE %Ld))", tableName,(Int64)lobDataBuf, lobInsertLen); + + + retcode = cliInterface.executeImmediate(query); + if (retcode <0) + return retcode; + + retcode = cliInterface.executeImmediate("commit work"); + delete query; + delete lobDataBuf; + + + return retcode; + +} + + +Int32 updateBufferToLob(CliGlobals *cliglob, char *tableName, char *columnName) +{ + Int32 retcode = 0; + ExeCliInterface cliInterface((cliglob->currContext())->exHeap(), (Int32)SQLCHARSETCODE_UTF8, cliglob->currContext(),NULL); + // Extract lob data into a buffer. + char * query = new char [500]; + + + char statusBuf[200] = {'\0'}; + Int32 statusBufLen = 0; + Int64 lobUpdateLen = 10; + char *lobDataBuf = new char[lobUpdateLen]; + memcpy(lobDataBuf, "zzzzzzzzzzzzzzzzzzzz",20); + str_sprintf(query,"update %s set %s= buffertolob(LOCATION %Ld, SIZE %Ld)", tableName,columnName, (Int64)lobDataBuf, lobUpdateLen); + + + retcode = cliInterface.executeImmediate(query); + if (retcode <0) + return retcode; + + retcode = cliInterface.executeImmediate("commit work"); + delete query; + delete lobDataBuf; + + + return retcode; + +} + + + +Int32 updateAppendBufferToLob(CliGlobals *cliglob, char *tableName, char *columnName) +{ + Int32 retcode = 0; + ExeCliInterface cliInterface((cliglob->currContext())->exHeap(), (Int32)SQLCHARSETCODE_UTF8, cliglob->currContext(),NULL); + // Extract lob data into a buffer. + char * query = new char [500]; + + + char statusBuf[200] = {'\0'}; + Int32 statusBufLen = 0; + Int64 lobUpdateLen = 10; + char *lobDataBuf = new char[lobUpdateLen]; + memcpy(lobDataBuf, "aaaaabbbbbccccc",15); + str_sprintf(query,"update %s set %s=buffertolob (LOCATION %Ld, SIZE %Ld,append)", tableName, columnName,(Int64)lobDataBuf, lobUpdateLen); + + + retcode = cliInterface.executeImmediate(query); + if (retcode <0) + return retcode; + + retcode = cliInterface.executeImmediate("commit work"); + delete query; + delete lobDataBuf; + + + return retcode; + +} http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3fcf1881/core/sql/clitest/blobtest.h ---------------------------------------------------------------------- diff --git a/core/sql/clitest/blobtest.h b/core/sql/clitest/blobtest.h index da34fa7..3832ee6 100644 --- a/core/sql/clitest/blobtest.h +++ b/core/sql/clitest/blobtest.h @@ -37,3 +37,6 @@ Int32 extractLobToBuffer(CliGlobals *cliglob, char * lobHandle, Int64 &lengthOfL char *lobColumnName, char *tableName); Int32 extractLobToFileInChunks(CliGlobals *cliglob, char * lobHandle, char *filename, Int64 &lengthOfLob, char *lobColumnName, char *tableName); +Int32 insertBufferToLob(CliGlobals *cliglob,char *tbaleName); +Int32 updateBufferToLob(CliGlobals *cliglob, char *tableName, char *columnName); +Int32 updateAppendBufferToLob(CliGlobals *cliGlob, char *tableName, char *columnName); http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3fcf1881/core/sql/common/BaseTypes.cpp ---------------------------------------------------------------------- diff --git a/core/sql/common/BaseTypes.cpp b/core/sql/common/BaseTypes.cpp index e9c49d6..bcc6cf6 100644 --- a/core/sql/common/BaseTypes.cpp +++ b/core/sql/common/BaseTypes.cpp @@ -733,6 +733,12 @@ Lng32 getAnsiTypeFromFSType(Lng32 datatype) case REC_DATETIME: numeric_value = SQLTYPECODE_DATETIME; break; + case REC_BLOB: + numeric_value = SQLTYPECODE_BLOB; + break; + case REC_CLOB: + numeric_value = SQLTYPECODE_CLOB; + break; case REC_INT_YEAR: case REC_INT_MONTH: @@ -832,6 +838,13 @@ const char * getAnsiTypeStrFromFSType(Lng32 datatype) return COM_DATETIME_SDT_LIT; break; + case REC_BLOB: + return COM_BLOB_SDT_LIT; + break; + case REC_CLOB: + return COM_CLOB_SDT_LIT; + break; + case REC_INT_YEAR: case REC_INT_MONTH: case REC_INT_YEAR_MONTH: @@ -847,12 +860,7 @@ const char * getAnsiTypeStrFromFSType(Lng32 datatype) case REC_INT_DAY_SECOND: return COM_INTERVAL_SDT_LIT; break; - case REC_BLOB: - return COM_BLOB_SDT_LIT; - break; - case REC_CLOB: - return COM_CLOB_SDT_LIT; - break; + default: // error break; @@ -1081,7 +1089,12 @@ Lng32 getFSTypeFromANSIType(Lng32 ansitype) case SQLTYPECODE_DATETIME: datatype = REC_DATETIME; break; - + case SQLTYPECODE_BLOB: + datatype = REC_BLOB; + break; + case SQLTYPECODE_CLOB: + datatype = REC_CLOB; + break; default: // error datatype = ansitype; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3fcf1881/core/sql/exp/ExpLOB.cpp ---------------------------------------------------------------------- diff --git a/core/sql/exp/ExpLOB.cpp b/core/sql/exp/ExpLOB.cpp index 9905fe4..18470d6 100644 --- a/core/sql/exp/ExpLOB.cpp +++ b/core/sql/exp/ExpLOB.cpp @@ -579,12 +579,13 @@ ExpLOBiud::ExpLOBiud(OperatorTypeEnum oper_type, //////////////////////////////////////////////////////// ExpLOBinsert::ExpLOBinsert(){}; ExpLOBinsert::ExpLOBinsert(OperatorTypeEnum oper_type, - Attributes ** attr, + Lng32 numAttrs, + Attributes ** attr, Int64 objectUID, short descSchNameLen, char * descSchName, Space * space) - : ExpLOBiud(oper_type, 2, attr, objectUID, descSchNameLen, descSchName, space), + : ExpLOBiud(oper_type, numAttrs, attr, objectUID, descSchNameLen, descSchName, space), // objectUID_(objectUID), // descSchNameLen_(descSchNameLen), liFlags_(0) @@ -657,8 +658,10 @@ ex_expr::exp_return_type ExpLOBiud::insertDesc(char *op_data[], so = Lob_Memory; else if (fromLob()) so = Lob_Foreign_Lob; + else if (fromBuffer()) + so = Lob_Buffer; - Int64 tempLobLen = getOperand(1)->getLength(); + Lng32 waitedOp = 0; #ifdef __EID @@ -691,7 +694,10 @@ ex_expr::exp_return_type ExpLOBiud::insertDesc(char *op_data[], str_cpy_and_null(lobData,op_data[1],lobLen,'\0',' ',TRUE); } - + if (so == Lob_Buffer) + { + memcpy(&lobLen, op_data[2],sizeof(Int64)); + } LobsOper lo ; if (lobOperStatus == CHECK_STATUS_) @@ -806,6 +812,11 @@ ex_expr::exp_return_type ExpLOBiud::insertData(Lng32 handleLen, } else lobData = op_data[1]; + if (fromBuffer()) + { + memcpy(&lobLen, op_data[2],sizeof(Int64)); // user specified buffer length + memcpy(lobData,op_data[1],sizeof(Int64)); // user buffer address + } LobsOper lo ; if (lobOperStatus == CHECK_STATUS_) @@ -822,6 +833,8 @@ ex_expr::exp_return_type ExpLOBiud::insertData(Lng32 handleLen, so = Lob_Memory; else if (fromLob()) so = Lob_Foreign_Lob; + else if(fromBuffer()) + so = Lob_Buffer; Lng32 waitedOp = 0; @@ -1108,27 +1121,27 @@ ex_expr::exp_return_type ExpLOBupdate::eval(char *op_data[], short sSchNameLen = 0; char sSchName[500]; - if (getOperand(2)->getNullFlag() && - nullValue_) - { - ex_expr::exp_return_type err = insertDesc(op_data, h, diagsArea); - if (err == ex_expr::EXPR_ERROR) - return err; + if (getOperand(2)->getNullFlag() && + nullValue_) + { + ex_expr::exp_return_type err = insertDesc(op_data, h, diagsArea); + if (err == ex_expr::EXPR_ERROR) + return err; - char * handle = op_data[0]; - Lng32 handleLen = getOperand(0)->getLength(); - err = insertData(handleLen, handle, op_data, h, diagsArea); + char * handle = op_data[0]; + handleLen = getOperand(0)->getLength(); + err = insertData(handleLen, handle, op_data, h, diagsArea); - return err; + return err; - } - else - { - lobHandle = op_data[2]; - - handleLen = getOperand(2)->getLength(op_data[-MAX_OPERANDS+2]); - } + } + else + { + lobHandle = op_data[2]; + handleLen = getOperand(2)->getLength(op_data[-MAX_OPERANDS+2]); + } + extractFromLOBhandle(&sFlags, &sLobType, &sLobNum, &sUid, &sDescSyskey, &sDescTS, &sSchNameLen, sSchName, @@ -1171,6 +1184,8 @@ ex_expr::exp_return_type ExpLOBupdate::eval(char *op_data[], so = Lob_Memory; else if (fromLob()) so = Lob_Foreign_Lob; + else if (fromBuffer()) + so= Lob_Buffer; Lng32 waitedOp = 0; #ifdef __EID @@ -1190,7 +1205,11 @@ ex_expr::exp_return_type ExpLOBupdate::eval(char *op_data[], // Int64 offset = 0; Int64 lobLen = getOperand(1)->getLength(); char * data = op_data[1]; - + if (fromBuffer()) + { + memcpy(&lobLen, op_data[3],sizeof(Int64)); // user specified buffer length + memcpy(data,op_data[1],sizeof(Int64)); // user buffer address + } if (isAppend()) { rc = ExpLOBInterfaceUpdateAppend @@ -1199,7 +1218,7 @@ ex_expr::exp_return_type ExpLOBupdate::eval(char *op_data[], getLobHdfsPort(), tgtLobName, lobStorageLocation(), - handleLen, op_data[2], + handleLen, lobHandle, &outHandleLen_, outLobHandle_, requestTag_, getExeGlobals()->lobGlobals()->xnId(), @@ -1222,7 +1241,7 @@ ex_expr::exp_return_type ExpLOBupdate::eval(char *op_data[], getLobHdfsPort(), tgtLobName, lobStorageLocation(), - handleLen, op_data[2], + handleLen, lobHandle, &outHandleLen_, outLobHandle_, requestTag_, getExeGlobals()->lobGlobals()->xnId(), @@ -1563,12 +1582,13 @@ ex_expr::exp_return_type ExpLOBconvertHandle::eval(char *op_data[], //////////////////////////////////////////////////////// ExpLOBload::ExpLOBload(){}; ExpLOBload::ExpLOBload(OperatorTypeEnum oper_type, + Lng32 numAttrs, Attributes ** attr, Int64 objectUID, short descSchNameLen, char * descSchName, Space * space) - : ExpLOBinsert(oper_type, attr, objectUID, + : ExpLOBinsert(oper_type, numAttrs,attr, objectUID, descSchNameLen, descSchName, space), llFlags_(0) { http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3fcf1881/core/sql/exp/ExpLOB.h ---------------------------------------------------------------------- diff --git a/core/sql/exp/ExpLOB.h b/core/sql/exp/ExpLOB.h index cf58f8d..de74b4a 100644 --- a/core/sql/exp/ExpLOB.h +++ b/core/sql/exp/ExpLOB.h @@ -430,7 +430,15 @@ class ExpLOBiud : public ExpLOBoper { { (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 NABoolean fromFile() { return ((liudFlags_ & FROM_FILE) != 0); @@ -481,7 +489,8 @@ class ExpLOBiud : public ExpLOBoper { FROM_FILE = 0x0004, FROM_LOAD = 0x0008, FROM_LOB = 0x0010, - FROM_EXTERNAL = 0x0020 + FROM_EXTERNAL = 0x0020, + FROM_BUFFER = 0x0040 }; Lng32 liudFlags_; @@ -491,6 +500,7 @@ class ExpLOBiud : public ExpLOBoper { class ExpLOBinsert : public ExpLOBiud { public: ExpLOBinsert(OperatorTypeEnum oper_type, + Lng32 numAttrs, Attributes ** attr, Int64 objectUID, short descSchNameLen, @@ -870,6 +880,7 @@ public: class ExpLOBload : public ExpLOBinsert { public: ExpLOBload(OperatorTypeEnum oper_type, + Lng32 numAttrs, Attributes ** attr, Int64 objectUID, short descSchNameLen, http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3fcf1881/core/sql/exp/ExpLOBaccess.cpp ---------------------------------------------------------------------- diff --git a/core/sql/exp/ExpLOBaccess.cpp b/core/sql/exp/ExpLOBaccess.cpp index b52f183..f16d48b 100644 --- a/core/sql/exp/ExpLOBaccess.cpp +++ b/core/sql/exp/ExpLOBaccess.cpp @@ -854,8 +854,12 @@ Ex_Lob_Error ExLob::append(char *data, Int64 size, LobsSubOper so, Int64 headDes return LOB_DESC_APPEND_ERROR; } - - err = writeLobData(data, sourceLen,so,dataOffset,operLen,lobMaxChunkMemSize); + char *inputAddr = data; + if (so == Lob_Buffer) + { + inputAddr = (char *)(*(long *)data); + } + err = writeLobData(inputAddr, sourceLen,so,dataOffset,operLen,lobMaxChunkMemSize); if (err != LOB_OPER_OK) return err; return LOB_OPER_OK; @@ -882,6 +886,10 @@ Ex_Lob_Error ExLob::insertData(char *data, Int64 size, LobsSubOper so,Int64 head } char *inputAddr = data; + if (so == Lob_Buffer) + { + inputAddr = (char *)(*(long *)data); + } Int64 inputSize = desc.getSize(); Int64 tgtOffset = desc.getOffset(); err = writeLobData(inputAddr, inputSize,so, tgtOffset, @@ -926,9 +934,13 @@ Ex_Lob_Error ExLob::update(char *data, Int64 size, LobsSubOper so,Int64 headDesc if (cliErr < 0 || cliErr == 100) { // some error or EOD. return LOB_DESC_UPDATE_ERROR; } - + char *inputAddr = data; + if (so == Lob_Buffer) + { + inputAddr = (char *)(*(long *)data); + } - err = writeLobData(data, sourceLen,so,dataOffset,operLen,lobMaxChunkMemSize); + err = writeLobData(inputAddr, sourceLen,so,dataOffset,operLen,lobMaxChunkMemSize); if (err != LOB_OPER_OK) return err; return LOB_OPER_OK; @@ -2805,7 +2817,7 @@ Ex_Lob_Error ExLobsOper ( break; case Lob_Append: - if (subOperation == Lob_Memory) + if ((subOperation == Lob_Memory) ||(subOperation == Lob_Buffer)) err = lobPtr->append(source, sourceLen, subOperation, descNumIn, retOperLen,lobMaxSize, lobMaxChunkMemSize); else if (subOperation == Lob_File) err = lobPtr->append(source, -1, subOperation, descNumIn, retOperLen,lobMaxSize, lobMaxChunkMemSize); @@ -2814,7 +2826,7 @@ Ex_Lob_Error ExLobsOper ( break; case Lob_Update: - if (subOperation == Lob_Memory) + if ((subOperation == Lob_Memory)||(subOperation == Lob_Buffer)) err = lobPtr->update(source, sourceLen, subOperation, descNumIn, retOperLen, lobMaxSize, lobMaxChunkMemSize); else if (subOperation == Lob_File) err = lobPtr->update(source, -1, subOperation,descNumIn, retOperLen,lobMaxSize, lobMaxChunkMemSize); http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3fcf1881/core/sql/exp/ExpLOBinterface.cpp ---------------------------------------------------------------------- diff --git a/core/sql/exp/ExpLOBinterface.cpp b/core/sql/exp/ExpLOBinterface.cpp index 1790a50..d55bab9 100644 --- a/core/sql/exp/ExpLOBinterface.cpp +++ b/core/sql/exp/ExpLOBinterface.cpp @@ -492,7 +492,11 @@ Lng32 ExpLOBInterfaceUpdateAppend(void * lobGlob, Int64 savedTgtLobLen = tgtLobLen; Ex_Lob_Error status; Int64 cliError = -1; - + Int64 srcLen = 0; + if(so == Lob_Memory) + srcLen = strlen(srcLobData); + else if (so == Lob_Buffer) + srcLen = tgtLobLen; err = ExLobsOper(tgtLobName, lobHandle, handleLen, lobHdfsServer, lobHdfsPort, // hdfs server/port @@ -500,7 +504,7 @@ Lng32 ExpLOBInterfaceUpdateAppend(void * lobGlob, tgtDescSyskey, dummyParam, operLen, 0, dummyParam, status, cliError, lobStorageLocation, Lob_HDFS_File, - srcLobData, strlen(srcLobData), //strlen(srcLobData), + srcLobData, srcLen, //strlen(srcLobData), 0,NULL, Lob_Append, so, @@ -570,6 +574,11 @@ Lng32 ExpLOBInterfaceUpdate(void * lobGlob, Int64 savedTgtLobLen = tgtLobLen; Ex_Lob_Error status; Int64 cliError = -1; + Int64 sourceLen = 0; + if(so == Lob_Memory) + sourceLen = strlen(srcLobData); + else if (so == Lob_Buffer) + sourceLen = tgtLobLen; err = ExLobsOper(tgtLobName, lobHandle, handleLen, @@ -578,7 +587,7 @@ Lng32 ExpLOBInterfaceUpdate(void * lobGlob, tgtDescSyskey, dummyParam, operLen, 0, dummyParam, status, cliError, lobStorageLocation, Lob_HDFS_File, - srcLobData, strlen(srcLobData), //strlen(srcLobData), + srcLobData, sourceLen, 0,NULL, Lob_Update, so, http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3fcf1881/core/sql/generator/GenItemFunc.cpp ---------------------------------------------------------------------- diff --git a/core/sql/generator/GenItemFunc.cpp b/core/sql/generator/GenItemFunc.cpp index 94db476..c7e6748 100644 --- a/core/sql/generator/GenItemFunc.cpp +++ b/core/sql/generator/GenItemFunc.cpp @@ -2814,6 +2814,7 @@ short LOBinsert::codeGen(Generator * generator) ExpLOBinsert * li = new(generator->getSpace()) ExpLOBinsert (getOperatorType(), + getArity()+1, attr, objectUID_, (short)insertedTableSchemaName().length(), @@ -2830,6 +2831,8 @@ short LOBinsert::codeGen(Generator * generator) li->setFromLob(TRUE); else if (obj_ == LOBoper::EXTERNAL_) li->setFromExternal(TRUE); + else if (obj_ ==LOBoper::BUFFER_) + li->setFromBuffer(TRUE); li->lobNum() = lobNum(); li->setLobStorageType(lobStorageType()); @@ -2897,6 +2900,8 @@ short LOBupdate::codeGen(Generator * generator) lu->setFromLob(TRUE); else if (obj_ == LOBoper::EXTERNAL_) lu->setFromExternal(TRUE); + else if (obj_ == LOBoper::BUFFER_) + lu->setFromBuffer(TRUE); lu->lobNum() = lobNum(); lu->setLobStorageType(lobStorageType()); @@ -2997,6 +3002,7 @@ short LOBload::codeGen(Generator * generator) ExpLOBload * ll = new(generator->getSpace()) ExpLOBload (getOperatorType(), + getArity()+1, attr, objectUID_, (short)insertedTableSchemaName().length(), @@ -3011,6 +3017,7 @@ short LOBload::codeGen(Generator * generator) ll->setFromLoad(TRUE); else if (obj_ == LOBoper::LOB_) ll->setFromLob(TRUE); + ll->lobNum() = lobNum(); ll->setLobStorageType(lobStorageType()); http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3fcf1881/core/sql/optimizer/ItemExpr.cpp ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/ItemExpr.cpp b/core/sql/optimizer/ItemExpr.cpp index cde3298..41b6b76 100644 --- a/core/sql/optimizer/ItemExpr.cpp +++ b/core/sql/optimizer/ItemExpr.cpp @@ -12529,7 +12529,7 @@ ItemExpr * LOBoper::copyTopNode(ItemExpr *derivedNode, CollHeap* outHeap) LOBoper *result; if (derivedNode == NULL) - result = new (outHeap) LOBoper(getOperatorType(), NULL, NULL, obj_); + result = new (outHeap) LOBoper(getOperatorType(), NULL, NULL, NULL,obj_); else result = (LOBoper*)derivedNode; @@ -12587,7 +12587,7 @@ ItemExpr * LOBupdate::copyTopNode(ItemExpr *derivedNode, CollHeap* outHeap) LOBupdate *result; if (derivedNode == NULL) - result = new (outHeap) LOBupdate(NULL, NULL, obj_, append_); + result = new (outHeap) LOBupdate(NULL, NULL, NULL,obj_, append_); else result = (LOBupdate*)derivedNode; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3fcf1881/core/sql/optimizer/ItemFunc.h ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/ItemFunc.h b/core/sql/optimizer/ItemFunc.h index 7f77422..3bb7238 100644 --- a/core/sql/optimizer/ItemFunc.h +++ b/core/sql/optimizer/ItemFunc.h @@ -2700,10 +2700,10 @@ public: }; LOBoper(OperatorTypeEnum otype, - ItemExpr *val1Ptr, ItemExpr *val2Ptr = NULL, + ItemExpr *val1Ptr, ItemExpr *val2Ptr = NULL,ItemExpr *val3Ptr = NULL, ObjectType obj = NOOP_) : BuiltinFunction(otype, CmpCommon::statementHeap(), - 2, val1Ptr, val2Ptr), + 3, val1Ptr, val2Ptr,val3Ptr), obj_(obj), lobNum_(-1), lobStorageType_(Lob_Invalid_Storage), @@ -2758,7 +2758,7 @@ class LOBinsert : public LOBoper ObjectType fromObj, NABoolean isAppend = FALSE, OperatorTypeEnum otype = ITM_LOBINSERT) - : LOBoper(otype, val1Ptr, val2Ptr,fromObj), + : LOBoper(otype, val1Ptr, val2Ptr,NULL,fromObj), objectUID_(-1), append_(isAppend), lobSize_(0), @@ -2814,7 +2814,7 @@ class LOBselect : public LOBoper public: LOBselect(ItemExpr *val1Ptr, ItemExpr *val2Ptr, ObjectType toObj) - : LOBoper(ITM_LOBSELECT, val1Ptr, val2Ptr, toObj) + : LOBoper(ITM_LOBSELECT, val1Ptr, val2Ptr,NULL,toObj) { }; @@ -2858,9 +2858,10 @@ class LOBupdate : public LOBoper LOBupdate(ItemExpr *val1Ptr, ItemExpr *val2Ptr, + ItemExpr *val3Ptr, ObjectType fromObj, NABoolean isAppend = FALSE) - : LOBoper(ITM_LOBUPDATE, val1Ptr, val2Ptr, fromObj), + : LOBoper(ITM_LOBUPDATE, val1Ptr, val2Ptr,val3Ptr,fromObj), objectUID_(-1), lobSize_(0), append_(isAppend) @@ -2903,7 +2904,7 @@ class LOBconvert : public LOBoper public: LOBconvert(ItemExpr *val1Ptr, ObjectType toObj, Lng32 tgtSize = 32000) - : LOBoper(ITM_LOBCONVERT, val1Ptr, NULL,toObj), + : LOBoper(ITM_LOBCONVERT, val1Ptr, NULL,NULL,toObj), tgtSize_(tgtSize) {}; @@ -2931,7 +2932,7 @@ class LOBconvertHandle : public LOBoper public: LOBconvertHandle(ItemExpr *val1Ptr, ObjectType toObj) - : LOBoper(ITM_LOBCONVERTHANDLE, val1Ptr, NULL,toObj) + : LOBoper(ITM_LOBCONVERTHANDLE, val1Ptr, NULL,NULL,toObj) {}; // copyTopNode method @@ -2970,7 +2971,7 @@ class LOBextract : public LOBoper public: LOBextract(ItemExpr *val1Ptr, Lng32 tgtSize = 1000) - : LOBoper(ITM_LOBEXTRACT, val1Ptr, NULL,EXTRACT_), + : LOBoper(ITM_LOBEXTRACT, val1Ptr, NULL,NULL,EXTRACT_), tgtSize_(tgtSize) {}; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3fcf1881/core/sql/optimizer/SynthType.cpp ---------------------------------------------------------------------- diff --git a/core/sql/optimizer/SynthType.cpp b/core/sql/optimizer/SynthType.cpp index 8484247..b9d5518 100644 --- a/core/sql/optimizer/SynthType.cpp +++ b/core/sql/optimizer/SynthType.cpp @@ -6462,7 +6462,6 @@ const NAType *LOBinsert::synthesizeType() if ((obj_ == STRING_) || (obj_ == FILE_) || - (obj_ == BUFFER_) || (obj_ == EXTERNAL_) || (obj_ == LOAD_)) { @@ -6484,6 +6483,16 @@ const NAType *LOBinsert::synthesizeType() return NULL; } } + else if (obj_ == BUFFER_) + { + if (typ1.getTypeQualifier() != NA_NUMERIC_TYPE) + { + // 4043 The operand of a $0~String0 function must be blob + *CmpCommon::diags() << DgSqlCode(-4221) << DgString0("LOBINSERT") + << DgString1("LARGEINT"); + return NULL; + } + } else { // 4221 The operand of a $0~String0 function must be character. @@ -6517,9 +6526,10 @@ const NAType *LOBupdate::synthesizeType() ValueId vid2 = child(1)->getValueId(); const NAType &typ2 = (NAType&)vid2.getType(); + + if ((obj_ == STRING_) || (obj_ == FILE_) || - (obj_ == BUFFER_) || (obj_ == EXTERNAL_)) { if (typ1.getTypeQualifier() != NA_CHARACTER_TYPE) @@ -6540,6 +6550,25 @@ const NAType *LOBupdate::synthesizeType() return NULL; } } + else if (obj_ == BUFFER_) + { + if (typ1.getTypeQualifier() != NA_NUMERIC_TYPE) + { + // 4043 The operand of a $0~String0 function must be blob + *CmpCommon::diags() << DgSqlCode(-4221) << DgString0("LOBUPDATE") + << DgString1("LARGEINT"); + return NULL; + } + ValueId vid3 = child(2)->getValueId(); + const NAType &typ3 = (NAType&)vid3.getType(); + if (typ3.getTypeQualifier() != NA_NUMERIC_TYPE) + { + // 4043 The operand of a $0~String0 function must be blob + *CmpCommon::diags() << DgSqlCode(-4221) << DgString0("LOBUPDATE") + << DgString1("LARGEINT"); + return NULL; + } + } else { // 4221 The operand of a $0~String0 function must be character. http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/3fcf1881/core/sql/parser/sqlparser.y ---------------------------------------------------------------------- diff --git a/core/sql/parser/sqlparser.y b/core/sql/parser/sqlparser.y index 23883ec..eb6055f 100755 --- a/core/sql/parser/sqlparser.y +++ b/core/sql/parser/sqlparser.y @@ -12680,9 +12680,14 @@ insert_obj_to_lob_function : { $$ = new (PARSERHEAP()) LOBinsert( $3, NULL, LOBoper::STRING_, FALSE); } - | TOK_BUFFERTOLOB '(' TOK_LOCATION character_literal_sbyte ',' TOK_SIZE numeric_literal_exact ')' + | TOK_BUFFERTOLOB '(' TOK_LOCATION value_expression',' TOK_SIZE value_expression')' { - $$ = new (PARSERHEAP()) LOBinsert( $4, $7, LOBoper::BUFFER_, FALSE); + ItemExpr *bufAddr = $4; + ItemExpr *bufSize = $7; + bufAddr = new (PARSERHEAP())Cast(bufAddr, new (PARSERHEAP()) SQLLargeInt(TRUE,FALSE)); + bufSize = new (PARSERHEAP()) + Cast(bufSize, new (PARSERHEAP()) SQLLargeInt(TRUE, FALSE)); + $$ = new (PARSERHEAP()) LOBinsert( bufAddr, bufSize, LOBoper::BUFFER_, FALSE); } | TOK_FILETOLOB '(' character_literal_sbyte ')' { @@ -12708,45 +12713,55 @@ insert_obj_to_lob_function : update_obj_to_lob_function : TOK_STRINGTOLOB '(' value_expression ')' { - $$ = new (PARSERHEAP()) LOBupdate( $3, NULL, LOBoper::STRING_, FALSE); + $$ = new (PARSERHEAP()) LOBupdate( $3, NULL, NULL,LOBoper::STRING_, FALSE); } | TOK_STRINGTOLOB '(' value_expression ',' TOK_APPEND ')' { - $$ = new (PARSERHEAP()) LOBupdate( $3, NULL, LOBoper::STRING_, TRUE); + $$ = new (PARSERHEAP()) LOBupdate( $3, NULL,NULL, LOBoper::STRING_, TRUE); } | TOK_FILETOLOB '('character_literal_sbyte ')' { - $$ = new (PARSERHEAP()) LOBupdate( $3, NULL,LOBoper::FILE_, FALSE); + $$ = new (PARSERHEAP()) LOBupdate( $3, NULL,NULL,LOBoper::FILE_, FALSE); } | TOK_FILETOLOB '('character_literal_sbyte ',' TOK_APPEND ')' { - $$ = new (PARSERHEAP()) LOBupdate( $3,NULL, LOBoper::FILE_, TRUE); + $$ = new (PARSERHEAP()) LOBupdate( $3,NULL, NULL,LOBoper::FILE_, TRUE); } - | TOK_BUFFERTOLOB '(' TOK_LOCATION character_literal_sbyte ',' TOK_SIZE numeric_literal_exact ')' + | TOK_BUFFERTOLOB '(' TOK_LOCATION value_expression ',' TOK_SIZE value_expression ')' { - $$ = new (PARSERHEAP()) LOBinsert( $4, $7, LOBoper::BUFFER_, FALSE); + ItemExpr *bufAddr = $4; + ItemExpr *bufSize = $7; + bufAddr = new (PARSERHEAP())Cast(bufAddr, new (PARSERHEAP()) SQLLargeInt(TRUE,FALSE)); + bufSize = new (PARSERHEAP()) + Cast(bufSize, new (PARSERHEAP()) SQLLargeInt(TRUE, FALSE)); + $$ = new (PARSERHEAP()) LOBupdate( bufAddr, NULL,bufSize, LOBoper::BUFFER_, FALSE); } - | TOK_BUFFERTOLOB '(' TOK_LOCATION character_literal_sbyte ',' TOK_SIZE numeric_literal_exact ',' TOK_APPEND')' + | TOK_BUFFERTOLOB '(' TOK_LOCATION value_expression ',' TOK_SIZE value_expression ',' TOK_APPEND')' { - $$ = new (PARSERHEAP()) LOBinsert( $4, $7, LOBoper::BUFFER_, TRUE); + ItemExpr *bufAddr = $4; + ItemExpr *bufSize = $7; + bufAddr = new (PARSERHEAP())Cast(bufAddr, new (PARSERHEAP()) SQLLargeInt(TRUE,FALSE)); + bufSize = new (PARSERHEAP()) + Cast(bufSize, new (PARSERHEAP()) SQLLargeInt(TRUE, FALSE)); + $$ = new (PARSERHEAP()) LOBupdate( bufAddr, NULL,bufSize, LOBoper::BUFFER_, TRUE); } | TOK_EXTERNALTOLOB '(' literal ')' { YYERROR; - $$ = new (PARSERHEAP()) LOBupdate( $3, NULL, LOBoper::EXTERNAL_, FALSE); + $$ = new (PARSERHEAP()) LOBupdate( $3, NULL, NULL,LOBoper::EXTERNAL_, FALSE); } | TOK_EXTERNALTOLOB '(' literal ',' literal ')' { YYERROR; - $$ = new (PARSERHEAP()) LOBupdate( $3, $5, LOBoper::EXTERNAL_, FALSE); + $$ = new (PARSERHEAP()) LOBupdate( $3, $5, NULL,LOBoper::EXTERNAL_, FALSE); } | TOK_LOADTOLOB '(' literal ',' TOK_APPEND ')' { YYERROR; - $$ = new (PARSERHEAP()) LOBupdate( $3, NULL, LOBoper::LOAD_, TRUE); + $$ = new (PARSERHEAP()) LOBupdate( $3, NULL, NULL,LOBoper::LOAD_, TRUE); } select_lob_to_obj_function : TOK_LOBTOFILE '(' value_expression ',' literal ')' @@ -19720,7 +19735,7 @@ set_clause : identifier '=' value_expression ColReference(new (PARSERHEAP()) ColRefName(*$1, PARSERHEAP())); LOBupdate * nlu = - new (PARSERHEAP()) LOBupdate(lu->child(0), cr, + new (PARSERHEAP()) LOBupdate(lu->child(0), cr, lu->child(2), lu->getObj(), lu->isAppend()); rc = nlu;