diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index e671c931590c8cfda84abb6a8fab6cdd3a4db0e5..0d5eef2eb458ab12f162a7aa8ebc078bf7c7d8b3 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -2674,6 +2674,7 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col const char* msg15 = "parameter is out of range [1, 1000]"; const char* msg16 = "elapsed duration should be greater than or equal to database precision"; const char* msg17 = "elapsed/twa should not be used in nested query if inner query has group by clause"; + const char* msg18 = "the second parameter is not an integer"; switch (functionId) { case TSDB_FUNC_COUNT: { @@ -3156,6 +3157,11 @@ int32_t addExprAndResultField(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, int32_t col return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg2); } + char* endptr = NULL; + strtoll(pParamElem[1].pNode->exprToken.z, &endptr, 10); + if ((endptr-pParamElem[1].pNode->exprToken.z != pParamElem[1].pNode->exprToken.n) || errno == ERANGE) { + return invalidOperationMsg(tscGetErrorMsgPayload(pCmd), msg18); + } tVariantDump(pVariant, val, TSDB_DATA_TYPE_BIGINT, true); int64_t numRowsSelected = GET_INT64_VAL(val); diff --git a/src/client/src/tscStream.c b/src/client/src/tscStream.c index 73fdb02855e0bb0561630f87a2322385839698b1..2fa885ba7760a01e88eaecc114e1aced4cb11ea6 100644 --- a/src/client/src/tscStream.c +++ b/src/client/src/tscStream.c @@ -211,6 +211,7 @@ static void tscProcessStreamQueryCallback(void *param, TAOS_RES *tres, int numOf tfree(pSql->pSubs); pSql->subState.numOfSub = 0; + pSql->parseRetry = 0; int32_t code = tsParseSql(pSql, true); if (code == TSDB_CODE_SUCCESS) { cbParseSql(pStream, pSql, code); @@ -220,6 +221,7 @@ static void tscProcessStreamQueryCallback(void *param, TAOS_RES *tres, int numOf tscError("0x%"PRIx64" open stream failed, code:%s", pSql->self, tstrerror(code)); taosReleaseRef(tscObjRef, pSql->self); free(pStream); + return; } // tscSetRetryTimer(pStream, pStream->pSql, retryDelay); diff --git a/src/query/src/qAggMain.c b/src/query/src/qAggMain.c index 9e80a4fb62d5e20bc0771714a2dfb82f66dae8d9..b6bf474a65f6a650087651c6571a7e9fbfa89d26 100644 --- a/src/query/src/qAggMain.c +++ b/src/query/src/qAggMain.c @@ -4618,9 +4618,7 @@ static void mavg_function(SQLFunctionCtx *pCtx) { } } - if (notNullElems <= 0) { - assert(pCtx->hasNull); - } else { + { for (int t = 0; t < pCtx->tagInfo.numOfTagCols; ++t) { SQLFunctionCtx* tagCtx = pCtx->tagInfo.pTagCtxList[t]; if (tagCtx->functionId == TSDB_FUNC_TAG_DUMMY) { diff --git a/tests/develop-test/2-query/function_mavg.py b/tests/develop-test/2-query/function_mavg.py new file mode 100644 index 0000000000000000000000000000000000000000..fcc26b254614c5739d387dad2918083fbe8bde66 --- /dev/null +++ b/tests/develop-test/2-query/function_mavg.py @@ -0,0 +1,55 @@ + +################################################################### +# Copyright (c) 2021 by TAOS Technologies, Inc. +# All rights reserved. +# +# This file is proprietary and confidential to TAOS Technologies. +# No part of this file may be reproduced, stored, transmitted, +# disclosed or used in any form or by any means other than as +# expressly provided by the written permission from Jianhui Tao +# +################################################################### + +# -*- coding: utf-8 -*- + +import sys +from util.log import * +from util.cases import * +from util.sql import * + + +class TDTestCase: + def caseDescription(self): + ''' + case1: [TD-10799]mavg(col, 4-3 ) promots error + ''' + return + + def init(self, conn, logSql): + tdLog.debug("start to execute %s" % __file__) + tdSql.init(conn.cursor(), logSql) + self._conn = conn + + def run(self): + print("running {}".format(__file__)) + tdSql.execute("drop database if exists td10799") + tdSql.execute("create database if not exists td10799") + tdSql.execute('use td10799') + + tdSql.execute('create stable st(ts timestamp , value int ) tags (ind int)') + tdSql.execute('insert into tb1 using st tags(1) values(now ,1)') + tdSql.execute('insert into tb1 using st tags(1) values(now+1s ,2)') + tdSql.execute('insert into tb1 using st tags(1) values(now+2s ,3)') + tdSql.query('select * from st') + tdSql.checkRows(3) + tdSql.query('select mavg(value, 100) from st group by tbname') + tdSql.checkRows(0) + tdSql.error('select mavg(value, 4-3) from st group by tbname') + tdSql.execute('drop database td10799') + def stop(self): + tdSql.close() + tdLog.success("%s successfully executed" % __file__) + + +tdCases.addWindows(__file__, TDTestCase()) +tdCases.addLinux(__file__, TDTestCase()) diff --git a/tests/develop-test/fulltest-query.sh b/tests/develop-test/fulltest-query.sh index 77560893d75ed6f5191da6917536be2ff0ab9743..af669424ef5626e6429775a05f992d278967d678 100755 --- a/tests/develop-test/fulltest-query.sh +++ b/tests/develop-test/fulltest-query.sh @@ -3,4 +3,5 @@ python3 ./test.py -f 2-query/union-order.py python3 ./test.py -f 2-query/session_two_stage.py python3 ./test.py -f 2-query/timeline_agg_func_groupby.py python3 ./test.py -f 2-query/ts_2016.py -python3 ./test.py -f 2-query/escape.py \ No newline at end of file +python3 ./test.py -f 2-query/function_mavg.py +python3 ./test.py -f 2-query/escape.py