You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by ry...@apache.org on 2016/11/28 04:35:10 UTC

[1/4] incubator-trafodion git commit: [TRAFODION-2229]SHA2 function enhancement

Repository: incubator-trafodion
Updated Branches:
  refs/heads/master f1238e00f -> 664a2bb3e


[TRAFODION-2229]SHA2 function enhancement

SHA2 support more funtcions than SHA-256. Now, it support SHA-224,
     SHA-256, SHA-384, SHA-512.

SHA2(str, hash_length)
The first argument is the string to be hashed.
The second is the desired bit length of the result, which must have a
value of 224, 256, 384, 512, or 0(which is same with 256).


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/964fc401
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/964fc401
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/964fc401

Branch: refs/heads/master
Commit: 964fc401ac85d05997b0b3273ebb854d0ed3e80a
Parents: f1238e0
Author: Weiqing Xu <we...@esgyn.cn>
Authored: Tue Nov 22 05:21:02 2016 +0000
Committer: Weiqing Xu <we...@esgyn.cn>
Committed: Sun Nov 27 14:39:06 2016 +0000

----------------------------------------------------------------------
 core/sql/exp/exp_function.cpp               | 80 +++++++++++++++++++++---
 core/sql/optimizer/SynthType.cpp            | 32 +++++++++-
 core/sql/parser/sqlparser.y                 |  4 +-
 core/sql/regress/compGeneral/EXPECTED006.SB | 45 +++++++++++++
 core/sql/regress/compGeneral/TEST006        |  6 ++
 5 files changed, 154 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/964fc401/core/sql/exp/exp_function.cpp
