diff --git a/documentation20/cn/12.taos-sql/docs.md b/documentation20/cn/12.taos-sql/docs.md index 7ad3571932d11a4c2fcfada4b85e99b04ead97ef..1bd55bca1058ac21727e767ce29cfaed1beae035 100755 --- a/documentation20/cn/12.taos-sql/docs.md +++ b/documentation20/cn/12.taos-sql/docs.md @@ -1669,7 +1669,7 @@ SELECT COUNT(*), FIRST(ts), status FROM temp_tb_1 STATE_WINDOW(status) ```mysql -SELECT COUNT(*), FIRST(ts) FROM temp_tb_1 SESSION_WINDOW(ts, tol_val) +SELECT COUNT(*), FIRST(ts) FROM temp_tb_1 SESSION(ts, tol_val) ``` 这种类型的查询语法如下: diff --git a/src/client/src/tscPrepare.c b/src/client/src/tscPrepare.c index e4ed16518f87fee2463d2e474a79243dfd703ca7..ea6ad8a48d7a9c4b5e992dffe8329735a0f47512 100644 --- a/src/client/src/tscPrepare.c +++ b/src/client/src/tscPrepare.c @@ -1534,10 +1534,10 @@ int stmtGenInsertStatement(SSqlObj* pSql, STscStmt* pStmt, const char* name, TAO } int32_t stmtValidateValuesFields(SSqlCmd *pCmd, char * sql) { - int32_t loopCont = 1, index0 = 0, values = 0; + int32_t index0 = 0, values = 0; SStrToken sToken; - while (loopCont) { + while (1) { sToken = tStrGetToken(sql, &index0, false); if (sToken.n <= 0) { return TSDB_CODE_SUCCESS; diff --git a/tests/system-test/2-query/TD-11389.py b/tests/system-test/2-query/TD-11389.py index a818ab42a7185d13278802141889d38f05c05a1f..f9a787e9d3c358892e7c03ab8c98d46e4dbce7dd 100644 --- a/tests/system-test/2-query/TD-11389.py +++ b/tests/system-test/2-query/TD-11389.py @@ -63,7 +63,7 @@ class TDTestCase: tdSql.execute("create stable st (ts timestamp , id int , value double) tags(hostname binary(10) ,ind int);") for i in range(self.num): tdSql.execute("insert into sub_%s using st tags('host_%s' , %d) values (%d , %d , %f );"%(str(i),str(i),i*10,self.ts+10000*i,i*2,i+10.00)) - tdSql.query("select distinct(hostname) from st;") + tdSql.query("select distinct(hostname) from testdb.st") tdSql.checkRows(10) binPath = self.getBuildPath() + "/build/bin/" @@ -76,11 +76,13 @@ class TDTestCase: os.system("taos -s ' select distinct(hostname) from testdb.st '") # this bug will occor at this connect ,it should get 11 rows ,but return 10 rows ,this error is caused by cache + # tdSql.query("reset query cache") + - for i in range(10): - + for i in range(5): + tdSql.query("select distinct(hostname) from testdb.st") tdSql.checkRows(11) # query 10 times every 10 second , test cache refresh - sleep(10) + sleep(3) def stop(self): diff --git a/tests/system-test/2-query/TD-12861.py b/tests/system-test/2-query/TD-12861.py new file mode 100644 index 0000000000000000000000000000000000000000..cbb7812df91971f6e90dedb10a873e8ac89500cc --- /dev/null +++ b/tests/system-test/2-query/TD-12861.py @@ -0,0 +1,82 @@ +################################################################### +# Copyright (c) 2020 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 taos +import time + +from util.log import * +from util.cases import * +from util.sql import * +from util.dnodes import * + + +class TDTestCase: + def __init__(self): + self.err_case = 0 + self.curret_case = 0 + + def caseDescription(self): + + ''' + case1 : [TD-12861] : this is an test case for SQL error for == and <> for basic query + ''' + return + + def init(self, conn, logSql): + tdLog.debug("start to execute %s" % __file__) + tdSql.init(conn.cursor(), logSql) + + def create_stb(self): + basetime = int(round(time.time() * 1000)) + tdSql.prepare() + tdSql.execute(f"create stable stb1(ts timestamp, c1 int) tags (tag1 int)") + for i in range(10): + tdSql.execute(f"create table t{i} using stb1 tags({i})") + tdSql.execute(f"insert into t{i} values ({basetime}, {i})") + + pass + + def check_issue(self): + + tdSql.error("select first(c1) == max(c1) from stb1;") + tdSql.error("select first(c1) == max(c1) from stb1 group by tbname;") + tdSql.error("select first(c1) == first(*) from stb1;") + tdSql.error("select first(c1) == first(*) from stb1 group by tbname;") + tdSql.error("select first(*) == max(c1) from stb1;") + tdSql.error("select first(*) == max(c1) from stb1 group by tbname;") + tdSql.error("select first(c1) <> max(c1) from stb1 group by tbname;") + tdSql.error("select min(c1) == max(c1) from stb1;") + tdSql.error("select min(c1) == max(c1) from stb1 group by tbname;") + tdSql.error("select min(c1) == min(c1) from stb1;") + tdSql.error("select min(c1) == min(c1) from stb1 group by tbname;") + tdSql.error("select min(c1) == 1 from stb1;") + tdSql.error("select min(c1) == 1 from stb1 group by tbname;") + + + def run(self): + self.create_stb() + + self.check_issue() + + if self.err_case > 0: + tdLog.exit(f"{self.err_case} case run failed") + else: + tdLog.success("all case run passed") + + def stop(self): + tdSql.close() + tdLog.success("%s successfully executed" % __file__) + + +tdCases.addWindows(__file__, TDTestCase()) +tdCases.addLinux(__file__, TDTestCase()) diff --git a/tests/system-test/2-query/TD-12863.py b/tests/system-test/2-query/TD-12863.py new file mode 100644 index 0000000000000000000000000000000000000000..69ffa48f31a9486be9ac491c48c6d92be36ec3d9 --- /dev/null +++ b/tests/system-test/2-query/TD-12863.py @@ -0,0 +1,100 @@ +################################################################### +# Copyright (c) 2020 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 taos +import time + +from util.log import * +from util.cases import * +from util.sql import * +from util.dnodes import * + + +class TDTestCase: + def __init__(self): + self.err_case = 0 + self.curret_case = 0 + + def caseDescription(self): + + ''' + case1 : [TD-12863] : this is an test case for compute error for query + ''' + return + + def init(self, conn, logSql): + tdLog.debug("start to execute %s" % __file__) + tdSql.init(conn.cursor(), logSql) + + def create_stb(self): + basetime = int(round(time.time() * 1000)) + tdSql.prepare() + tdSql.execute(f"create stable stb1(ts timestamp, c1 int) tags (tag1 int)") + for i in range(10): + tdSql.execute(f"create table t{i} using stb1 tags({i})") + tdSql.execute(f"insert into t{i} values ({basetime}, {i})") + + pass + tdSql.execute(" insert into tb using stb1 tags(100) values(now ,NULL)") + + def check_issue(self): + + tdSql.query("select c1 from stb1") + tdSql.checkData(0,0,0) + tdSql.checkData(1,0,1) + tdSql.checkData(8,0,8) + tdSql.checkData(10,0,None) + + tdSql.query("select c1+1000000000000000 from stb1") + tdSql.checkData(0,0,1000000000000000) + tdSql.checkData(1,0,10000000000000001) + tdSql.checkData(8,0,10000000000000008) + tdSql.checkData(10,0,None) + + tdSql.query("select c1+10000000000000000 from stb1") + tdSql.checkData(0,0,10000000000000000) + tdSql.checkData(1,0,100000000000000001) + tdSql.checkData(8,0,100000000000000008) + tdSql.checkData(10,0,None) + + tdSql.query("select c1+10000000000000000 from stb1") + tdSql.checkData(0,0,10000000000000000) + tdSql.checkData(1,0,100000000000000001) + tdSql.checkData(8,0,100000000000000008) + tdSql.checkData(10,0,None) + + tdSql.query("select c1+10000000000000000000 from stb1") + tdSql.checkData(0,0,10000000000000000000) + tdSql.checkData(1,0,100000000000000000001) + tdSql.checkData(8,0,100000000000000000008) + tdSql.checkData(10,0,None) + + + + def run(self): + self.create_stb() + + self.check_issue() + + if self.err_case > 0: + tdLog.exit(f"{self.err_case} case run failed") + else: + tdLog.success("all case run passed") + + def stop(self): + tdSql.close() + tdLog.success("%s successfully executed" % __file__) + + +tdCases.addWindows(__file__, TDTestCase()) +tdCases.addLinux(__file__, TDTestCase()) diff --git a/tests/system-test/2-query/TD-12909.py b/tests/system-test/2-query/TD-12909.py new file mode 100644 index 0000000000000000000000000000000000000000..ed325ea427db89488e3e74cba38d4a8f2594a420 --- /dev/null +++ b/tests/system-test/2-query/TD-12909.py @@ -0,0 +1,108 @@ +################################################################### +# Copyright (c) 2020 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 -*- + +from posixpath import split +import sys +import os + +from util.log import * +from util.cases import * +from util.sql import * +from util.dnodes import * + +class TDTestCase: + def init(self, conn, logSql): + tdLog.debug("start to execute %s" % __file__) + tdSql.init(conn.cursor(), logSql) + + self.ts = 1420041600000 # 2015-01-01 00:00:00 this is begin time for first record + self.num = 10 + + def getBuildPath(self): + selfPath = os.path.dirname(os.path.realpath(__file__)) + + if ("community" in selfPath): + projPath = selfPath[:selfPath.find("community")] + else: + projPath = selfPath[:selfPath.find("tests")] + + for root, dirs, files in os.walk(projPath): + if ("taosd" in files): + rootRealPath = os.path.dirname(os.path.realpath(root)) + if ("packaging" not in rootRealPath): + buildPath = root[:len(root) - len("/build/bin")] + break + return buildPath + + + def caseDescription(self): + + ''' + case1 : [TD-12909] : + this test case is for illegal SQL in query ,it will crash taosd. + + ''' + return + + + def run(self): + tdSql.prepare() + tdSql.execute("create database if not exists testdb keep 36500;") + tdSql.execute("use testdb;") + tdSql.execute("create stable st (ts timestamp , id int , value double) tags(hostname binary(10) ,ind int);") + for i in range(self.num): + tdSql.execute("insert into sub_%s using st tags('host_%s' , %d) values (%d , %d , %f );"%(str(i),str(i),i*10,self.ts+10000*i,i*2,i+10.00)) + tdSql.query("select distinct(hostname) from testdb.st") + tdSql.checkRows(10) + + tdSql.query("select count(*) from st where hostname >1") + tdSql.query("select count(*) from st where hostname >'1'") + + tdSql.query("select count(*) from st where hostname <=1") + tdSql.query("select count(*) from st where hostname <='1'") + + tdSql.query("select count(*) from st where hostname !=1") + tdSql.query("select count(*) from st where hostname !='1'") + + tdSql.query("select count(*) from st where hostname <>1") + tdSql.query("select count(*) from st where hostname <>'1'") + + tdSql.query("select count(*) from st where hostname in ('1','2')") + + tdSql.query("select count(*) from st where hostname match '%'") + tdSql.query("select count(*) from st where hostname match '%1'") + + tdSql.query("select count(*) from st where hostname between 1 and 2") + tdSql.query("select count(*) from st where hostname between 'abc' and 'def'") + + tdSql.error("select count(*) from st where hostname between 1 and 2 or sum(1)") + tdSql.execute("select count(*) from st where hostname < max(123)") + + tdSql.execute("select count(*) from st where hostname < max('abc')") + tdSql.execute("select count(*) from st where hostname < max(min(123))") + + tdSql.execute("select count(*) from st where hostname < sum('abc')") + tdSql.execute("select count(*) from st where hostname < sum(min(123))") + + tdSql.execute("select count(*) from st where hostname < diff('abc')") + tdSql.execute("select count(*) from st where hostname < diff(min(123))") + + + def stop(self): + tdSql.close() + tdLog.success("%s successfully executed" % __file__) + +tdCases.addWindows(__file__, TDTestCase()) +tdCases.addLinux(__file__, TDTestCase()) + + diff --git a/tests/system-test/2-query/TD-12926.py b/tests/system-test/2-query/TD-12926.py new file mode 100644 index 0000000000000000000000000000000000000000..575a65d9cef01967c75f7094f06b822975ce4cdb --- /dev/null +++ b/tests/system-test/2-query/TD-12926.py @@ -0,0 +1,81 @@ +################################################################### +# Copyright (c) 2020 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 -*- + +from posixpath import split +import sys +import os + +from util.log import * +from util.cases import * +from util.sql import * +from util.dnodes import * + +class TDTestCase: + def init(self, conn, logSql): + tdLog.debug("start to execute %s" % __file__) + tdSql.init(conn.cursor(), logSql) + + self.ts = 1420041600000 # 2015-01-01 00:00:00 this is begin time for first record + self.num = 10 + + def getBuildPath(self): + selfPath = os.path.dirname(os.path.realpath(__file__)) + + if ("community" in selfPath): + projPath = selfPath[:selfPath.find("community")] + else: + projPath = selfPath[:selfPath.find("tests")] + + for root, dirs, files in os.walk(projPath): + if ("taosd" in files): + rootRealPath = os.path.dirname(os.path.realpath(root)) + if ("packaging" not in rootRealPath): + buildPath = root[:len(root) - len("/build/bin")] + break + return buildPath + + + def caseDescription(self): + + ''' + case1 : [TD-11389] : + this test case is an test case for cache error , it will let the cached data obtained by the client that has connected to taosd incorrect, + root cause : table schema is changed, tag hostname size is increased through schema-less insertion. The schema cache of client taos is not refreshed. + + ''' + return + + + def run(self): + tdSql.prepare() + tdSql.execute("use db") + + functions_list = ["count","avg","twa","irate","sum","stddev","LEASTSQUARES","min","max","first","last","last_row()","top","bottom", + "spread","ceil","floor","round"] + os.system("taosBenchmark -t 10 -n 5 -y ") + + params_list = ["(,)","(,,)","(current)","(current,,,)*tbname","(*),","(abc,,)"] + for func in functions_list: + for params in params_list: + sql = "select %s%s from test.meters;"%(func,params) + tdSql.error(sql) + + + def stop(self): + tdSql.close() + tdLog.success("%s successfully executed" % __file__) + +tdCases.addWindows(__file__, TDTestCase()) +tdCases.addLinux(__file__, TDTestCase()) + + diff --git a/tests/system-test/fulltest-query.sh b/tests/system-test/fulltest-query.sh index 05932f403e69179800cb82ef64fe05684dafeb85..54706a07922d656b261404390ce41b38d2529547 100755 --- a/tests/system-test/fulltest-query.sh +++ b/tests/system-test/fulltest-query.sh @@ -1,5 +1,5 @@ python3 ./test.py -f 2-query/TD-11256.py -# python3 ./test.py -f 2-query/TD-11389.py +python3 ./test.py -f 2-query/TD-11389.py python3 ./test.py -f 2-query/TD-11945_crash.py python3 ./test.py -f 2-query/TD-12340-12342.py python3 ./test.py -f 2-query/TD-11561.py