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;