提交 0fe77092 编写于 作者: S shenglian zhou

make tsdb_func_arithm scalar and pass test scalar_pow.sim

上级 608be1e9
...@@ -3699,7 +3699,7 @@ static bool functionCompatibleCheck(SQueryInfo* pQueryInfo, bool joinQuery, bool ...@@ -3699,7 +3699,7 @@ static bool functionCompatibleCheck(SQueryInfo* pQueryInfo, bool joinQuery, bool
++prjNum; ++prjNum;
} }
if (functionId == TSDB_FUNC_CEIL || functionId == TSDB_FUNC_FLOOR || functionId == TSDB_FUNC_ROUND) { if (IS_SCALAR_FUNCTION(functionId)) {
++scalarFuncNum; ++scalarFuncNum;
} }
...@@ -3707,6 +3707,10 @@ static bool functionCompatibleCheck(SQueryInfo* pQueryInfo, bool joinQuery, bool ...@@ -3707,6 +3707,10 @@ static bool functionCompatibleCheck(SQueryInfo* pQueryInfo, bool joinQuery, bool
++scalarFuncNum; ++scalarFuncNum;
} }
if (functionId == TSDB_FUNC_ARITHM) {
++scalarFuncNum;
}
if (functionId == TSDB_FUNC_PRJ && (pExpr1->base.colInfo.colId == PRIMARYKEY_TIMESTAMP_COL_INDEX || TSDB_COL_IS_UD_COL(pExpr1->base.colInfo.flag))) { if (functionId == TSDB_FUNC_PRJ && (pExpr1->base.colInfo.colId == PRIMARYKEY_TIMESTAMP_COL_INDEX || TSDB_COL_IS_UD_COL(pExpr1->base.colInfo.flag))) {
continue; continue;
} }
...@@ -4363,6 +4367,7 @@ static int32_t validateArithmeticSQLFunc(SSqlCmd* pCmd, tSqlExpr* pExpr, ...@@ -4363,6 +4367,7 @@ static int32_t validateArithmeticSQLFunc(SSqlCmd* pCmd, tSqlExpr* pExpr,
*uid = id; *uid = id;
} else { } else {
pExpr->functionId = functionId;
size_t numChilds = taosArrayGetSize(pExpr->Expr.paramList); size_t numChilds = taosArrayGetSize(pExpr->Expr.paramList);
for (int i = 0; i < numChilds; ++i) { for (int i = 0; i < numChilds; ++i) {
tSqlExprItem* pParamElem= taosArrayGet(pExpr->Expr.paramList, i); tSqlExprItem* pParamElem= taosArrayGet(pExpr->Expr.paramList, i);
......
...@@ -413,13 +413,62 @@ _arithmetic_operator_fn_t getArithmeticOperatorFn(int32_t arithmeticOptr) { ...@@ -413,13 +413,62 @@ _arithmetic_operator_fn_t getArithmeticOperatorFn(int32_t arithmeticOptr) {
} }
void vectorPow(tExprOperandInfo* pInputs, uint8_t numInputs, tExprOperandInfo* pOutput, int32_t order) { void vectorPow(tExprOperandInfo* pInputs, uint8_t numInputs, tExprOperandInfo* pOutput, int32_t order) {
assert(numInputs == 2);
assert(pInputs[1].numOfRows == 1 || pInputs[0].numOfRows == 1 || pInputs[0].numOfRows == pInputs[1].numOfRows );
int numOfRows = (pInputs[0].numOfRows > pInputs[1].numOfRows) ? pInputs[0].numOfRows : pInputs[1].numOfRows;
if (pInputs[1].numOfRows == 1) {
double base = 0;
GET_TYPED_DATA(base, double, pInputs[1].type, pInputs[1].data);
for (int i = 0; i < numOfRows; ++i) {
char* pInputData = pInputs[0].data + i * pInputs[0].bytes;
char* pOutputData = pOutput->data + i * pOutput->bytes;
if (isNull(pInputData, pInputs[0].type)) {
setNull(pOutputData, pOutput->type, pOutput->bytes);
} else {
double v1 = 0;
GET_TYPED_DATA(v1, double, pInputs[0].type, pInputData);
double result = pow(v1, base);
SET_TYPED_DATA(pOutputData, pOutput->type, result);
}
}
} else {
assert(0);
}
}
void vectorLog(tExprOperandInfo* pInputs, uint8_t numInputs, tExprOperandInfo* pOutput, int32_t order) {
assert(numInputs == 2);
assert(pInputs[1].numOfRows == 1 || pInputs[0].numOfRows == 1 || pInputs[0].numOfRows == pInputs[1].numOfRows );
int numOfRows = (pInputs[0].numOfRows > pInputs[1].numOfRows) ? pInputs[0].numOfRows : pInputs[1].numOfRows;
if (pInputs[1].numOfRows == 1) {
double base = 0;
GET_TYPED_DATA(base, double, pInputs[1].type, pInputs[1].data);
for (int i = 0; i < numOfRows; ++i) {
char* pInputData = pInputs[0].data + i * pInputs[0].bytes;
char* pOutputData = pOutput->data + i * pOutput->bytes;
if (isNull(pInputData, pInputs[0].type)) {
setNull(pOutputData, pOutput->type, pOutput->bytes);
} else {
double v1 = 0;
GET_TYPED_DATA(v1, double, pInputs[0].type, pInputData);
double result = log(v1) / log(base);
SET_TYPED_DATA(pOutputData, pOutput->type, result);
}
}
} else {
assert(0);
}
} }
_expr_scalar_function_t getExprScalarFunction(uint16_t scalarFunc) { _expr_scalar_function_t getExprScalarFunction(uint16_t scalarFunc) {
switch (scalarFunc) { switch (scalarFunc) {
case TSDB_FUNC_SCALAR_POW: case TSDB_FUNC_SCALAR_POW:
return vectorPow; return vectorPow;
case TSDB_FUNC_SCALAR_LOG:
return vectorLog;
default: default:
assert(0); assert(0);
return NULL; return NULL;
......
...@@ -220,12 +220,24 @@ void exprTreeFunctionNodeTraverse(tExprNode *pExpr, int32_t numOfRows, char *pOu ...@@ -220,12 +220,24 @@ void exprTreeFunctionNodeTraverse(tExprNode *pExpr, int32_t numOfRows, char *pOu
if (order == TSDB_ORDER_DESC) { if (order == TSDB_ORDER_DESC) {
pChildrenOutput[i] = malloc(sizeof(int64_t) * numOfRows); pChildrenOutput[i] = malloc(sizeof(int64_t) * numOfRows);
reverseCopy(pChildrenOutput[i], pInputData, pChild->pSchema->type, numOfRows); reverseCopy(pChildrenOutput[i], pInputData, pChild->pSchema->type, numOfRows);
pInputs[i].data = pInputData; pInputs[i].data = pChildrenOutput[i];
} else { } else {
pInputs[i].data = pInputData; pInputs[i].data = pInputData;
} }
pInputs[i].type = pChild->pSchema->type;
pInputs[i].bytes = pChild->pSchema->bytes;
} else if (pChild->nodeType == TSQL_NODE_VALUE) { } else if (pChild->nodeType == TSQL_NODE_VALUE) {
pInputs[i].data = (char*)&(pChild->pVal->dKey); int32_t len = pChild->pVal->nLen;
if (IS_VAR_DATA_TYPE(pChild->pVal->nType)) {
len = len + VARSTR_HEADER_SIZE;
} else {
len = tDataTypes[pChild->pVal->nType].bytes;
}
pChildrenOutput[i] = malloc(len);
tVariantDump(pChild->pVal, pChildrenOutput[i], pChild->pVal->nType, true);
pInputs[i].data = pChildrenOutput[i];
pInputs[i].type = pChild->pVal->nType;
pInputs[i].bytes = len;
pInputs[i].numOfRows = 1; pInputs[i].numOfRows = 1;
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册