----------------------------------------------------------------------
diff --git a/core/sql/exp/exp_function.cpp b/core/sql/exp/exp_function.cpp
index af9845b..cfd98d2 100644
--- a/core/sql/exp/exp_function.cpp
+++ b/core/sql/exp/exp_function.cpp
@@ -252,7 +252,7 @@ ExFunctionSha::ExFunctionSha(OperatorTypeEnum oper_type,
 
 ExFunctionSha2::ExFunctionSha2(OperatorTypeEnum oper_type,
 			       Attributes ** attr, Space * space)
-     : ex_function_clause(oper_type, 2, attr, space)
+     : ex_function_clause(oper_type, 3, attr, space)
 {
   
 };
@@ -7962,37 +7962,97 @@ ex_expr::exp_return_type ExFunctionCrc32::eval(char * op_data[],
   return ex_expr::EXPR_OK;
 }
 
-//only support SHA 256 for this version
-//TBD: add 224 and 384, 512 in next version
 ex_expr::exp_return_type ExFunctionSha2::eval(char * op_data[],
                                                         CollHeap *heap,
                                                         ComDiagsArea **diags)
 {
 
-  unsigned char sha[SHA256_DIGEST_LENGTH+ 1]={0};  
+  unsigned char sha[SHA512_DIGEST_LENGTH + 1] = {0};
 
   Attributes *resultAttr   = getOperand(0);
   Attributes *srcAttr   = getOperand(1);
 
   Lng32 slen = srcAttr->getLength(op_data[-MAX_OPERANDS+1]);
-  Lng32 rlen = resultAttr->getLength();
+
+  Lng32 hash_len= *(Lng32 *)op_data[2];
+
+  // the length of result
+  Lng32 rlen = SHA512_DIGEST_LENGTH;
 
   str_pad(op_data[0], rlen, ' ');
 
-  SHA256_CTX  sha_ctx;
+  switch (hash_len) {
+    case 0:
+    case 256:
+      SHA256_CTX sha_ctx_256;
+      if (!SHA256_Init(&sha_ctx_256))
+        goto sha2_error;
+      if (!SHA256_Update(&sha_ctx_256, op_data[1], slen))
+        goto sha2_error;
+      if (!SHA256_Final((unsigned char *)sha, &sha_ctx_256))
+        goto sha2_error;
+
+      rlen = SHA256_DIGEST_LENGTH;
+      break;
+
+    case 224:
+      SHA256_CTX sha_ctx_224;
+
+      if (!SHA224_Init(&sha_ctx_224))
+        goto sha2_error;
+      if (!SHA224_Update(&sha_ctx_224, op_data[1], slen))
+        goto sha2_error;
+      if (!SHA224_Final((unsigned char *)sha, &sha_ctx_224))
+        goto sha2_error;
+
+      rlen = SHA224_DIGEST_LENGTH;
+      break;
+
+    case 384:
+      SHA512_CTX sha_ctx_384;
+      if (!SHA384_Init(&sha_ctx_384))
+        goto sha2_error;
+      if (!SHA384_Update(&sha_ctx_384, op_data[1], slen))
+        goto sha2_error;
+      if (!SHA384_Final((unsigned char *)sha, &sha_ctx_384))
+        goto sha2_error;
+
+      rlen = SHA384_DIGEST_LENGTH;
+      break;
+
+    case 512:
+      SHA512_CTX sha_ctx_512;
+      if (!SHA512_Init(&sha_ctx_512))
+        goto sha2_error;
+      if (!SHA512_Update(&sha_ctx_512, op_data[1], slen))
+        goto sha2_error;
+      if (!SHA512_Final((unsigned char *)sha, &sha_ctx_512))
+        goto sha2_error;
+
+      rlen = SHA512_DIGEST_LENGTH;
+      break;
+
+    default:
+      ExRaiseSqlError(heap, diags, EXE_BAD_ARG_TO_MATH_FUNC);
+      *(*diags) << DgString0("SHA2");
+      return ex_expr::EXPR_ERROR;
+  }
 
-  SHA256_Init(&sha_ctx);  
-  SHA256_Update(&sha_ctx, op_data[1], slen);
-  SHA256_Final((unsigned char*) sha,&sha_ctx); 
   char tmp[3];
-  for(int i=0; i < SHA256_DIGEST_LENGTH; i++ )
+  for(int i=0; i < rlen; i++ )
   {
     tmp[0]=tmp[1]=tmp[2]='0';
     sprintf(tmp, "%.2x", (int)sha[i]);
     str_cpy_all(op_data[0]+i*2, tmp, 2);
   }
    
+  getOperand(0)->setVarLength(rlen * 2, op_data[-MAX_OPERANDS]);
   return ex_expr::EXPR_OK;
+sha2_error:
+  ExRaiseFunctionSqlError(heap, diags, EXE_INTERNAL_ERROR,
+                          derivedFunction(),
+                          origFunctionOperType());
+  return ex_expr::EXPR_ERROR;
 }
 
 ex_expr::exp_return_type ExFunctionSha::eval(char * op_data[],

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/964fc401/core/sql/optimizer/SynthType.cpp
----------------------------------------------------------------------
diff --git a/core/sql/optimizer/SynthType.cpp b/core/sql/optimizer/SynthType.cpp
index c180e9f..e62c8af 100644
--- a/core/sql/optimizer/SynthType.cpp
+++ b/core/sql/optimizer/SynthType.cpp
@@ -1011,7 +1011,6 @@ const NAType *BuiltinFunction::synthesizeType()
       }
     break;
     case ITM_SHA1:
-    case ITM_SHA2:
       {
         // type cast any params
         ValueId vid1 = child(0)->getValueId();
@@ -1034,6 +1033,37 @@ const NAType *BuiltinFunction::synthesizeType()
 	  }
       }
     break;
