diff --git a/tests/pytest/fulltest.sh b/tests/pytest/fulltest.sh index 7dec2c961e4d957d4adf2200cddb5974aea1214e..58ab8b99b41e62a5112f4d5013f1926affbf0f96 100755 --- a/tests/pytest/fulltest.sh +++ b/tests/pytest/fulltest.sh @@ -137,6 +137,7 @@ python3 ./test.py -f query/queryError.py python3 ./test.py -f query/filterAllIntTypes.py python3 ./test.py -f query/filterFloatAndDouble.py python3 ./test.py -f query/filterOtherTypes.py +python3 ./test.py -f query/querySort.py #stream python3 ./test.py -f stream/stream1.py diff --git a/tests/pytest/query/querySort.py b/tests/pytest/query/querySort.py new file mode 100644 index 0000000000000000000000000000000000000000..bb806c27bcdc6f6e2892a86be6e7e028fc2a03e2 --- /dev/null +++ b/tests/pytest/query/querySort.py @@ -0,0 +1,80 @@ +################################################################### +# Copyright (c) 2016 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 +import taos +from util.log import * +from util.cases import * +from util.sql import * + + +class TDTestCase: + def init(self, conn, logSql): + tdLog.debug("start to execute %s" % __file__) + tdSql.init(conn.cursor()) + + self.rowNum = 10 + self.ts = 1537146000000 + + def run(self): + tdSql.prepare() + + print("======= step 1: create table and insert data =========") + tdLog.debug( + ''' create table st(ts timestamp, tbcol1 tinyint, tbcol2 smallint, tbcol3 int, tbcol4 bigint, tbcol5 float, tbcol6 double, + tbcol7 bool, tbcol8 nchar(20), tbcol9 binary(20)) tags(tagcol1 tinyint, tagcol2 smallint, tagcol3 int, tagcol4 bigint, tagcol5 float, + tagcol6 double, tagcol7 bool, tagcol8 nchar(20), tagcol9 binary(20))''') + tdSql.execute( + ''' create table st(ts timestamp, tbcol1 tinyint, tbcol2 smallint, tbcol3 int, tbcol4 bigint, tbcol5 float, tbcol6 double, + tbcol7 bool, tbcol8 nchar(20), tbcol9 binary(20)) tags(tagcol1 tinyint, tagcol2 smallint, tagcol3 int, tagcol4 bigint, tagcol5 float, + tagcol6 double, tagcol7 bool, tagcol8 nchar(20), tagcol9 binary(20))''') + + for i in range(self.rowNum): + tdSql.execute("create table st%d using st tags(%d, %d, %d, %d, %f, %f, %d, 'tag%d', '标签%d')" % (i + 1, i + 1, i + 1, i + 1, i + 1, 1.1 * (i + 1), + 1.23 * (i + 1), (i + 1) % 2, i + 1, i + 1)) + for j in range(self.rowNum): + tdSql.execute("insert into st%d values(%d, %d, %d, %d, %d, %f, %f, %d, 'taosdata%d', '涛思数据%d')" % (i + 1, self.ts + 10 * (i + 1) + j + 1, + j + 1, j + 1, j + 1, j + 1, 1.1 * (j + 1), 1.23 * (j + 1), (j + 1) % 2, j + 1, j + 1)) + + + print("======= step 2: verify order for each column =========") + # sort for timestamp in asc order + tdSql.query("select * from st order by ts asc") + tdSql.checkColumnSorted(0, "asc") + + # sort for timestamp in desc order + tdSql.query("select * from st order by ts desc") + tdSql.checkColumnSorted(0, "desc") + + + for i in range(1, 10): + tdSql.error("select * from st order by tbcol%d" % i) + tdSql.error("select * from st order by tbcol%d asc" % i) + tdSql.error("select * from st order by tbcol%d desc" % i) + + tdSql.query("select avg(tbcol1) from st group by tagcol%d order by tagcol%d" % (i, i)) + tdSql.checkColumnSorted(1, "") + + tdSql.query("select avg(tbcol1) from st group by tagcol%d order by tagcol%d asc" % (i, i)) + tdSql.checkColumnSorted(1, "asc") + + tdSql.query("select avg(tbcol1) from st group by tagcol%d order by tagcol%d desc" % (i, i)) + tdSql.checkColumnSorted(1, "desc") + + def stop(self): + tdSql.close() + tdLog.success("%s successfully executed" % __file__) + + +tdCases.addWindows(__file__, TDTestCase()) +tdCases.addLinux(__file__, TDTestCase()) diff --git a/tests/pytest/regressiontest.sh b/tests/pytest/regressiontest.sh index 743a837f5efb5235198ebd90223159aa42405013..97a069f237f345ffae889a8c0b70da5a5714c7da 100755 --- a/tests/pytest/regressiontest.sh +++ b/tests/pytest/regressiontest.sh @@ -133,6 +133,7 @@ python3 ./test.py -f user/pass_len.py python3 ./test.py -f query/filter.py python3 ./test.py -f query/filterAllIntTypes.py python3 ./test.py -f query/filterFloatAndDouble.py +python3 ./test.py -f query/querySort.py #stream diff --git a/tests/pytest/util/sql.py b/tests/pytest/util/sql.py index ec7ac117c07ee6c34ea91ffbb148729ab4c55119..367217cd49b412c775a8ec08c52168596f66c5d7 100644 --- a/tests/pytest/util/sql.py +++ b/tests/pytest/util/sql.py @@ -17,6 +17,7 @@ import time import datetime import inspect from util.log import * +import numpy as np class TDSql: @@ -196,5 +197,39 @@ class TDSql: tdLog.info("sql:%s, affectedRows:%d == expect:%d" % (self.sql, self.affectedRows, expectAffectedRows)) + def checkColumnSorted(self, col, order): + frame = inspect.stack()[1] + callerModule = inspect.getmodule(frame[0]) + callerFilename = callerModule.__file__ + + if col < 0: + tdLog.exit( + "%s failed: sql:%s, col:%d is smaller than zero" % + (callerFilename, self.sql, col)) + if col > self.queryCols: + tdLog.exit( + "%s failed: sql:%s, col:%d is larger than queryCols:%d" % + (callerFilename, self.sql, col, self.queryCols)) + + matrix = np.array(self.queryResult) + list = matrix[:, 0] + + if order == "" or order.upper() == "ASC": + if all(sorted(list) == list): + tdLog.info("sql:%s, column :%d is sorted in accending order as expected" % + (self.sql, col)) + else: + tdLog.exit("%s failed: sql:%s, col:%d is not sorted in accesnind order" % + (callerFilename, self.sql, col)) + elif order.upper() == "DESC": + if all(sorted(list, reverse=True) == list): + tdLog.info("sql:%s, column :%d is sorted in decending order as expected" % + (self.sql, col)) + else: + tdLog.exit("%s failed: sql:%s, col:%d is not sorted in decending order" % + (callerFilename, self.sql, col)) + else: + tdLog.exit("%s failed: sql:%s, the order provided for col:%d is not correct" % + (callerFilename, self.sql, col)) tdSql = TDSql()