[GitHub] trafodion pull request #1444: [TRAFODION-2157] add MySQL function unix_times...
Github user traflm commented on a diff in the pull request: https://github.com/apache/trafodion/pull/1444#discussion_r168649121 --- Diff: core/sql/exp/exp_function.cpp --- @@ -2501,6 +2518,100 @@ ex_expr::exp_return_type ExFunctionReverseStr::eval(char *op_data[], return ex_expr::EXPR_OK; }; +ex_expr::exp_return_type ex_function_sleep::eval(char *op_data[], + CollHeap* heap, + ComDiagsArea** diagsArea) +{ + Int32 sec = 0; + switch (getOperand(1)->getDatatype()) + { +case REC_BIN8_SIGNED: + sec = *(Int8 *)op_data[1] ; + if(sec < 0 ) + { +ExRaiseSqlError(heap, diagsArea, EXE_BAD_ARG_TO_MATH_FUNC); +*(*diagsArea) << DgString0("SLEEP"); +return ex_expr::EXPR_ERROR; + } + sleep(sec); + *(Int64 *)op_data[0] = 1; + break; + +case REC_BIN16_SIGNED: + sec = *(short *)op_data[1] ; + if(sec < 0 ) + { +ExRaiseSqlError(heap, diagsArea, EXE_BAD_ARG_TO_MATH_FUNC); +*(*diagsArea) << DgString0("SLEEP"); +return ex_expr::EXPR_ERROR; + } + sleep(sec); + *(Int64 *)op_data[0] = 1; + break; + +case REC_BIN32_SIGNED: + *(Lng32 *)sec = labs(*(Lng32 *)op_data[1]); + if(sec < 0 ) + { +ExRaiseSqlError(heap, diagsArea, EXE_BAD_ARG_TO_MATH_FUNC); +*(*diagsArea) << DgString0("SLEEP"); +return ex_expr::EXPR_ERROR; + } + sleep(sec); + *(Int64 *)op_data[0] = 1; + break; + +case REC_BIN64_SIGNED: + sec = *(Int64 *)op_data[1]; + if(sec < 0 ) + { +ExRaiseSqlError(heap, diagsArea, EXE_BAD_ARG_TO_MATH_FUNC); +*(*diagsArea) << DgString0("SLEEP"); +return ex_expr::EXPR_ERROR; + } + sleep(sec); + *(Int64 *)op_data[0] = 1; + break; + +default: +ExRaiseSqlError(heap, diagsArea, EXE_BAD_ARG_TO_MATH_FUNC); +*(*diagsArea) << DgString0("SLEEP"); + return ex_expr::EXPR_ERROR; + break; + } + //get the seconds to sleep + return ex_expr::EXPR_OK; +} + +ex_expr::exp_return_type ex_function_unixtime::eval(char *op_data[], + CollHeap* heap, + ComDiagsArea** diagsArea) +{ + char *opData = op_data[1]; + //if there is input value + if(opData[0] != 0 && getNumOperands() == 2) + { +struct tm* ptr; +char* r = strptime(opData, "%Y-%m-%d %H:%M:%S", ptr); +if( r == NULL) --- End diff -- Thanks Dave, you are correct. We want to be very strict here. I will add this checking. ---
[GitHub] trafodion pull request #1444: [TRAFODION-2157] add MySQL function unix_times...
Github user DaveBirdsall commented on a diff in the pull request: https://github.com/apache/trafodion/pull/1444#discussion_r168606746 --- Diff: core/sql/exp/exp_function.cpp --- @@ -2501,6 +2518,100 @@ ex_expr::exp_return_type ExFunctionReverseStr::eval(char *op_data[], return ex_expr::EXPR_OK; }; +ex_expr::exp_return_type ex_function_sleep::eval(char *op_data[], + CollHeap* heap, + ComDiagsArea** diagsArea) +{ + Int32 sec = 0; + switch (getOperand(1)->getDatatype()) + { +case REC_BIN8_SIGNED: + sec = *(Int8 *)op_data[1] ; + if(sec < 0 ) + { +ExRaiseSqlError(heap, diagsArea, EXE_BAD_ARG_TO_MATH_FUNC); +*(*diagsArea) << DgString0("SLEEP"); +return ex_expr::EXPR_ERROR; + } + sleep(sec); + *(Int64 *)op_data[0] = 1; + break; + +case REC_BIN16_SIGNED: + sec = *(short *)op_data[1] ; + if(sec < 0 ) + { +ExRaiseSqlError(heap, diagsArea, EXE_BAD_ARG_TO_MATH_FUNC); +*(*diagsArea) << DgString0("SLEEP"); +return ex_expr::EXPR_ERROR; + } + sleep(sec); + *(Int64 *)op_data[0] = 1; + break; + +case REC_BIN32_SIGNED: + *(Lng32 *)sec = labs(*(Lng32 *)op_data[1]); + if(sec < 0 ) + { +ExRaiseSqlError(heap, diagsArea, EXE_BAD_ARG_TO_MATH_FUNC); +*(*diagsArea) << DgString0("SLEEP"); +return ex_expr::EXPR_ERROR; + } + sleep(sec); + *(Int64 *)op_data[0] = 1; + break; + +case REC_BIN64_SIGNED: + sec = *(Int64 *)op_data[1]; + if(sec < 0 ) + { +ExRaiseSqlError(heap, diagsArea, EXE_BAD_ARG_TO_MATH_FUNC); +*(*diagsArea) << DgString0("SLEEP"); +return ex_expr::EXPR_ERROR; + } + sleep(sec); + *(Int64 *)op_data[0] = 1; + break; + +default: +ExRaiseSqlError(heap, diagsArea, EXE_BAD_ARG_TO_MATH_FUNC); +*(*diagsArea) << DgString0("SLEEP"); + return ex_expr::EXPR_ERROR; + break; + } + //get the seconds to sleep + return ex_expr::EXPR_OK; +} + +ex_expr::exp_return_type ex_function_unixtime::eval(char *op_data[], + CollHeap* heap, + ComDiagsArea** diagsArea) +{ + char *opData = op_data[1]; + //if there is input value + if(opData[0] != 0 && getNumOperands() == 2) + { +struct tm* ptr; +char* r = strptime(opData, "%Y-%m-%d %H:%M:%S", ptr); +if( r == NULL) --- End diff -- Should we also test for *r pointing to a null character? See the man page for strptime. If there is garbage data after the seconds field, r will point to the first byte of the garbage. I'm guessing we want to raise an error in that case. Consider a test of the form "if ((r == NULL) || (*r != '\0'))" ---
[GitHub] trafodion pull request #1444: [TRAFODION-2157] add MySQL function unix_times...
GitHub user traflm opened a pull request: https://github.com/apache/trafodion/pull/1444 [TRAFODION-2157] add MySQL function unix_timestamp,uuid,sleep This is to add three MySQL compatible functions into Trafodion. It is required for another JIRA to add unix_timestamp, uuid as default value of a column definition. sleep is simple to add, so add with this change as well. The document will be updated for a separate JIRA asap. You can merge this pull request into a Git repository by running: $ git pull https://github.com/traflm/trafodion TRAFODION-2157 Alternatively you can review and apply these changes as the patch at: https://github.com/apache/trafodion/pull/1444.patch To close this pull request, make a commit to your master/trunk branch with (at least) the following in the commit message: This closes #1444 commit dbe4cac9c8e58c8dc9c6b86b5c473320df5c44c3 Author: Liu MingDate: 2018-02-14T08:57:58Z [TRAFODION-2157] add MySQL function unix_timestamp,uuid,sleep commit 3555983cdeb03059277913babd646400f5f319ff Author: Liu Ming Date: 2018-02-14T08:58:30Z Merge branch 'master' of git://git.apache.org/trafodion into TRAFODION-2157 commit 3c6bce6e10e8f319bcdeffa272ffc4ac31a74f48 Author: Liu Ming Date: 2018-02-14T21:51:10Z [TRAFODION-2157] fix various issues ---