max.py 10.1 KB
Newer Older
J
jiacy-jcy 已提交
1 2 3 4 5 6 7
from util.log import *
from util.cases import *
from util.sql import *
import numpy as np


class TDTestCase:
C
cpwu 已提交
8
    updatecfgDict = {"maxTablesPerVnode":2 ,"minTablesPerVnode":2,"tableIncStepPerVnode":2 }
J
jiacy-jcy 已提交
9 10 11 12 13 14
    def init(self, conn, logSql):
        tdLog.debug("start to execute %s" % __file__)
        tdSql.init(conn.cursor())

        self.rowNum = 10
        self.ts = 1537146000000
J
jiacy-jcy 已提交
15 16
        self.binary_str = 'taosdata'
        self.nchar_str = '涛思数据'
C
cpwu 已提交
17
    def max_check_stb_and_tb_base(self, dbname="db"):
J
jiacy-jcy 已提交
18
        tdSql.prepare()
G
Ganlin Zhao 已提交
19
        intData = []
J
jiacy-jcy 已提交
20
        floatData = []
C
cpwu 已提交
21
        tdSql.execute(f'''create table {dbname}.stb(ts timestamp, col1 tinyint, col2 smallint, col3 int, col4 bigint, col5 tinyint unsigned, col6 smallint unsigned,
J
jiacy-jcy 已提交
22
                    col7 int unsigned, col8 bigint unsigned, col9 float, col10 double, col11 bool, col12 binary(20), col13 nchar(20)) tags(loc nchar(20))''')
C
cpwu 已提交
23
        tdSql.execute(f"create table {dbname}.stb_1 using {dbname}.stb tags('beijing')")
J
jiacy-jcy 已提交
24
        for i in range(self.rowNum):
C
cpwu 已提交
25
            tdSql.execute(f"insert into {dbname}.stb_1 values(%d, %d, %d, %d, %d, %d, %d, %d, %d, %f, %f, %d, '{self.binary_str}%d', '{self.nchar_str}%d')"
J
jiacy-jcy 已提交
26
                          % (self.ts + i, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 0.1, i + 0.1, i % 2, i + 1, i + 1))
G
Ganlin Zhao 已提交
27
            intData.append(i + 1)
J
jiacy-jcy 已提交
28
            floatData.append(i + 0.1)
J
jiacy-jcy 已提交
29
        for i in ['ts','col11','col12','col13']:
C
cpwu 已提交
30 31
            for j in ['stb','stb_1']:
                tdSql.error(f'select max({i} from {dbname}.{j} )')
J
jiacy-jcy 已提交
32 33

        for i in range(1,11):
C
cpwu 已提交
34 35
            for j in ['stb', 'stb_1']:
                tdSql.query(f"select max(col{i}) from {dbname}.{j}")
J
jiacy-jcy 已提交
36 37 38 39
                if i<9:
                    tdSql.checkData(0, 0, np.max(intData))
                elif i>=9:
                    tdSql.checkData(0, 0, np.max(floatData))
C
cpwu 已提交
40
        tdSql.query(f"select max(col1) from {dbname}.stb_1 where col2<=5")
J
jiacy-jcy 已提交
41
        tdSql.checkData(0,0,5)
C
cpwu 已提交
42
        tdSql.query(f"select max(col1) from {dbname}.stb where col2<=5")
J
jiacy-jcy 已提交
43
        tdSql.checkData(0,0,5)
G
Ganlin Zhao 已提交
44

C
cpwu 已提交
45
    def max_check_ntb_base(self, dbname="db"):
J
jiacy-jcy 已提交
46
        tdSql.prepare()
G
Ganlin Zhao 已提交
47
        intData = []
J
jiacy-jcy 已提交
48
        floatData = []
C
cpwu 已提交
49
        tdSql.execute(f'''create table {dbname}.ntb(ts timestamp, col1 tinyint, col2 smallint, col3 int, col4 bigint, col5 tinyint unsigned, col6 smallint unsigned,
J
jiacy-jcy 已提交
50 51
                    col7 int unsigned, col8 bigint unsigned, col9 float, col10 double, col11 bool, col12 binary(20), col13 nchar(20))''')
        for i in range(self.rowNum):
C
cpwu 已提交
52
            tdSql.execute(f"insert into {dbname}.ntb values(%d, %d, %d, %d, %d, %d, %d, %d, %d, %f, %f, %d, '{self.binary_str}%d', '{self.nchar_str}%d')"
J
jiacy-jcy 已提交
53
                          % (self.ts + i, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 0.1, i + 0.1, i % 2, i + 1, i + 1))
G
Ganlin Zhao 已提交
54
            intData.append(i + 1)
J
jiacy-jcy 已提交
55 56
            floatData.append(i + 0.1)
        for i in ['ts','col11','col12','col13']:
