Merge pull request #5310 from taosdata/feature/query
[td-3016] <fix>: fix sum error for unsigned data type.
This commit is contained in:
commit
b6c3ef5b62
|
@ -93,6 +93,7 @@ typedef struct SSpreadInfo {
|
|||
typedef struct SSumInfo {
|
||||
union {
|
||||
int64_t isum;
|
||||
uint64_t usum;
|
||||
double dsum;
|
||||
};
|
||||
int8_t hasResult;
|
||||
|
@ -595,6 +596,18 @@ static void do_sum_f(SQLFunctionCtx *pCtx, int32_t index) {
|
|||
*res += GET_INT32_VAL(pData);
|
||||
} else if (pCtx->inputType == TSDB_DATA_TYPE_BIGINT) {
|
||||
*res += GET_INT64_VAL(pData);
|
||||
} else if (pCtx->inputType == TSDB_DATA_TYPE_UTINYINT) {
|
||||
uint64_t *r = (uint64_t *)pCtx->pOutput;
|
||||
*r += GET_UINT8_VAL(pData);
|
||||
} else if (pCtx->inputType == TSDB_DATA_TYPE_USMALLINT) {
|
||||
uint64_t *r = (uint64_t *)pCtx->pOutput;
|
||||
*r += GET_UINT16_VAL(pData);
|
||||
} else if (pCtx->inputType == TSDB_DATA_TYPE_UINT) {
|
||||
uint64_t *r = (uint64_t *)pCtx->pOutput;
|
||||
*r += GET_UINT32_VAL(pData);
|
||||
} else if (pCtx->inputType == TSDB_DATA_TYPE_UBIGINT) {
|
||||
uint64_t *r = (uint64_t *)pCtx->pOutput;
|
||||
*r += GET_UINT64_VAL(pData);
|
||||
} else if (pCtx->inputType == TSDB_DATA_TYPE_DOUBLE) {
|
||||
double *retVal = (double*) pCtx->pOutput;
|
||||
*retVal += GET_DOUBLE_VAL(pData);
|
||||
|
@ -644,20 +657,14 @@ static void sum_func_merge(SQLFunctionCtx *pCtx) {
|
|||
|
||||
notNullElems++;
|
||||
|
||||
switch (type) {
|
||||
case TSDB_DATA_TYPE_TINYINT:
|
||||
case TSDB_DATA_TYPE_SMALLINT:
|
||||
case TSDB_DATA_TYPE_INT:
|
||||
case TSDB_DATA_TYPE_BIGINT: {
|
||||
if (IS_SIGNED_NUMERIC_TYPE(type)) {
|
||||
*(int64_t *)pCtx->pOutput += pInput->isum;
|
||||
break;
|
||||
};
|
||||
case TSDB_DATA_TYPE_FLOAT:
|
||||
case TSDB_DATA_TYPE_DOUBLE: {
|
||||
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
||||
*(uint64_t *) pCtx->pOutput += pInput->usum;
|
||||
} else {
|
||||
*(double *)pCtx->pOutput += pInput->dsum;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SET_VAL(pCtx, notNullElems, 1);
|
||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||
|
|
Loading…
Reference in New Issue