diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 43d5e6bd62c465a3484e33a1d968a9e5d217b8f1..c03645242504349d8138d6b8c992d21f167a0284 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -951,9 +951,16 @@ int32_t tscValidateSqlInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { return code; } - // set the command/global limit parameters from the first subclause to the sqlcmd object - pCmd->active = pCmd->pQueryInfo; - pCmd->command = pCmd->pQueryInfo->command; + // set the command/global limit parameters from the first not empty subclause to the sqlcmd object + SQueryInfo* queryInfo = pCmd->pQueryInfo; + int16_t command = queryInfo->command; + while (command == TSDB_SQL_RETRIEVE_EMPTY_RESULT && queryInfo->sibling != NULL) { + queryInfo = queryInfo->sibling; + command = queryInfo->command; + } + + pCmd->active = queryInfo; + pCmd->command = command; STableMetaInfo* pTableMetaInfo1 = tscGetMetaInfo(pCmd->active, 0); if (pTableMetaInfo1->pTableMeta != NULL) { diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index 8765b352256f30fbe73f1f416595deddcb0a218a..8f9e88dde873ed8b9534491f75513655dcb65bfd 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -4010,6 +4010,11 @@ void executeQuery(SSqlObj* pSql, SQueryInfo* pQueryInfo) { // create sub query to handle the sub query. SQueryInfo* pq = tscGetQueryInfo(&psub->cmd); + STableMetaInfo* pSubMeta = tscGetMetaInfo(pq, 0); + if (UTIL_TABLE_IS_SUPER_TABLE(pSubMeta) && + pq->command == TSDB_SQL_RETRIEVE_EMPTY_RESULT) { + psub->cmd.command = TSDB_SQL_RETRIEVE_EMPTY_RESULT; + } executeQuery(psub, pq); } diff --git a/tests/pytest/fulltest.sh b/tests/pytest/fulltest.sh index 3d970fc85c3abf4bb8e917a17c4c992abb95ad71..1bf6b4f2f12d5b2f743eb90be72c2a945409612d 100755 --- a/tests/pytest/fulltest.sh +++ b/tests/pytest/fulltest.sh @@ -273,6 +273,7 @@ python3 ./test.py -f query/queryCnameDisplay.py python3 ./test.py -f query/operator_cost.py python3 test.py -f query/nestedQuery/queryWithSpread.py python3 ./test.py -f query/bug6586.py +python3 ./test.py -f query/ts_2016.py # python3 ./test.py -f query/bug5903.py python3 ./test.py -f query/queryLimit.py diff --git a/tests/pytest/query/queryTbnameUpperLower.py b/tests/pytest/query/queryTbnameUpperLower.py index bd4e85c5ca61628093348f520b6e6a04bef07f4a..4818ee560a38e6c10891ad2ddb82efbab616aa75 100644 --- a/tests/pytest/query/queryTbnameUpperLower.py +++ b/tests/pytest/query/queryTbnameUpperLower.py @@ -26,6 +26,8 @@ class TDTestCase: ''' tdCom.cleanTb() table_name = tdCom.getLongName(8, "letters_mixed") + while table_name.islower(): + table_name = tdCom.getLongName(8, "letters_mixed") table_name_sub = f'{table_name}_sub' tb_name_lower = table_name_sub.lower() tb_name_upper = table_name_sub.upper() diff --git a/tests/pytest/query/ts_2016.py b/tests/pytest/query/ts_2016.py new file mode 100644 index 0000000000000000000000000000000000000000..00bb7fd07a798d903f9d0e2bcddf51a95eb2b32b --- /dev/null +++ b/tests/pytest/query/ts_2016.py @@ -0,0 +1,62 @@ +################################################################### +# 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: [TS-2016]fix select * from (select * from empty_stable) + ''' + 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 td12229") + tdSql.execute("create database if not exists td12229") + tdSql.execute('use td12229') + + 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.execute('create stable ste(ts timestamp , value int ) tags (ind int)') + tdSql.query('select * from st') + tdSql.checkRows(3) + tdSql.query('select * from (select * from ste)') + tdSql.checkRows(0) + tdSql.query('select * from st union all select * from ste') + tdSql.checkRows(3) + tdSql.query('select * from ste union all select * from st') + tdSql.checkRows(3) + tdSql.query('select count(ts) from ste group by tbname union all select count(ts) from st group by tbname;') + tdSql.checkRows(1) + tdSql.query('select count(ts) from st group by tbname union all select count(ts) from ste group by tbname;') + tdSql.checkRows(1) + tdSql.execute('drop database td12229') + def stop(self): + tdSql.close() + tdLog.success("%s successfully executed" % __file__) + + +tdCases.addWindows(__file__, TDTestCase()) +tdCases.addLinux(__file__, TDTestCase())