diff --git a/src/query/src/qAggMain.c b/src/query/src/qAggMain.c index 8bfd3c4ac9508374c51b84e2d449f074e63aaeb6..d7320fab3b4d77180810a63db5e3155e8c090799 100644 --- a/src/query/src/qAggMain.c +++ b/src/query/src/qAggMain.c @@ -4491,230 +4491,182 @@ void blockinfo_func_finalizer(SQLFunctionCtx* pCtx) { ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -#define CFR_SET_VAL(type, data, pCtx, func, i, step, notNullElems) \ +#define CFR_SET_VAL(type, data, pCtx, func, i, step) \ do { \ type *pData = (type *) data; \ type *pOutput = (type *) pCtx->pOutput; \ \ for (; i < pCtx->size && i >= 0; i += step) { \ - if (pCtx->hasNull && isNull((const char*) &pData[i], pCtx->inputType)) { \ - continue; \ + if (pCtx->hasNull && isNull((const char *)&pData[i], pCtx->inputType)) { \ + *pOutput++ = pData[i]; \ + } else { \ + *pOutput++ = (type)func((double)pData[i]); \ } \ - \ - *pOutput++ = (type) func((double) pData[i]); \ - \ - notNullElems++; \ - } \ - } while (0) - -#define CFR_SET_VAL_DOUBLE(data, pCtx, func, i, step, notNullElems) \ - do { \ - double *pData = (double *) data; \ - double *pOutput = (double *) pCtx->pOutput; \ - \ - for (; i < pCtx->size && i >= 0; i += step) { \ - if (pCtx->hasNull && isNull((const char*) &pData[i], pCtx->inputType)) { \ - continue; \ - } \ - \ - SET_DOUBLE_VAL(pOutput, func(pData[i])); \ - pOutput++; \ - \ - notNullElems++; \ } \ } while (0) static void ceil_function(SQLFunctionCtx *pCtx) { void *data = GET_INPUT_DATA_LIST(pCtx); - int32_t notNullElems = 0; - int32_t step = GET_FORWARD_DIRECTION_FACTOR(pCtx->order); int32_t i = (pCtx->order == TSDB_ORDER_ASC) ? 0 : pCtx->size - 1; switch (pCtx->inputType) { case TSDB_DATA_TYPE_INT: { - CFR_SET_VAL(int32_t, data, pCtx, ceil, i, step, notNullElems); + CFR_SET_VAL(int32_t, data, pCtx, ceil, i, step); break; }; case TSDB_DATA_TYPE_UINT: { - CFR_SET_VAL(uint32_t, data, pCtx, ceil, i, step, notNullElems); + CFR_SET_VAL(uint32_t, data, pCtx, ceil, i, step); break; }; case TSDB_DATA_TYPE_BIGINT: { - CFR_SET_VAL(int64_t, data, pCtx, ceil, i, step, notNullElems); + CFR_SET_VAL(int64_t, data, pCtx, ceil, i, step); break; } case TSDB_DATA_TYPE_UBIGINT: { - CFR_SET_VAL(uint64_t, data, pCtx, ceil, i, step, notNullElems); + CFR_SET_VAL(uint64_t, data, pCtx, ceil, i, step); break; } case TSDB_DATA_TYPE_DOUBLE: { - CFR_SET_VAL_DOUBLE(data, pCtx, ceil, i, step, notNullElems); + CFR_SET_VAL(double, data, pCtx, ceil, i, step); break; } case TSDB_DATA_TYPE_FLOAT: { - CFR_SET_VAL(float, data, pCtx, ceil, i, step, notNullElems); + CFR_SET_VAL(float, data, pCtx, ceil, i, step); break; } case TSDB_DATA_TYPE_SMALLINT: { - CFR_SET_VAL(int16_t, data, pCtx, ceil, i, step, notNullElems); + CFR_SET_VAL(int16_t, data, pCtx, ceil, i, step); break; } case TSDB_DATA_TYPE_USMALLINT: { - CFR_SET_VAL(uint16_t, data, pCtx, ceil, i, step, notNullElems); + CFR_SET_VAL(uint16_t, data, pCtx, ceil, i, step); break; } case TSDB_DATA_TYPE_TINYINT: { - CFR_SET_VAL(int8_t, data, pCtx, ceil, i, step, notNullElems); + CFR_SET_VAL(int8_t, data, pCtx, ceil, i, step); break; } case TSDB_DATA_TYPE_UTINYINT: { - CFR_SET_VAL(uint8_t, data, pCtx, ceil, i, step, notNullElems); + CFR_SET_VAL(uint8_t, data, pCtx, ceil, i, step); break; } default: qError("error input type"); } - if (notNullElems <= 0) { - /* - * current block may be null value - */ - assert(pCtx->hasNull); - } else { - GET_RES_INFO(pCtx)->numOfRes += notNullElems; - } + GET_RES_INFO(pCtx)->numOfRes += pCtx->size; } static void floor_function(SQLFunctionCtx *pCtx) { void *data = GET_INPUT_DATA_LIST(pCtx); - int32_t notNullElems = 0; - int32_t step = GET_FORWARD_DIRECTION_FACTOR(pCtx->order); int32_t i = (pCtx->order == TSDB_ORDER_ASC) ? 0 : pCtx->size - 1; switch (pCtx->inputType) { case TSDB_DATA_TYPE_INT: { - CFR_SET_VAL(int32_t, data, pCtx, floor, i, step, notNullElems); + CFR_SET_VAL(int32_t, data, pCtx, floor, i, step); break; }; case TSDB_DATA_TYPE_UINT: { - CFR_SET_VAL(uint32_t, data, pCtx, floor, i, step, notNullElems); + CFR_SET_VAL(uint32_t, data, pCtx, floor, i, step); break; }; case TSDB_DATA_TYPE_BIGINT: { - CFR_SET_VAL(int64_t, data, pCtx, floor, i, step, notNullElems); + CFR_SET_VAL(int64_t, data, pCtx, floor, i, step); break; } case TSDB_DATA_TYPE_UBIGINT: { - CFR_SET_VAL(uint64_t, data, pCtx, floor, i, step, notNullElems); + CFR_SET_VAL(uint64_t, data, pCtx, floor, i, step); break; } case TSDB_DATA_TYPE_DOUBLE: { - CFR_SET_VAL_DOUBLE(data, pCtx, floor, i, step, notNullElems); + CFR_SET_VAL(double, data, pCtx, floor, i, step); break; } case TSDB_DATA_TYPE_FLOAT: { - CFR_SET_VAL(float, data, pCtx, floor, i, step, notNullElems); + CFR_SET_VAL(float, data, pCtx, floor, i, step); break; } case TSDB_DATA_TYPE_SMALLINT: { - CFR_SET_VAL(int16_t, data, pCtx, floor, i, step, notNullElems); + CFR_SET_VAL(int16_t, data, pCtx, floor, i, step); break; } case TSDB_DATA_TYPE_USMALLINT: { - CFR_SET_VAL(uint16_t, data, pCtx, floor, i, step, notNullElems); + CFR_SET_VAL(uint16_t, data, pCtx, floor, i, step); break; } case TSDB_DATA_TYPE_TINYINT: { - CFR_SET_VAL(int8_t, data, pCtx, floor, i, step, notNullElems); + CFR_SET_VAL(int8_t, data, pCtx, floor, i, step); break; } case TSDB_DATA_TYPE_UTINYINT: { - CFR_SET_VAL(uint8_t, data, pCtx, floor, i, step, notNullElems); + CFR_SET_VAL(uint8_t, data, pCtx, floor, i, step); break; } default: qError("error input type"); } - if (notNullElems <= 0) { - /* - * current block may be null value - */ - assert(pCtx->hasNull); - } else { - GET_RES_INFO(pCtx)->numOfRes += notNullElems; - } + GET_RES_INFO(pCtx)->numOfRes += pCtx->size; } static void round_function(SQLFunctionCtx *pCtx) { void *data = GET_INPUT_DATA_LIST(pCtx); - int32_t notNullElems = 0; - int32_t step = GET_FORWARD_DIRECTION_FACTOR(pCtx->order); int32_t i = (pCtx->order == TSDB_ORDER_ASC) ? 0 : pCtx->size - 1; switch (pCtx->inputType) { case TSDB_DATA_TYPE_INT: { - CFR_SET_VAL(int32_t, data, pCtx, round, i, step, notNullElems); + CFR_SET_VAL(int32_t, data, pCtx, round, i, step); break; }; case TSDB_DATA_TYPE_UINT: { - CFR_SET_VAL(uint32_t, data, pCtx, round, i, step, notNullElems); + CFR_SET_VAL(uint32_t, data, pCtx, round, i, step); break; }; case TSDB_DATA_TYPE_BIGINT: { - CFR_SET_VAL(int64_t, data, pCtx, round, i, step, notNullElems); + CFR_SET_VAL(int64_t, data, pCtx, round, i, step); break; } case TSDB_DATA_TYPE_UBIGINT: { - CFR_SET_VAL(uint64_t, data, pCtx, round, i, step, notNullElems); + CFR_SET_VAL(uint64_t, data, pCtx, round, i, step); break; } case TSDB_DATA_TYPE_DOUBLE: { - CFR_SET_VAL_DOUBLE(data, pCtx, round, i, step, notNullElems); + CFR_SET_VAL(double, data, pCtx, round, i, step); break; } case TSDB_DATA_TYPE_FLOAT: { - CFR_SET_VAL(float, data, pCtx, round, i, step, notNullElems); + CFR_SET_VAL(float, data, pCtx, round, i, step); break; } case TSDB_DATA_TYPE_SMALLINT: { - CFR_SET_VAL(int16_t, data, pCtx, round, i, step, notNullElems); + CFR_SET_VAL(int16_t, data, pCtx, round, i, step); break; } case TSDB_DATA_TYPE_USMALLINT: { - CFR_SET_VAL(uint16_t, data, pCtx, round, i, step, notNullElems); + CFR_SET_VAL(uint16_t, data, pCtx, round, i, step); break; } case TSDB_DATA_TYPE_TINYINT: { - CFR_SET_VAL(int8_t, data, pCtx, round, i, step, notNullElems); + CFR_SET_VAL(int8_t, data, pCtx, round, i, step); break; } case TSDB_DATA_TYPE_UTINYINT: { - CFR_SET_VAL(uint8_t, data, pCtx, round, i, step, notNullElems); + CFR_SET_VAL(uint8_t, data, pCtx, round, i, step); break; } default: qError("error input type"); } - - if (notNullElems <= 0) { - /* - * current block may be null value - */ - assert(pCtx->hasNull); - } else { - GET_RES_INFO(pCtx)->numOfRes += notNullElems; - } + GET_RES_INFO(pCtx)->numOfRes += pCtx->size; } #undef CFR_SET_VAL -#undef CFR_SET_VAL_DOUBLE ////////////////////////////////////////////////////////////////////////////////// //cumulative_sum function diff --git a/tests/pytest/functions/function_ceil.py b/tests/pytest/functions/function_ceil.py index 9197b0eec45a2154c2345a5b2fc469e54b1e41f9..08769c7f7aeff422f955f18efa525b5250be0761 100644 --- a/tests/pytest/functions/function_ceil.py +++ b/tests/pytest/functions/function_ceil.py @@ -1289,6 +1289,34 @@ class TDTestCase: " fill(linear)" ] tdSql.prepare() + #need insert new data --data type is double or float and tests ceil floor round . + tdSql.execute("create table if not exists jsons7(ts timestamp, dataInt int, dataBool bool, datafloat float, datadouble double, dataStr nchar(50)) tags(jtag nchar(128))") + tdSql.execute("insert into jsons7_1 using jsons7 tags('{\"nv\":null,\"tea\":true,\"\":false,\" \":123,\"tea\":false}') values (now,2,'true',0.9,0.1,'123')") + tdSql.query("select * from jsons7") + tdSql.checkRows(1) + tdSql.execute("insert into jsons7_1 values (now+1s,3,'true',-4.8,-5.5,'123') ") + tdSql.execute("insert into jsons7_1 values (now+2s,4,'true',1.9998,2.00001,'123') ") + tdSql.execute("insert into jsons7_2 using jsons7 tags('{\"nv\":null,\"tea\":true,\"\":false,\"tag\":123,\"tea\":false}') values (now,5,'true',4.01,2.2,'123') ") + tdSql.execute("insert into jsons7_2 (ts,datadouble) values (now+3s,-0.9) ") + tdSql.execute("insert into jsons7_2 (ts,datadouble) values (now+4s,-2.9) ") + tdSql.execute("insert into jsons7_2 (ts,datafloat) values (now+1s,-0.9) ") + tdSql.execute("insert into jsons7_2 (ts,datafloat) values (now+2s,-1.9) ") + tdSql.query("select ts,ceil(dataint),ceil(datafloat),ceil(datadouble) from jsons7") + tdSql.checkRows(8) + tdSql.checkData(5, 1, None) + tdSql.checkData(6, 2, None) + tdSql.checkData(7, 3, -2) + tdSql.query("select ceil(dataint),ceil(datafloat),ceil(datadouble) from jsons7") + tdSql.checkRows(8) + tdSql.checkData(5, 1, -1) + tdSql.checkData(5, 2, None) + tdSql.checkData(7, 0, None) + tdSql.checkData(7, 2, -2) + tdSql.query("select ts,floor(dataint),floor(datafloat),floor(datadouble) from jsons7") + tdSql.query("select floor(dataint),floor(datafloat),floor(datadouble) from jsons7") + tdSql.query("select ts,round(dataint),round(datafloat),round(datadouble) from jsons7") + tdSql.query("select round(dataint),round(datafloat),round(datadouble) from jsons7") + tdSql.execute( "create stable super (ts timestamp, timestamp_col timestamp, int_col int, bigint_col bigint, float_col float,\ double_col double, binary_col binary(8), smallint_col smallint, tinyint_col tinyint, bool_col bool, nchar_col nchar(8), \