unique.py 23.3 KB
Newer Older
W
wenzhouwww@live.cn 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
from math import floor
from random import randint, random
from numpy import equal
import taos
import sys
import datetime
import inspect

from util.log import *
from util.sql import *
from util.cases import *

class TDTestCase:

15
    def init(self, conn, logSql, replicaVar=1):
16
        self.replicaVar = int(replicaVar)
W
wenzhouwww@live.cn 已提交
17 18
        tdLog.debug(f"start to excute {__file__}")
        tdSql.init(conn.cursor())
G
Ganlin Zhao 已提交
19

C
cpwu 已提交
20
    def prepare_datas(self, dbname="db"):
W
wenzhouwww@live.cn 已提交
21
        tdSql.execute(
C
cpwu 已提交
22
            f'''create table {dbname}.stb1
W
wenzhouwww@live.cn 已提交
23 24 25 26
            (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 (t1 int)
            '''
        )
G
Ganlin Zhao 已提交
27

W
wenzhouwww@live.cn 已提交
28
        tdSql.execute(
C
cpwu 已提交
29 30
            f'''
            create table {dbname}.t1
W
wenzhouwww@live.cn 已提交
31 32 33 34
            (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(4):
C
cpwu 已提交
35
            tdSql.execute(f'create table {dbname}.ct{i+1} using {dbname}.stb1 tags ( {i+1} )')
W
wenzhouwww@live.cn 已提交
36 37 38

        for i in range(9):
            tdSql.execute(
C
cpwu 已提交
39
                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 )"
W
wenzhouwww@live.cn 已提交
40 41
            )
            tdSql.execute(
C
cpwu 已提交
42
                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 )"
W
wenzhouwww@live.cn 已提交
43
            )
C
cpwu 已提交
44 45 46 47
        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 )")
W
wenzhouwww@live.cn 已提交
48

C
cpwu 已提交
49 50 51
        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  ) ")
W
wenzhouwww@live.cn 已提交
52 53

        tdSql.execute(
C
cpwu 已提交
54
            f'''insert into {dbname}.t1 values
W
wenzhouwww@live.cn 已提交
55 56 57 58 59 60 61 62 63 64 65 66 67 68
            ( '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 )
            '''
        )
G
Ganlin Zhao 已提交
69

C
cpwu 已提交
70
    def test_errors(self, dbname="db"):
W
wenzhouwww@live.cn 已提交
71
        error_sql_lists = [
C
cpwu 已提交
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
            f"select unique from  {dbname}.t1",
            f"select unique(123--123)==1 from  {dbname}.t1",
            f"select unique(123,123) from  {dbname}.t1",
            f"select unique(c1,ts) from  {dbname}.t1",
            f"select unique(c1,c1,ts) from  {dbname}.t1",
            f"select unique(c1) as 'd1' from  {dbname}.t1",
            f"select unique(c1 ,c2 ) from  {dbname}.t1",
            f"select unique(c1 ,NULL) from  {dbname}.t1",
            f"select unique(,) from  {dbname}.t1;",
            f"select unique(floor(c1) ab from  {dbname}.t1)",
            f"select unique(c1) as int from  {dbname}.t1",
            f"select unique('c1') from  {dbname}.t1",
            f"select unique(NULL) from  {dbname}.t1",
            f"select unique('') from  {dbname}.t1",
            f"select unique(c%) from  {dbname}.t1",
            f"select unique(t1) from  {dbname}.t1",
            f"select unique(True) from  {dbname}.t1",
            f"select unique(c1) , count(c1) from  {dbname}.t1",
            f"select unique(c1) , avg(c1) from  {dbname}.t1",
            f"select unique(c1) , min(c1) from  {dbname}.t1",
            f"select unique(c1) , spread(c1) from  {dbname}.t1",
            f"select unique(c1) , diff(c1) from  {dbname}.t1",
            #f"select unique(c1) , abs(c1) from  {dbname}.t1",  # support
            #f"select unique(c1) , c1 from  {dbname}.t1",
            f"select unique from  {dbname}.stb1 partition by tbname",
            f"select unique(123--123)==1 from  {dbname}.stb1 partition by tbname",
            f"select unique(123) from  {dbname}.stb1 partition by tbname",
            f"select unique(c1,ts) from  {dbname}.stb1 partition by tbname",
            f"select unique(c1,c1,ts) from  {dbname}.stb1 partition by tbname",
            f"select unique(c1) as 'd1' from  {dbname}.stb1 partition by tbname",
            f"select unique(c1 ,c2 ) from  {dbname}.stb1 partition by tbname",
            f"select unique(c1 ,NULL) from  {dbname}.stb1 partition by tbname",
            f"select unique(,) from  {dbname}.stb1 partition by tbname;",
            #f"select unique(floor(c1) ab from  {dbname}.stb1 partition by tbname)",  # support
            #f"select unique(c1) as int from  {dbname}.stb1 partition by tbname",
            f"select unique('c1') from  {dbname}.stb1 partition by tbname",
            f"select unique(NULL) from  {dbname}.stb1 partition by tbname",
            f"select unique('') from  {dbname}.stb1 partition by tbname",
            f"select unique(c%) from  {dbname}.stb1 partition by tbname",
            #f"select unique(t1) from  {dbname}.stb1 partition by tbname",  # support
            f"select unique(True) from  {dbname}.stb1 partition by tbname",
            f"select unique(c1) , count(c1) from  {dbname}.stb1 partition by tbname",
            f"select unique(c1) , avg(c1) from  {dbname}.stb1 partition by tbname",
            f"select unique(c1) , min(c1) from  {dbname}.stb1 partition by tbname",
            f"select unique(c1) , spread(c1) from  {dbname}.stb1 partition by tbname",
            f"select unique(c1) , diff(c1) from  {dbname}.stb1 partition by tbname",
            #f"select unique(c1) , abs(c1) from  {dbname}.stb1 partition by tbname", # support
            #f"select unique(c1) , c1 from  {dbname}.stb1 partition by tbname" # support
G
Ganlin Zhao 已提交
120

W
wenzhouwww@live.cn 已提交
121 122 123 124
        ]
        for error_sql in error_sql_lists:
            tdSql.error(error_sql)
            pass
G
Ganlin Zhao 已提交
125

C
cpwu 已提交
126
    def support_types(self, dbname="db"):
W
wenzhouwww@live.cn 已提交
127
        other_no_value_types = [
C
cpwu 已提交
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
            f"select unique(ts) from  {dbname}.t1" ,
            f"select unique(c7) from  {dbname}.t1",
            f"select unique(c8) from  {dbname}.t1",
            f"select unique(c9) from  {dbname}.t1",
            f"select unique(ts) from  {dbname}.ct1" ,
            f"select unique(c7) from  {dbname}.ct1",
            f"select unique(c8) from  {dbname}.ct1",
            f"select unique(c9) from  {dbname}.ct1",
            f"select unique(ts) from  {dbname}.ct3" ,
            f"select unique(c7) from  {dbname}.ct3",
            f"select unique(c8) from  {dbname}.ct3",
            f"select unique(c9) from  {dbname}.ct3",
            f"select unique(ts) from  {dbname}.ct4" ,
            f"select unique(c7) from  {dbname}.ct4",
            f"select unique(c8) from  {dbname}.ct4",
            f"select unique(c9) from  {dbname}.ct4",
            f"select unique(ts) from  {dbname}.stb1 partition by tbname" ,
            f"select unique(c7) from  {dbname}.stb1 partition by tbname",
            f"select unique(c8) from  {dbname}.stb1 partition by tbname",
            f"select unique(c9) from  {dbname}.stb1 partition by tbname"
W
wenzhouwww@live.cn 已提交
148
        ]
G
Ganlin Zhao 已提交
149

W
wenzhouwww@live.cn 已提交
150 151 152
        for type_sql in other_no_value_types:
            tdSql.query(type_sql)
            tdLog.info("support type ok ,  sql is : %s"%type_sql)
G
Ganlin Zhao 已提交
153

W
wenzhouwww@live.cn 已提交
154
        type_sql_lists = [
C
cpwu 已提交
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
            f"select unique(c1) from  {dbname}.t1",
            f"select unique(c2) from  {dbname}.t1",
            f"select unique(c3) from  {dbname}.t1",
            f"select unique(c4) from  {dbname}.t1",
            f"select unique(c5) from  {dbname}.t1",
            f"select unique(c6) from  {dbname}.t1",

            f"select unique(c1) from  {dbname}.ct1",
            f"select unique(c2) from  {dbname}.ct1",
            f"select unique(c3) from  {dbname}.ct1",
            f"select unique(c4) from  {dbname}.ct1",
            f"select unique(c5) from  {dbname}.ct1",
            f"select unique(c6) from  {dbname}.ct1",

            f"select unique(c1) from  {dbname}.ct3",
            f"select unique(c2) from  {dbname}.ct3",
            f"select unique(c3) from  {dbname}.ct3",
            f"select unique(c4) from  {dbname}.ct3",
            f"select unique(c5) from  {dbname}.ct3",
            f"select unique(c6) from  {dbname}.ct3",

            f"select unique(c1) from  {dbname}.stb1 partition by tbname",
            f"select unique(c2) from  {dbname}.stb1 partition by tbname",
            f"select unique(c3) from  {dbname}.stb1 partition by tbname",
            f"select unique(c4) from  {dbname}.stb1 partition by tbname",
            f"select unique(c5) from  {dbname}.stb1 partition by tbname",
            f"select unique(c6) from  {dbname}.stb1 partition by tbname",

            f"select unique(c6) as alisb from  {dbname}.stb1 partition by tbname",
            f"select unique(c6) alisb from  {dbname}.stb1 partition by tbname",
W
wenzhouwww@live.cn 已提交
185 186 187 188 189 190
        ]

        for type_sql in type_sql_lists:
            tdSql.query(type_sql)

    def check_unique_table(self , unique_sql):
C
cpwu 已提交
191
        # unique_sql =  f"select unique(c1) from  {dbname}.ct1"
W
wenzhouwww@live.cn 已提交
192 193 194
        origin_sql = unique_sql.replace("unique(","").replace(")","")
        tdSql.query(unique_sql)
        unique_result = tdSql.queryResult
G
Ganlin Zhao 已提交
195

W
wenzhouwww@live.cn 已提交
196 197 198
        unique_datas = []
        for elem in unique_result:
            unique_datas.append(elem[0])
199
        unique_datas.sort(key=lambda x: (x is None, x))
G
Ganlin Zhao 已提交
200

W
wenzhouwww@live.cn 已提交
201 202 203 204 205
        tdSql.query(origin_sql)
        origin_result = tdSql.queryResult
        origin_datas = []
        for elem in origin_result:
            origin_datas.append(elem[0])
G
Ganlin Zhao 已提交
206

W
wenzhouwww@live.cn 已提交
207 208 209 210 211 212
        pre_unique = []
        for elem in origin_datas:
            if elem in pre_unique:
                continue
            else:
                pre_unique.append(elem)
213
        pre_unique.sort(key=lambda x: (x is None, x))
W
wenzhouwww@live.cn 已提交
214 215 216 217 218 219

        if pre_unique == unique_datas:
            tdLog.info(" unique query check pass , unique sql is: %s" %unique_sql)
        else:
            tdLog.exit(" unique query check fail , unique sql is: %s " %unique_sql)

C
cpwu 已提交
220
    def basic_unique_function(self, dbname="db"):
W
wenzhouwww@live.cn 已提交
221

G
Ganlin Zhao 已提交
222
        # basic query
C
cpwu 已提交
223
        tdSql.query(f"select c1 from  {dbname}.ct3")
W
wenzhouwww@live.cn 已提交
224
        tdSql.checkRows(0)
C
cpwu 已提交
225
        tdSql.query(f"select c1 from  {dbname}.t1")
W
wenzhouwww@live.cn 已提交
226
        tdSql.checkRows(12)
C
cpwu 已提交
227
        tdSql.query(f"select c1 from  {dbname}.stb1")
W
wenzhouwww@live.cn 已提交
228 229 230
        tdSql.checkRows(25)

        # used for empty table  , ct3 is empty
C
cpwu 已提交
231
        tdSql.query(f"select unique(c1) from  {dbname}.ct3")
W
wenzhouwww@live.cn 已提交
232
        tdSql.checkRows(0)
C
cpwu 已提交
233
        tdSql.query(f"select unique(c2) from  {dbname}.ct3")
W
wenzhouwww@live.cn 已提交
234
        tdSql.checkRows(0)
C
cpwu 已提交
235
        tdSql.query(f"select unique(c3) from  {dbname}.ct3")
W
wenzhouwww@live.cn 已提交
236
        tdSql.checkRows(0)
C
cpwu 已提交
237
        tdSql.query(f"select unique(c4) from  {dbname}.ct3")
W
wenzhouwww@live.cn 已提交
238
        tdSql.checkRows(0)
C
cpwu 已提交
239
        tdSql.query(f"select unique(c5) from  {dbname}.ct3")
W
wenzhouwww@live.cn 已提交
240
        tdSql.checkRows(0)
C
cpwu 已提交
241
        tdSql.query(f"select unique(c6) from  {dbname}.ct3")
W
wenzhouwww@live.cn 已提交
242

G
Ganlin Zhao 已提交
243
        # will support _rowts mix with
C
cpwu 已提交
244
        # tdSql.query(f"select unique(c6),_rowts from  {dbname}.ct3")
G
Ganlin Zhao 已提交
245

W
wenzhouwww@live.cn 已提交
246 247
        # auto check for t1 table
        # used for regular table
C
cpwu 已提交
248
        tdSql.query(f"select unique(c1) from  {dbname}.t1")
G
Ganlin Zhao 已提交
249

C
cpwu 已提交
250
        tdSql.query(f"desc {dbname}.t1")
W
wenzhouwww@live.cn 已提交
251 252 253 254
        col_lists_rows = tdSql.queryResult
        col_lists = []
        for col_name in col_lists_rows:
            col_lists.append(col_name[0])
G
Ganlin Zhao 已提交
255

W
wenzhouwww@live.cn 已提交
256
        for col in col_lists:
C
cpwu 已提交
257
            self.check_unique_table(f"select unique({col}) from  {dbname}.t1")
W
wenzhouwww@live.cn 已提交
258 259 260

        # unique with super tags

C
cpwu 已提交
261
        tdSql.query(f"select unique(c1) from  {dbname}.ct1")
W
wenzhouwww@live.cn 已提交
262 263
        tdSql.checkRows(10)

C
cpwu 已提交
264
        tdSql.query(f"select unique(c1) from  {dbname}.ct4")
W
wenzhouwww@live.cn 已提交
265 266
        tdSql.checkRows(10)

C
cpwu 已提交
267 268
        #tdSql.error(f"select unique(c1),tbname from  {dbname}.ct1") #support
        #tdSql.error(f"select unique(c1),t1 from  {dbname}.ct1")    #support
W
wenzhouwww@live.cn 已提交
269

G
Ganlin Zhao 已提交
270
        # unique with common col
C
cpwu 已提交
271 272
        #tdSql.error(f"select unique(c1) ,ts  from  {dbname}.ct1")
        #tdSql.error(f"select unique(c1) ,c1  from  {dbname}.ct1")
W
wenzhouwww@live.cn 已提交
273

G
Ganlin Zhao 已提交
274
        # unique with scalar function
C
cpwu 已提交
275 276 277
        #tdSql.error(f"select unique(c1) ,abs(c1)  from  {dbname}.ct1")
        tdSql.error(f"select unique(c1) , unique(c2) from  {dbname}.ct1")
        #tdSql.error(f"select unique(c1) , abs(c2)+2 from  {dbname}.ct1")
W
wenzhouwww@live.cn 已提交
278

G
Ganlin Zhao 已提交
279 280

        # unique with aggregate function
C
cpwu 已提交
281 282 283 284
        tdSql.error(f"select unique(c1) ,sum(c1)  from  {dbname}.ct1")
        tdSql.error(f"select unique(c1) ,max(c1)  from  {dbname}.ct1")
        tdSql.error(f"select unique(c1) ,csum(c1)  from  {dbname}.ct1")
        tdSql.error(f"select unique(c1) ,count(c1)  from  {dbname}.ct1")
W
wenzhouwww@live.cn 已提交
285 286

        # unique with filter where
C
cpwu 已提交
287
        tdSql.query(f"select unique(c1) from  {dbname}.ct4 where c1 is null")
W
wenzhouwww@live.cn 已提交
288 289
        tdSql.checkData(0, 0, None)

C
cpwu 已提交
290
        tdSql.query(f"select unique(c1) from  {dbname}.ct4 where c1 >2 order by 1")
291 292 293 294
        tdSql.checkData(0, 0, 3)
        tdSql.checkData(1, 0, 4)
        tdSql.checkData(2, 0, 5)
        tdSql.checkData(5, 0, 8)
W
wenzhouwww@live.cn 已提交
295

C
cpwu 已提交
296
        tdSql.query(f"select unique(c1) from  {dbname}.ct4  where c2 between 0  and   99999 order by 1 desc")
W
wenzhouwww@live.cn 已提交
297 298 299 300 301 302 303 304 305 306
        tdSql.checkData(0, 0, 8)
        tdSql.checkData(1, 0, 7)
        tdSql.checkData(2, 0, 6)
        tdSql.checkData(3, 0, 5)
        tdSql.checkData(4, 0, 4)
        tdSql.checkData(5, 0, 3)
        tdSql.checkData(6, 0, 2)
        tdSql.checkData(7, 0, 1)
        tdSql.checkData(8, 0, 0)

G
Ganlin Zhao 已提交
307
        # unique with union all
C
cpwu 已提交
308
        tdSql.query(f"select unique(c1) from  {dbname}.ct4 union all select c1 from  {dbname}.ct1")
W
wenzhouwww@live.cn 已提交
309
        tdSql.checkRows(23)
C
cpwu 已提交
310
        tdSql.query(f"select unique(c1) from  {dbname}.ct4 union all select distinct(c1) from  {dbname}.ct4")
W
wenzhouwww@live.cn 已提交
311
        tdSql.checkRows(20)
C
cpwu 已提交
312
        tdSql.query(f"select unique(c2) from  {dbname}.ct4 union all select abs(c2)/2 from  {dbname}.ct4")
W
wenzhouwww@live.cn 已提交
313 314
        tdSql.checkRows(22)

G
Ganlin Zhao 已提交
315 316
        # unique with join
        # prepare join datas with same ts
W
wenzhouwww@live.cn 已提交
317 318

        tdSql.execute(" use db ")
C
cpwu 已提交
319 320 321
        tdSql.execute(" create stable db.st1 (ts timestamp , num int) tags(ind int)")
        tdSql.execute(" create table db.tb1 using db.st1 tags(1)")
        tdSql.execute(" create table db.tb2 using db.st1 tags(2)")
W
wenzhouwww@live.cn 已提交
322

C
cpwu 已提交
323 324 325
        tdSql.execute(" create stable db.st2 (ts timestamp , num int) tags(ind int)")
        tdSql.execute(" create table db.ttb1 using db.st2 tags(1)")
        tdSql.execute(" create table db.ttb2 using db.st2 tags(2)")
W
wenzhouwww@live.cn 已提交
326 327 328 329 330

        start_ts = 1622369635000 # 2021-05-30 18:13:55

        for i in range(10):
            ts_value = start_ts+i*1000
C
cpwu 已提交
331 332
            tdSql.execute(f" insert into {dbname}.tb1 values({ts_value} , {i})")
            tdSql.execute(f" insert into {dbname}.tb2 values({ts_value} , {i})")
W
wenzhouwww@live.cn 已提交
333

C
cpwu 已提交
334 335
            tdSql.execute(f" insert into {dbname}.ttb1 values({ts_value} , {i})")
            tdSql.execute(f" insert into {dbname}.ttb2 values({ts_value} , {i})")
W
wenzhouwww@live.cn 已提交
336

C
cpwu 已提交
337
        tdSql.query(f"select unique(tb2.num)  from db.tb1 tb1, db.tb2 tb2 where tb1.ts=tb2.ts order by 1")
W
wenzhouwww@live.cn 已提交
338 339 340 341 342 343
        tdSql.checkRows(10)
        tdSql.checkData(0,0,0)
        tdSql.checkData(1,0,1)
        tdSql.checkData(2,0,2)
        tdSql.checkData(9,0,9)

C
cpwu 已提交
344
        tdSql.query(f"select unique(tb2.num)  from db.tb1 tb1, db.tb2 tb2 where tb1.ts=tb2.ts union all select unique(tb1.num)  from  db.tb1 tb1, db.tb2 tb2 where tb1.ts=tb2.ts order by 1")
W
wenzhouwww@live.cn 已提交
345 346
        tdSql.checkRows(20)
        tdSql.checkData(0,0,0)
347 348 349
        tdSql.checkData(2,0,1)
        tdSql.checkData(4,0,2)
        tdSql.checkData(18,0,9)
W
wenzhouwww@live.cn 已提交
350 351

        # nest query
C
cpwu 已提交
352 353
        # tdSql.query(f"select unique(c1) from (select c1 from  {dbname}.ct1)")
        tdSql.query(f"select c1 from (select unique(c1) c1 from  {dbname}.ct4) order by 1 desc nulls first")
W
wenzhouwww@live.cn 已提交
354 355 356 357 358
        tdSql.checkRows(10)
        tdSql.checkData(0, 0, None)
        tdSql.checkData(1, 0, 8)
        tdSql.checkData(9, 0, 0)

C
cpwu 已提交
359
        tdSql.query(f"select sum(c1) from (select unique(c1) c1 from  {dbname}.ct1)")
W
wenzhouwww@live.cn 已提交
360 361 362
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, 45)

C
cpwu 已提交
363
        tdSql.query(f"select sum(c1) from (select distinct(c1) c1 from  {dbname}.ct1) union all select sum(c1) from (select unique(c1) c1 from  {dbname}.ct1)")
W
wenzhouwww@live.cn 已提交
364 365 366 367
        tdSql.checkRows(2)
        tdSql.checkData(0, 0, 45)
        tdSql.checkData(1, 0, 45)

C
cpwu 已提交
368
        tdSql.query(f"select 1-abs(c1) from (select unique(c1) c1 from  {dbname}.ct4) order by 1 nulls first")
W
wenzhouwww@live.cn 已提交
369 370 371
        tdSql.checkRows(10)
        tdSql.checkData(0, 0, None)
        tdSql.checkData(1, 0, -7.000000000)
G
Ganlin Zhao 已提交
372

W
wenzhouwww@live.cn 已提交
373 374 375

        # bug for stable
        #partition by tbname
C
cpwu 已提交
376
        # tdSql.query(f"select unique(c1) from  {dbname}.stb1 partition by tbname ")
W
wenzhouwww@live.cn 已提交
377 378
        # tdSql.checkRows(21)

C
cpwu 已提交
379
        # tdSql.query(f"select unique(c1) from  {dbname}.stb1 partition by tbname ")
W
wenzhouwww@live.cn 已提交
380
        # tdSql.checkRows(21)
G
Ganlin Zhao 已提交
381 382

        # group by
C
cpwu 已提交
383 384
        tdSql.error(f"select unique(c1) from  {dbname}.ct1 group by c1")
        tdSql.error(f"select unique(c1) from  {dbname}.ct1 group by tbname")
W
wenzhouwww@live.cn 已提交
385 386

        # super table
387 388

        # super table
C
cpwu 已提交
389 390
        tdSql.error(f"select tbname , tail(c1,2) from  {dbname}.stb1 group by tbname")
        tdSql.query(f"select tail(c1,2) from  {dbname}.stb1 partition by tbname")
391
        tdSql.checkRows(4)
W
wenzhouwww@live.cn 已提交
392 393


G
Ganlin Zhao 已提交
394
        # bug need fix
C
cpwu 已提交
395
        # tdSql.query(f"select tbname , tail(c1,2) from  {dbname}.stb1 partition by tbname")
396 397
        # tdSql.checkRows(4)

C
cpwu 已提交
398
        # tdSql.query(f"select tbname , tail(c1,2) from  {dbname}.stb1 partition by tbname order by tbname")
399 400
        # tdSql.checkRows(4)

C
cpwu 已提交
401
        # tdSql.query(f"select tbname , count(c1) from  {dbname}.stb1 partition by tbname order by tbname ")
402
        # tdSql.checkRows(2)
C
cpwu 已提交
403
        # tdSql.query(f"select tbname , max(c1) ,c1 from  {dbname}.stb1 partition by tbname order by tbname ")
404
        # tdSql.checkRows(2)
C
cpwu 已提交
405
        # tdSql.query(f"select tbname ,first(c1) from  {dbname}.stb1 partition by tbname order by tbname ")
406 407
        # tdSql.checkRows(2)

C
cpwu 已提交
408
        tdSql.query(f"select tail(c1,2) from  {dbname}.stb1 partition by tbname")
409 410 411
        tdSql.checkRows(4)


G
Ganlin Zhao 已提交
412
        # # bug need fix
C
cpwu 已提交
413
        # tdSql.query(f"select tbname , unique(c1) from  {dbname}.stb1  where t1 = 0 partition by tbname ")
414
        # tdSql.checkRows(2)
C
cpwu 已提交
415
        # tdSql.query(f"select tbname , unique(c1) from  {dbname}.stb1  where t1 = 0 partition by tbname order by tbname ")
416
        # tdSql.checkRows(2)
C
cpwu 已提交
417
        # tdSql.query(f"select tbname , unique(c1) from  {dbname}.stb1  where c1 = 0 partition by tbname order by tbname ")
418
        # tdSql.checkRows(3)
C
cpwu 已提交
419
        # tdSql.query(f"select tbname , unique(c1) from  {dbname}.stb1  where c1 = 0 partition by tbname ")
420 421
        # tdSql.checkRows(3)

C
cpwu 已提交
422
        tdSql.query(f"select unique(t1) from  {dbname}.stb1  ")
423
        tdSql.checkRows(2)
C
cpwu 已提交
424
        tdSql.query(f"select unique(t1+c1) from  {dbname}.stb1 ")
425
        tdSql.checkRows(13)
C
cpwu 已提交
426
        tdSql.query(f"select unique(t1+c1) from  {dbname}.stb1 partition by tbname ")
H
Haojun Liao 已提交
427
        tdSql.checkRows(20)
C
cpwu 已提交
428
        tdSql.query(f"select unique(t1) from  {dbname}.stb1 partition by tbname ")
429 430
        tdSql.checkRows(2)

G
Ganlin Zhao 已提交
431
        # nest query
H
Haojun Liao 已提交
432
        tdSql.query(f"select  unique(c1) v from (select _rowts , t1 ,c1 , tbname from  {dbname}.stb1 ) order by v")
433
        tdSql.checkRows(11)
H
Haojun Liao 已提交
434 435
        tdSql.checkData(1,0,0)
        tdSql.checkData(10,0,9)
H
Haojun Liao 已提交
436
        tdSql.query(f"select  unique(t1) v from (select _rowts , t1 , tbname from  {dbname}.stb1 ) order by v desc")
437 438 439
        tdSql.checkRows(2)
        tdSql.checkData(0,0,4)
        tdSql.checkData(1,0,1)
G
Ganlin Zhao 已提交
440

441 442 443 444
        # TD-19911
        tdSql.error("select  unique(mode(12)) from (select _rowts , t1 , tbname from  db.stb1 );")
        tdSql.error("select  unique(mode(t1,1)) from (select _rowts , t1 , tbname from  db.stb1 );")

C
cpwu 已提交
445
    def check_boundary_values(self, dbname="bound_test"):
W
wenzhouwww@live.cn 已提交
446

C
cpwu 已提交
447 448
        tdSql.execute(f"drop database if exists {dbname}")
        tdSql.execute(f"create database if not exists {dbname}")
W
wenzhouwww@live.cn 已提交
449
        tdSql.execute(
C
cpwu 已提交
450
            f"create table {dbname}.stb_bound (ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(32),c9 nchar(32), c10 timestamp) tags (t1 int);"
W
wenzhouwww@live.cn 已提交
451
        )
C
cpwu 已提交
452
        tdSql.execute(f'create table {dbname}.sub1_bound using {dbname}.stb_bound tags ( 1 )')
W
wenzhouwww@live.cn 已提交
453
        tdSql.execute(
W
update  
wenzhouwww@live.cn 已提交
454
                f"insert into {dbname}.sub1_bound values ( now()-10s, 2147483647, 9223372036854775807, 32767, 127, 3.40E+38, 1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
W
wenzhouwww@live.cn 已提交
455 456
            )
        tdSql.execute(
W
update  
wenzhouwww@live.cn 已提交
457
                f"insert into {dbname}.sub1_bound values ( now()-5s, 2147483646, 9223372036854775806, 32766, 126, 3.40E+38, 1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
W
wenzhouwww@live.cn 已提交
458 459 460
            )

        tdSql.execute(
W
update  
wenzhouwww@live.cn 已提交
461
                f"insert into {dbname}.sub1_bound values ( now()+5s, -2147483646, -9223372036854775806, -32766, -126, -3.40E+38, -1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
W
wenzhouwww@live.cn 已提交
462 463 464
            )

        tdSql.execute(
W
update  
wenzhouwww@live.cn 已提交
465
                f"insert into {dbname}.sub1_bound values ( now()+10s, 2147483643, 9223372036854775803, 32763, 123, 3.39E+38, 1.69e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
W
wenzhouwww@live.cn 已提交
466 467 468
            )

        tdSql.execute(
W
update  
wenzhouwww@live.cn 已提交
469
                f"insert into {dbname}.sub1_bound values ( now()+20s, -2147483643, -9223372036854775803, -32763, -123, -3.39E+38, -1.69e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
W
wenzhouwww@live.cn 已提交
470
            )
G
Ganlin Zhao 已提交
471

W
wenzhouwww@live.cn 已提交
472
        tdSql.error(
W
update  
wenzhouwww@live.cn 已提交
473
                f"insert into {dbname}.sub1_bound values ( now()+30s, 2147483648, 9223372036854775808, 32768, 128, 3.40E+38, 1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
W
wenzhouwww@live.cn 已提交
474
            )
G
Ganlin Zhao 已提交
475

C
cpwu 已提交
476
        tdSql.query(f"select unique(c2) from  {dbname}.sub1_bound order by 1 desc")
W
wenzhouwww@live.cn 已提交
477 478 479 480 481 482 483
        tdSql.checkRows(5)
        tdSql.checkData(0,0,9223372036854775807)

    def run(self):  # sourcery skip: extract-duplicate-method, remove-redundant-fstring
        tdSql.prepare()

        tdLog.printNoPrefix("==========step1:create table ==============")
G
Ganlin Zhao 已提交
484

W
wenzhouwww@live.cn 已提交
485 486
        self.prepare_datas()

G
Ganlin Zhao 已提交
487
        tdLog.printNoPrefix("==========step2:test errors ==============")
W
wenzhouwww@live.cn 已提交
488 489

        self.test_errors()
G
Ganlin Zhao 已提交
490 491

        tdLog.printNoPrefix("==========step3:support types ============")
W
wenzhouwww@live.cn 已提交
492 493 494

        self.support_types()

G
Ganlin Zhao 已提交
495
        tdLog.printNoPrefix("==========step4: floor basic query ============")
W
wenzhouwww@live.cn 已提交
496 497 498

        self.basic_unique_function()

G
Ganlin Zhao 已提交
499
        tdLog.printNoPrefix("==========step5: floor boundary query ============")
W
wenzhouwww@live.cn 已提交
500 501 502 503 504 505 506 507 508 509

        self.check_boundary_values()


    def stop(self):
        tdSql.close()
        tdLog.success(f"{__file__} successfully executed")

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