From a5be0d1aeff7d08929c7fd94828d3553151fa201 Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Fri, 21 Jan 2022 10:27:54 +0800 Subject: [PATCH] [TD-11222]: Histogram function --- src/client/src/tscSQLParser.c | 9 +++- .../2-query/function_histogram.py | 49 ++++++++++++++++++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index f687dab655..3599ab1661 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -2680,6 +2680,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col const char* msg21 = "third parameter must be in JSON format"; const char* msg22 = "invalid parameters for bin_desciption"; const char* msg23 = "parameter/bin out of range [-DBL_MAX, DBL_MAX]"; + const char* msg24 = "linear_bin 'width' param cannot be 0"; switch (functionId) { case TSDB_FUNC_COUNT: { @@ -3420,7 +3421,9 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg22); } - if (isinf(start->valuedouble) || isinf(width->valuedouble)) { + if (isinf(start->valuedouble) || + (width != NULL && isinf(width->valuedouble)) || + (factor != NULL && isinf(factor->valuedouble))) { return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg23); } @@ -3436,6 +3439,10 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col intervals = tcalloc(numBins, sizeof(double)); if (cJSON_IsNumber(width) && factor == NULL && binType == LINEAR_BIN) { //linear bin process + if (width->valuedouble == 0) { + tfree(intervals); + return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg24); + } for (int i = 0; i < counter + 1; ++i) { intervals[startIndex] = start->valuedouble + i * width->valuedouble; if (isinf(intervals[i])) { diff --git a/tests/develop-test/2-query/function_histogram.py b/tests/develop-test/2-query/function_histogram.py index b7e8d9db4a..a65f284c3e 100644 --- a/tests/develop-test/2-query/function_histogram.py +++ b/tests/develop-test/2-query/function_histogram.py @@ -998,7 +998,54 @@ class TDTestCase: tdSql.checkData(1, 0, "(-1.76e+308:-1.76e+308]:0"); tdSql.checkData(2, 0, "(-1.76e+308:1.79769e+308]:15"); - #tdSql.query('select histogram(col_tinyint, \'linear_bin\', \'{"start": -1.80e+308, "width": 5, "count": 5, "infinity": false}\', 0) from stb;') + tdSql.query('select histogram(col_tinyint, \'linear_bin\', \'{"start": -0.7e+308, "width": 0.7e+308, "count": 2, "infinity": false}\', 0) from stb;') + tdSql.checkRows(2); + tdSql.checkData(0, 0, "(-7e+307:0]:2"); + tdSql.checkData(1, 0, "(0:7e+307]:13"); + tdSql.query('select histogram(col_tinyint, \'linear_bin\', \'{"start": -0.7e+308, "width": 0.7e+308, "count": 2, "infinity": false}\', 0) from ctb;') + tdSql.checkRows(2); + tdSql.checkData(0, 0, "(-7e+307:0]:2"); + tdSql.checkData(1, 0, "(0:7e+307]:13"); + tdSql.query('select histogram(col_tinyint, \'linear_bin\', \'{"start": -0.7e+308, "width": 0.7e+308, "count": 2, "infinity": false}\', 0) from tb;') + tdSql.checkRows(2); + tdSql.checkData(0, 0, "(-7e+307:0]:2"); + tdSql.checkData(1, 0, "(0:7e+307]:13"); + + tdSql.query('select histogram(col_tinyint, \'linear_bin\', \'{"start": -0.7e+308, "width": 0.7e+308, "count": 2, "infinity": true}\', 0) from stb;') + tdSql.checkRows(4); + tdSql.checkData(0, 0, "(-1.79769e+308:-7e+307]:0"); + tdSql.checkData(1, 0, "(-7e+307:0]:2"); + tdSql.checkData(2, 0, "(0:7e+307]:13"); + tdSql.checkData(3, 0, "(7e+307:1.79769e+308]:0"); + tdSql.query('select histogram(col_tinyint, \'linear_bin\', \'{"start": -0.7e+308, "width": 0.7e+308, "count": 2, "infinity": true}\', 0) from ctb;') + tdSql.checkRows(4); + tdSql.checkData(0, 0, "(-1.79769e+308:-7e+307]:0"); + tdSql.checkData(1, 0, "(-7e+307:0]:2"); + tdSql.checkData(2, 0, "(0:7e+307]:13"); + tdSql.checkData(3, 0, "(7e+307:1.79769e+308]:0"); + tdSql.query('select histogram(col_tinyint, \'linear_bin\', \'{"start": -0.7e+308, "width": 0.7e+308, "count": 2, "infinity": true}\', 0) from tb;') + tdSql.checkRows(4); + tdSql.checkData(0, 0, "(-1.79769e+308:-7e+307]:0"); + tdSql.checkData(1, 0, "(-7e+307:0]:2"); + tdSql.checkData(2, 0, "(0:7e+307]:13"); + tdSql.checkData(3, 0, "(7e+307:1.79769e+308]:0"); + + tdSql.error('select histogram(col_tinyint, \'linear_bin\', \'{"start": true, "width": 5, "count": 5, "infinity": false}\', 0) from stb;') + tdSql.error('select histogram(col_tinyint, \'linear_bin\', \'{"start": false, "width": 5, "count": 5, "infinity": false}\', 0) from stb;') + tdSql.error('select histogram(col_tinyint, \'linear_bin\', \'{"start": "abc", "width": 5, "count": 5, "infinity": false}\', 0) from stb;') + tdSql.error('select histogram(col_tinyint, \'linear_bin\', \'{"start": "中文", "width": 5, "count": 5, "infinity": false}\', 0) from stb;') + tdSql.error('select histogram(col_tinyint, \'linear_bin\', \'{"start": abc, "width": 5, "count": 5, "infinity": false}\', 0) from stb;') + tdSql.error('select histogram(col_tinyint, \'linear_bin\', \'{"start": -1.80e+308, "width": 5, "count": 5, "infinity": false}\', 0) from stb;') + tdSql.error('select histogram(col_tinyint, \'linear_bin\', \'{"start": 1.80e+308, "width": 5, "count": 5, "infinity": false}\', 0) from stb;') + + tdSql.error('select histogram(col_tinyint, \'linear_bin\', \'{"start": 0, "width": true, "count": 5, "infinity": false}\', 0) from stb;') + tdSql.error('select histogram(col_tinyint, \'linear_bin\', \'{"start": 0, "width": false, "count": 5, "infinity": false}\', 0) from stb;') + tdSql.error('select histogram(col_tinyint, \'linear_bin\', \'{"start": 0, "width": "abc", "count": 5, "infinity": false}\', 0) from stb;') + tdSql.error('select histogram(col_tinyint, \'linear_bin\', \'{"start": 0, "width": "中文", "count": 5, "infinity": false}\', 0) from stb;') + tdSql.error('select histogram(col_tinyint, \'linear_bin\', \'{"start": 0, "width": abc, "count": 5, "infinity": false}\', 0) from stb;') + tdSql.error('select histogram(col_tinyint, \'linear_bin\', \'{"start": 0, "width": 0, "count": 5, "infinity": false}\', 0) from stb;') + tdSql.error('select histogram(col_tinyint, \'linear_bin\', \'{"start": 0, "width": -1.80e+308, "count": 5, "infinity": false}\', 0) from stb;') + tdSql.error('select histogram(col_tinyint, \'linear_bin\', \'{"start": 0, "width": 1.80e+308, "count": 5, "infinity": false}\', 0) from stb;') return tdSql.execute('drop database db') -- GitLab