C
cpwu 已提交
57 58
            for j in ['ntb']:
                tdSql.error(f'select max({i} from {dbname}.{j} )')
J
jiacy-jcy 已提交
59
        for i in range(1,11):
C
cpwu 已提交
60 61
            for j in ['ntb']:
                tdSql.query(f"select max(col{i}) from {dbname}.{j}")
J
jiacy-jcy 已提交
62 63 64 65
                if i<9:
                    tdSql.checkData(0, 0, np.max(intData))
                elif i>=9:
                    tdSql.checkData(0, 0, np.max(floatData))
C
cpwu 已提交
66
        tdSql.query(f"select max(col1) from {dbname}.ntb where col2<=5")
J
jiacy-jcy 已提交
67
        tdSql.checkData(0,0,5)
68 69 70 71 72 73 74 75

    def check_max_functions(self, tbname , col_name):

        max_sql = f"select max({col_name}) from {tbname};"

        same_sql = f"select {col_name} from {tbname} order by {col_name} desc limit 1"

        tdSql.query(max_sql)
G
Ganlin Zhao 已提交
76
        max_result = tdSql.queryResult
77 78 79 80 81 82 83 84 85 86

        tdSql.query(same_sql)
        same_result = tdSql.queryResult

        if max_result !=same_result:
            tdLog.exit(" max function work not as expected, sql : %s "% max_sql)
        else:
            tdLog.info(" max function work as expected, sql : %s "% max_sql)


C
cpwu 已提交
87
    def support_distributed_aggregate(self, dbname="testdb"):
G
Ganlin Zhao 已提交
88

89
        # prepate datas for  20 tables distributed at different vgroups
C
cpwu 已提交
90 91
        tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 1000 vgroups 5")
        tdSql.execute(f"use {dbname} ")
92
        tdSql.execute(
C
cpwu 已提交
93
            f'''create table {dbname}.stb1
94 95 96 97 98 99
            (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
            tags (t0 timestamp, t1 int, t2 bigint, t3 smallint, t4 tinyint, t5 float, t6 double, t7 bool, t8 binary(16),t9 nchar(32))
            '''
        )

        tdSql.execute(
C
cpwu 已提交
100 101
            f'''
            create table {dbname}.t1
102 103 104 105
            (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
            '''
        )
        for i in range(20):
C
cpwu 已提交
106
            tdSql.execute(f'create table {dbname}.ct{i+1} using {dbname}.stb1 tags ( now(), {1*i}, {11111*i}, {111*i}, {1*i}, {1.11*i}, {11.11*i}, {i%2}, "binary{i}", "nchar{i}" )')
107 108 109

        for i in range(9):
            tdSql.execute(
C
cpwu 已提交
110
                f"insert into {dbname}.ct1 values ( now()-{i*10}s, {1*i}, {11111*i}, {111*i}, {11*i}, {1.11*i}, {11.11*i}, {i%2}, 'binary{i}', 'nchar{i}', now()+{1*i}a )"
111 112
            )
            tdSql.execute(
C
cpwu 已提交
113
                f"insert into {dbname}.ct4 values ( now()-{i*90}d, {1*i}, {11111*i}, {111*i}, {11*i}, {1.11*i}, {11.11*i}, {i%2}, 'binary{i}', 'nchar{i}', now()+{1*i}a )"
114 115 116 117 118 119
            )

        for i in range(1,21):
            if i ==1 or i == 4:
                continue
            else:
C
cpwu 已提交
120
                tbname = f"{dbname}.ct{i}"
121 122 123 124
                for j in range(9):
                    tdSql.execute(
                f"insert into {tbname} values ( now()-{(i+j)*10}s, {1*(j+i)}, {11111*(j+i)}, {111*(j+i)}, {11*(j)}, {1.11*(j+i)}, {11.11*(j+i)}, {(j+i)%2}, 'binary{j}', 'nchar{j}', now()+{1*j}a )"
            )
C
cpwu 已提交
125 126 127 128
        tdSql.execute(f"insert into {dbname}.ct1 values (now()-45s, 0, 0, 0, 0, 0, 0, 0, 'binary0', 'nchar0', now()+8a )")
        tdSql.execute(f"insert into {dbname}.ct1 values (now()+10s, 9, -99999, -999, -99, -9.99, -99.99, 1, 'binary9', 'nchar9', now()+9a )")
        tdSql.execute(f"insert into {dbname}.ct1 values (now()+15s, 9, -99999, -999, -99, -9.99, NULL, 1, 'binary9', 'nchar9', now()+9a )")
        tdSql.execute(f"insert into {dbname}.ct1 values (now()+20s, 9, -99999, -999, NULL, -9.99, -99.99, 1, 'binary9', 'nchar9', now()+9a )")
129