+
+    case ITM_SHA2:
+      {
+        ValueId vid1 = child(0)->getValueId();
+        SQLChar c1(ComSqlId::MAX_QUERY_ID_LEN);
+        vid1.coerceType(c1, NA_CHARACTER_TYPE);
+
+        const NAType &typ1 = child(0)->getValueId().getType();
+
+        if (typ1.getTypeQualifier() != NA_CHARACTER_TYPE)
+        {
+          *CmpCommon::diags() << DgSqlCode(-4067) << DgString0("SHA2");
+          return NULL;
+        }
+
+        // type cast any params
+        ValueId vid = child(0)->getValueId();
+        vid.coerceType(NA_NUMERIC_TYPE);
+        const NAType &typ2 = child(1)->getValueId().getType();
+
+        if (typ2.getTypeQualifier() != NA_NUMERIC_TYPE)
+        {
+          *CmpCommon::diags() << DgSqlCode(-4045) << DgString0("SHA2");
+          return NULL;
+        }
+
+        retType = new HEAP
+          SQLVarChar(1024, typ1.supportsSQLnull());
+      }
+    break;
+
     case ITM_MD5:
       {
         // type cast any params

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/964fc401/core/sql/parser/sqlparser.y
----------------------------------------------------------------------
diff --git a/core/sql/parser/sqlparser.y b/core/sql/parser/sqlparser.y
index 8fa5728..060b167 100755
--- a/core/sql/parser/sqlparser.y
+++ b/core/sql/parser/sqlparser.y
@@ -9695,12 +9695,12 @@ misc_function :
                             1, $3);
                 }
 
-     | TOK_SHA2 '(' value_expression ')'
+     | TOK_SHA2 '(' value_expression, ',', value_expression ')'
                 {
                     $$ = new (PARSERHEAP())
                     BuiltinFunction(ITM_SHA2,
                             CmpCommon::statementHeap(),
-                            1, $3);
+                            2, $3, $5);
                 }
 
      | TOK_MD5 '(' value_expression ')'

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/964fc401/core/sql/regress/compGeneral/EXPECTED006.SB
----------------------------------------------------------------------
diff --git a/core/sql/regress/compGeneral/EXPECTED006.SB b/core/sql/regress/compGeneral/EXPECTED006.SB
index 67a57da..6ff0a64 100644
--- a/core/sql/regress/compGeneral/EXPECTED006.SB
+++ b/core/sql/regress/compGeneral/EXPECTED006.SB
@@ -1779,4 +1779,49 @@ Lane L500
 Lynn L500
 
 --- 2 row(s) selected.
+>>select sha2('the original data', 0) from dual;
+
+(EXPR)
+----------
+
+38fd175fead1af0a96f46a9ed32d443857c16d0069c19e0cd7239340a1f94334
+
+--- 1 row(s) selected.
+>>select sha2('the original data', 128) from dual;
+
+*** ERROR[8428] The argument to function SHA2 is not valid.
+
+--- 0 row(s) selected.
+>>select sha2('the original data', 224) from dual;
+
+(EXPR)
+----------
+
+82e1dae1bc1b2d862d30ddb6e16a717e5de6a143ab8c56c32a310a5b
+
+--- 1 row(s) selected.
+>>select sha2('the original data', 256) from dual;
+
+(EXPR)
+----------
+
+38fd175fead1af0a96f46a9ed32d443857c16d0069c19e0cd7239340a1f94334
+
+--- 1 row(s) selected.
+>>select sha2('the original data', 384) from dual;
+
+(EXPR)
+----------
+
+bc0050f3ff7a540c74a42664c53a7f9fd485622374a43eb4a62cd84e48f483237bed50f6562f8c6e405454c4dbb0d4a3
+
+--- 1 row(s) selected.
+>>select sha2('the original data', 512) from dual;
+
+(EXPR)
+----------
+
+18091a172d94aae1ae530ced02bde7f022229f446348f5d3b36989c2e6fd59f5252c7a7f8ecb71a74cb724448243ff71651f87aed155aee7340fad1b02567b60
+
+--- 1 row(s) selected.
 >>log;

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/964fc401/core/sql/regress/compGeneral/TEST006
----------------------------------------------------------------------
diff --git a/core/sql/regress/compGeneral/TEST006 b/core/sql/regress/compGeneral/TEST006
index 2ee1598..edee936 100644
--- a/core/sql/regress/compGeneral/TEST006
+++ b/core/sql/regress/compGeneral/TEST006
@@ -673,3 +673,9 @@ select name, SOUNDEX(name) from t006emp1 where SOUNDEX(name)=SOUNDEX('Lynn');
 select name, SOUNDEX(name) from t006emp2 where SOUNDEX(name)=SOUNDEX('Jon');
 select name, SOUNDEX(name) from t006emp2 where SOUNDEX(name)=SOUNDEX('Roy');
 select name, SOUNDEX(name) from t006emp2 where SOUNDEX(name)=SOUNDEX('Lynn');
