You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by sa...@apache.org on 2016/01/08 20:11:33 UTC
[08/13] incubator-trafodion git commit: insert/update LOB support
from external user buffer
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 <sa...@apache.org>
Authored: Mon Jan 4 18:36:25 2016 +0000
Committer: Sandhya Sundaresan <sa...@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;