C
cpwu 已提交
130 131 132
        tdSql.execute(f"insert into {dbname}.ct4 values (now()-810d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
        tdSql.execute(f"insert into {dbname}.ct4 values (now()-400d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
        tdSql.execute(f"insert into {dbname}.ct4 values (now()+90d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL  ) ")
133 134

        tdSql.execute(
C
cpwu 已提交
135
            f'''insert into {dbname}.t1 values
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
            ( '2020-04-21 01:01:01.000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL )
            ( '2020-10-21 01:01:01.000', 1, 11111, 111, 11, 1.11, 11.11, 1, "binary1", "nchar1", now()+1a )
            ( '2020-12-31 01:01:01.000', 2, 22222, 222, 22, 2.22, 22.22, 0, "binary2", "nchar2", now()+2a )
            ( '2021-01-01 01:01:06.000', 3, 33333, 333, 33, 3.33, 33.33, 0, "binary3", "nchar3", now()+3a )
            ( '2021-05-07 01:01:10.000', 4, 44444, 444, 44, 4.44, 44.44, 1, "binary4", "nchar4", now()+4a )
            ( '2021-07-21 01:01:01.000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL )
            ( '2021-09-30 01:01:16.000', 5, 55555, 555, 55, 5.55, 55.55, 0, "binary5", "nchar5", now()+5a )
            ( '2022-02-01 01:01:20.000', 6, 66666, 666, 66, 6.66, 66.66, 1, "binary6", "nchar6", now()+6a )
            ( '2022-10-28 01:01:26.000', 7, 00000, 000, 00, 0.00, 00.00, 1, "binary7", "nchar7", "1970-01-01 08:00:00.000" )
            ( '2022-12-01 01:01:30.000', 8, -88888, -888, -88, -8.88, -88.88, 0, "binary8", "nchar8", "1969-01-01 01:00:00.000" )
            ( '2022-12-31 01:01:36.000', 9, -99999999999999999, -999, -99, -9.99, -999999999999999999999.99, 1, "binary9", "nchar9", "1900-01-01 00:00:00.000" )
            ( '2023-02-21 01:01:01.000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL )
            '''
        )

        tdLog.info(" prepare data for distributed_aggregate done! ")

        # get vgroup_ids of all
C
cpwu 已提交
154
        tdSql.query(f"show {dbname}.vgroups ")
155 156 157
        vgroups = tdSql.queryResult

        vnode_tables={}
G
Ganlin Zhao 已提交
158

159 160
        for vgroup_id in vgroups:
            vnode_tables[vgroup_id[0]]=[]
G
Ganlin Zhao 已提交
161

162 163

        # check sub_table of per vnode ,make sure sub_table has been distributed
C
cpwu 已提交
164
        tdSql.query(f"select * from information_schema.ins_tables where db_name = '{dbname}' and table_name like 'ct%'")
165 166 167
        table_names = tdSql.queryResult
        tablenames = []
        for table_name in table_names:
G
Ganlin Zhao 已提交
168
            vnode_tables[table_name[6]].append(table_name[0])
169 170 171 172 173 174 175 176

        count = 0
        for k ,v in vnode_tables.items():
            if len(v)>=2:
                count+=1
        if count < 2:
            tdLog.exit(" the datas of all not satisfy sub_table has been distributed ")

G
Ganlin Zhao 已提交
177 178
        # check max function work status

C
cpwu 已提交
179
        tdSql.query(f"show {dbname}.tables like 'ct%'")
180 181 182 183 184
        table_names = tdSql.queryResult
        tablenames = []
        for table_name in table_names:
            tablenames.append(table_name[0])

C
cpwu 已提交
185
        tdSql.query(f"desc {dbname}.stb1")
186
        col_names = tdSql.queryResult
G
Ganlin Zhao 已提交
187

188 189 190 191
        colnames = []
        for col_name in col_names:
            if col_name[1] in ["INT" ,"BIGINT" ,"SMALLINT" ,"TINYINT" , "FLOAT" ,"DOUBLE"]:
                colnames.append(col_name[0])
G
Ganlin Zhao 已提交
192

193 194
        for tablename in tablenames:
            for colname in colnames:
C
cpwu 已提交
195
                self.check_max_functions(f"{dbname}.{tablename}", colname)
196

G
Ganlin Zhao 已提交
197
    def run(self):
J
jiacy-jcy 已提交
198

G
Ganlin Zhao 已提交
199
        # max verifacation
J
jiacy-jcy 已提交
200 201
        self.max_check_stb_and_tb_base()
        self.max_check_ntb_base()
J
jiacy-jcy 已提交
202

203
        self.support_distributed_aggregate()
J
jiacy-jcy 已提交
204 205 206 207 208 209 210

    def stop(self):
        tdSql.close()
        tdLog.success("%s successfully executed" % __file__)

tdCases.addWindows(__file__, TDTestCase())
tdCases.addLinux(__file__, TDTestCase())