+select sha2('the original data', 0) from dual;
+select sha2('the original data', 128) from dual;
+select sha2('the original data', 224) from dual;
+select sha2('the original data', 256) from dual;
+select sha2('the original data', 384) from dual;
+select sha2('the original data', 512) from dual;


[4/4] incubator-trafodion git commit: Merge [TRAFODION-2229] PR-849 SHA2 function enhancement

Posted by ry...@apache.org.
Merge [TRAFODION-2229] PR-849 SHA2 function enhancement


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/664a2bb3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/664a2bb3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/664a2bb3

Branch: refs/heads/master
Commit: 664a2bb3e90b4f70381d3e0a30de81b497b11f6f
Parents: 7098095 34465b7
Author: ryzuo <jo...@gmail.com>
Authored: Mon Nov 28 04:35:21 2016 +0000
Committer: ryzuo <jo...@gmail.com>
Committed: Mon Nov 28 04:35:21 2016 +0000

----------------------------------------------------------------------
 core/sql/bin/SqlciErrors.txt                |   2 +
 core/sql/common/OperTypeEnum.h              |   8 +-
 core/sql/exp/ExpPackDefs.cpp                |   5 +
 core/sql/exp/exp_clause.cpp                 |  29 +++-
 core/sql/exp/exp_clause.h                   |   3 +-
 core/sql/exp/exp_clause_derived.h           | 169 +++++++++++++++++++++++
 core/sql/exp/exp_function.cpp               |  82 +++++++++--
 core/sql/exp/exp_function.h                 |   6 +-
 core/sql/exp/exp_like.cpp                   |  80 +++++++++++
 core/sql/generator/GenItemFunc.cpp          |  33 ++++-
 core/sql/optimizer/BindItemExpr.cpp         |  20 ++-
 core/sql/optimizer/ItemCache.cpp            |   4 +-
 core/sql/optimizer/ItemExpr.cpp             |  40 +++++-
 core/sql/optimizer/ItemFunc.h               | 104 ++++++++++++--
 core/sql/optimizer/NormItemExpr.cpp         |   2 +-
 core/sql/optimizer/SynthType.cpp            |  43 +++++-
 core/sql/parser/ParKeyWords.cpp             |   1 +
 core/sql/parser/sqlparser.y                 |  52 ++++++-
 core/sql/regress/compGeneral/EXPECTED006.SB |  52 ++++++-
 core/sql/regress/compGeneral/TEST006        |   6 +
 core/sql/regress/executor/EXPECTED002.SB    |  99 ++++++++++++-
 core/sql/regress/executor/TEST002           |  29 +++-
 22 files changed, 802 insertions(+), 67 deletions(-)
----------------------------------------------------------------------



[2/4] incubator-trafodion git commit: return fixed length char for SHA2 function

Posted by ry...@apache.org.
return fixed length char for SHA2 function


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/e6ab8154
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/e6ab8154
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/e6ab8154

Branch: refs/heads/master
Commit: e6ab8154756ad2ec3976d7a99977e812d2d262ee
Parents: 964fc40
Author: Weiqing Xu <we...@esgyn.cn>
Authored: Wed Nov 23 11:44:39 2016 +0000
Committer: Weiqing Xu <we...@esgyn.cn>
Committed: Sun Nov 27 14:41:18 2016 +0000

----------------------------------------------------------------------
 core/sql/common/OperTypeEnum.h              |  5 ++-
 core/sql/exp/exp_clause.cpp                 |  5 ++-
 core/sql/exp/exp_function.cpp               | 14 +++-----
 core/sql/exp/exp_function.h                 |  6 +++-
 core/sql/generator/GenItemFunc.cpp          | 25 ++++++++++++--
 core/sql/optimizer/BindItemExpr.cpp         |  4 +++
 core/sql/optimizer/SynthType.cpp            | 33 +++++++++++-------
 core/sql/parser/sqlparser.y                 | 43 +++++++++++++++++++++---
 core/sql/regress/compGeneral/EXPECTED006.SB |  5 +--
 9 files changed, 107 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/e6ab8154/core/sql/common/OperTypeEnum.h
----------------------------------------------------------------------
diff --git a/core/sql/common/OperTypeEnum.h b/core/sql/common/OperTypeEnum.h
index 109485c..f1b69cd 100644
--- a/core/sql/common/OperTypeEnum.h
+++ b/core/sql/common/OperTypeEnum.h
@@ -794,7 +794,10 @@ enum OperatorTypeEnum {
                         ITM_CRC32     = 2634,
                         ITM_MD5       = 2635,
                         ITM_SHA1      = 2636,
-                        ITM_SHA2      = 2637,
+                        ITM_SHA2_256  = 2637,
+                        ITM_SHA2_224  = 2638,
+                        ITM_SHA2_384  = 2639,
+                        ITM_SHA2_512  = 2640,
 
                         // Items for needed for Translating to UCS2 output strings
                         ITM_DATEFMT     = 2990,

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/e6ab8154/core/sql/exp/exp_clause.cpp
----------------------------------------------------------------------
diff --git a/core/sql/exp/exp_clause.cpp b/core/sql/exp/exp_clause.cpp
index 5ccd0d9..46beabd 100644
--- a/core/sql/exp/exp_clause.cpp
+++ b/core/sql/exp/exp_clause.cpp
@@ -344,7 +344,10 @@ ex_clause::ex_clause(clause_type type,
         case ITM_SHA1:
           setClassID(FUNC_SHA1_ID);
           break;
-        case ITM_SHA2:
+        case ITM_SHA2_224:
+        case ITM_SHA2_256:
+        case ITM_SHA2_384:
+        case ITM_SHA2_512:
           setClassID(FUNC_SHA2_ID);
           break;
         case ITM_MD5:

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/e6ab8154/core/sql/exp/exp_function.cpp
----------------------------------------------------------------------
diff --git a/core/sql/exp/exp_function.cpp b/core/sql/exp/exp_function.cpp
index cfd98d2..4096309 100644
--- a/core/sql/exp/exp_function.cpp
+++ b/core/sql/exp/exp_function.cpp
@@ -251,8 +251,8 @@ ExFunctionSha::ExFunctionSha(OperatorTypeEnum oper_type,
 };
 
 ExFunctionSha2::ExFunctionSha2(OperatorTypeEnum oper_type,
-			       Attributes ** attr, Space * space)
-     : ex_function_clause(oper_type, 3, attr, space)
+			       Attributes ** attr, Space * space, Lng32 mode)
+     : ex_function_clause(oper_type, 2, attr, space), mode(mode)
 {
   
 };
@@ -7974,14 +7974,10 @@ ex_expr::exp_return_type ExFunctionSha2::eval(char * op_data[],
 
   Lng32 slen = srcAttr->getLength(op_data[-MAX_OPERANDS+1]);
 
-  Lng32 hash_len= *(Lng32 *)op_data[2];
-
   // the length of result
   Lng32 rlen = SHA512_DIGEST_LENGTH;
 
-  str_pad(op_data[0], rlen, ' ');
-
-  switch (hash_len) {
+  switch (mode) {
     case 0:
     case 256:
       SHA256_CTX sha_ctx_256;
@@ -8037,6 +8033,7 @@ ex_expr::exp_return_type ExFunctionSha2::eval(char * op_data[],
       *(*diags) << DgString0("SHA2");
       return ex_expr::EXPR_ERROR;
   }
+  str_pad(op_data[0], rlen, ' ');
 
   char tmp[3];
   for(int i=0; i < rlen; i++ )
@@ -8045,8 +8042,7 @@ ex_expr::exp_return_type ExFunctionSha2::eval(char * op_data[],
     sprintf(tmp, "%.2x", (int)sha[i]);
     str_cpy_all(op_data[0]+i*2, tmp, 2);
   }
-   
-  getOperand(0)->setVarLength(rlen * 2, op_data[-MAX_OPERANDS]);
+
   return ex_expr::EXPR_OK;
 sha2_error:
   ExRaiseFunctionSqlError(heap, diags, EXE_INTERNAL_ERROR,

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/e6ab8154/core/sql/exp/exp_function.h
----------------------------------------------------------------------
diff --git a/core/sql/exp/exp_function.h b/core/sql/exp/exp_function.h
index 8131fa2..cc6b558 100644
--- a/core/sql/exp/exp_function.h
+++ b/core/sql/exp/exp_function.h
@@ -918,7 +918,8 @@ class SQLEXP_LIB_FUNC ExFunctionSha2: public ex_function_clause {
 public:
   NA_EIDPROC ExFunctionSha2(OperatorTypeEnum oper_type,
 				Attributes ** attr,
-				Space * space);
+				Space * space,
+                Lng32 mode);
   NA_EIDPROC ExFunctionSha2();
 
   NA_EIDPROC ex_expr::exp_return_type eval(char *op_data[], CollHeap*, 
@@ -941,6 +942,9 @@ public:
 
   NA_EIDPROC virtual short getClassSize() { return (short)sizeof(*this); }
   // ---------------------------------------------------------------------
+
+private:
+  Lng32 mode;
 };
 
 class SQLEXP_LIB_FUNC ExFunctionSoundex: public ex_function_clause {

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/e6ab8154/core/sql/generator/GenItemFunc.cpp
----------------------------------------------------------------------
diff --git a/core/sql/generator/GenItemFunc.cpp b/core/sql/generator/GenItemFunc.cpp
index 6a60634..f560cbc 100644
--- a/core/sql/generator/GenItemFunc.cpp
+++ b/core/sql/generator/GenItemFunc.cpp
@@ -233,11 +233,32 @@ short BuiltinFunction::codeGen(Generator * generator)
      
       break;
 
-   case ITM_SHA2:
+   case ITM_SHA2_256:
+   case ITM_SHA2_224:
+   case ITM_SHA2_384:
+   case ITM_SHA2_512:
       {
+          Lng32 mode = 0;
+          switch (getOperatorType()) {
+          case ITM_SHA2_256:
+              mode = 256;
+              break;
+
+          case ITM_SHA2_224:
+              mode = 224;
+              break;
+
+          case ITM_SHA2_384:
+              mode = 384;
+              break;
+
+          case ITM_SHA2_512:
+              mode = 512;
+              break;
+          }
          function_clause =
            new(generator->getSpace()) ExFunctionSha2(getOperatorType(),
-                                                         attr, space);
+                                                         attr, space, mode);
       }
      
       break;

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/e6ab8154/core/sql/optimizer/BindItemExpr.cpp
----------------------------------------------------------------------
diff --git a/core/sql/optimizer/BindItemExpr.cpp b/core/sql/optimizer/BindItemExpr.cpp
index 23b02aa..c4d21b5 100644
--- a/core/sql/optimizer/BindItemExpr.cpp
+++ b/core/sql/optimizer/BindItemExpr.cpp
@@ -3169,6 +3169,10 @@ ItemExpr *BuiltinFunction::bindNode(BindWA *bindWA)
     case ITM_SHA1:
     case ITM_SHA2:
     case ITM_SOUNDEX:
+    case ITM_SHA2_224:
+    case ITM_SHA2_256:
+    case ITM_SHA2_384:
+    case ITM_SHA2_512:
       {
          break;
       }

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/e6ab8154/core/sql/optimizer/SynthType.cpp
----------------------------------------------------------------------
diff --git a/core/sql/optimizer/SynthType.cpp b/core/sql/optimizer/SynthType.cpp
index e62c8af..1fb7366 100644
--- a/core/sql/optimizer/SynthType.cpp
+++ b/core/sql/optimizer/SynthType.cpp
@@ -1034,7 +1034,10 @@ const NAType *BuiltinFunction::synthesizeType()
       }
     break;
 
-    case ITM_SHA2:
+    case ITM_SHA2_256:
+    case ITM_SHA2_224:
+    case ITM_SHA2_384:
+    case ITM_SHA2_512:
       {
         ValueId vid1 = child(0)->getValueId();
         SQLChar c1(ComSqlId::MAX_QUERY_ID_LEN);
@@ -1048,19 +1051,25 @@ const NAType *BuiltinFunction::synthesizeType()
           return NULL;
         }
 
-        // type cast any params
-        ValueId vid = child(0)->getValueId();
-        vid.coerceType(NA_NUMERIC_TYPE);
-        const NAType &typ2 = child(1)->getValueId().getType();
-
-        if (typ2.getTypeQualifier() != NA_NUMERIC_TYPE)
-        {
-          *CmpCommon::diags() << DgSqlCode(-4045) << DgString0("SHA2");
-          return NULL;
+        Lng32 resultLen = 0;
+        switch (getOperatorType()) {
+        case ITM_SHA2_224:
+            resultLen = (224 * 2) / 8;
+            break;
+        case ITM_SHA2_256:
+            resultLen = (256 * 2) / 8;
+            break;
+        case ITM_SHA2_384:
+            resultLen = (384 * 2) / 8;
+            break;
+        case ITM_SHA2_512:
+            resultLen = (512 * 2) / 8;
+            break;
+        default:
+            break;
         }
-
         retType = new HEAP
-          SQLVarChar(1024, typ1.supportsSQLnull());
+          SQLChar(resultLen, typ1.supportsSQLnull());
       }
     break;
 

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/e6ab8154/core/sql/parser/sqlparser.y
----------------------------------------------------------------------
diff --git a/core/sql/parser/sqlparser.y b/core/sql/parser/sqlparser.y
index 060b167..05860ba 100755
--- a/core/sql/parser/sqlparser.y
+++ b/core/sql/parser/sqlparser.y
@@ -9695,12 +9695,45 @@ misc_function :
                             1, $3);
                 }
 
-     | TOK_SHA2 '(' value_expression, ',', value_expression ')'
+     | TOK_SHA2 '(' value_expression ',' NUMERIC_LITERAL_EXACT_NO_SCALE ')'
                 {
-                    $$ = new (PARSERHEAP())
-                    BuiltinFunction(ITM_SHA2,
-                            CmpCommon::statementHeap(),
-                            2, $3, $5);
+                    int mode = atoInt64($5->data());
+                    switch (mode) {
+                    case 0:
+                    case 256:
+                        $$ = new (PARSERHEAP())
+                        BuiltinFunction(ITM_SHA2_256,
+                                        CmpCommon::statementHeap(),
+                                        1, $3);
+                        break;
+
+                    case 224:
+                        $$ = new (PARSERHEAP())
+                        BuiltinFunction(ITM_SHA2_224,
+                                        CmpCommon::statementHeap(),
+                                        1, $3);
+                        break;
+
+                    case 384:
+                        $$ = new (PARSERHEAP())
+                        BuiltinFunction(ITM_SHA2_384,
+                                        CmpCommon::statementHeap(),
+                                        1, $3);
+                        break;
+
+                    case 512:
+                        $$ = new (PARSERHEAP())
+                        BuiltinFunction(ITM_SHA2_512,
+                                        CmpCommon::statementHeap(),
+                                        1, $3);
+                        break;
+
+                    default:
+                        *SqlParser_Diags << DgSqlCode(-4045) << DgString0("SHA2");
+                        YYERROR;
+                        break;
+                    }
+
                 }
 
      | TOK_MD5 '(' value_expression ')'

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/e6ab8154/core/sql/regress/compGeneral/EXPECTED006.SB
----------------------------------------------------------------------
diff --git a/core/sql/regress/compGeneral/EXPECTED006.SB b/core/sql/regress/compGeneral/EXPECTED006.SB
index 6ff0a64..9e9d9e2 100644
--- a/core/sql/regress/compGeneral/EXPECTED006.SB
+++ b/core/sql/regress/compGeneral/EXPECTED006.SB
@@ -1789,9 +1789,10 @@ Lynn L500
 --- 1 row(s) selected.
 >>select sha2('the original data', 128) from dual;
 
-*** ERROR[8428] The argument to function SHA2 is not valid.
+*** ERROR[4045] The operand of function SHA2 must be numeric.
+
+*** ERROR[8822] The statement was not prepared.
 
---- 0 row(s) selected.
 >>select sha2('the original data', 224) from dual;
 
 (EXPR)


[3/4] incubator-trafodion git commit: update the error message for SHA2

Posted by ry...@apache.org.
update the error message for SHA2


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/34465b7a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/34465b7a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/34465b7a

Branch: refs/heads/master
Commit: 34465b7a385b4cdd0a46933cf0a4beda58a2a27c
Parents: e6ab815
Author: Weiqing Xu <we...@esgyn.cn>
Authored: Sun Nov 27 15:46:30 2016 +0000
Committer: Weiqing Xu <we...@esgyn.cn>
Committed: Sun Nov 27 15:46:30 2016 +0000

----------------------------------------------------------------------
 core/sql/optimizer/BindItemExpr.cpp         | 1 -
 core/sql/parser/sqlparser.y                 | 2 +-
 core/sql/regress/compGeneral/EXPECTED006.SB | 8 ++++----
 3 files changed, 5 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/34465b7a/core/sql/optimizer/BindItemExpr.cpp
----------------------------------------------------------------------
diff --git a/core/sql/optimizer/BindItemExpr.cpp b/core/sql/optimizer/BindItemExpr.cpp
index c4d21b5..d811efd 100644
--- a/core/sql/optimizer/BindItemExpr.cpp
+++ b/core/sql/optimizer/BindItemExpr.cpp
@@ -3167,7 +3167,6 @@ ItemExpr *BuiltinFunction::bindNode(BindWA *bindWA)
     case ITM_MD5:
     case ITM_CRC32:
     case ITM_SHA1:
-    case ITM_SHA2:
     case ITM_SOUNDEX:
     case ITM_SHA2_224:
     case ITM_SHA2_256:

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/34465b7a/core/sql/parser/sqlparser.y
----------------------------------------------------------------------
diff --git a/core/sql/parser/sqlparser.y b/core/sql/parser/sqlparser.y
index 05860ba..11f3067 100755
--- a/core/sql/parser/sqlparser.y
+++ b/core/sql/parser/sqlparser.y
@@ -9729,7 +9729,7 @@ misc_function :
                         break;
 
                     default:
-                        *SqlParser_Diags << DgSqlCode(-4045) << DgString0("SHA2");
+                        yyerror("The second operand expects 0, 224, 256, 384 or 512");
                         YYERROR;
                         break;
                     }

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/34465b7a/core/sql/regress/compGeneral/EXPECTED006.SB
----------------------------------------------------------------------
diff --git a/core/sql/regress/compGeneral/EXPECTED006.SB b/core/sql/regress/compGeneral/EXPECTED006.SB
index 9e9d9e2..741b6dc 100644
--- a/core/sql/regress/compGeneral/EXPECTED006.SB
+++ b/core/sql/regress/compGeneral/EXPECTED006.SB
@@ -1706,7 +1706,7 @@ d3d9446802a44259755d38e6d163e820   852952723  b1d5781111d84f7b3fe45a0852e59758cd
 >>select SOUNDEX('Jon') from dual;
 
 (EXPR)
-------
+----------
 
 J500
 
@@ -1714,7 +1714,7 @@ J500
 >>select SOUNDEX('Roy') from dual;
 
 (EXPR)
-------
+----------
 
 R000
 
@@ -1722,7 +1722,7 @@ R000
 >>select SOUNDEX('Lynn') from dual;
 
 (EXPR)
-------
+----------
 
 L500
 
@@ -1789,7 +1789,7 @@ Lynn L500
 --- 1 row(s) selected.
 >>select sha2('the original data', 128) from dual;
 
-*** ERROR[4045] The operand of function SHA2 must be numeric.
+*** ERROR[15002] Internal parser error: The second operand expects 0, 224, 256, 384 or 512.
 
 *** ERROR[8822] The statement was not prepared.