pow.py 30.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
import taos
import sys
import datetime
import inspect
import math
from util.log import *
from util.sql import *
from util.cases import *


class TDTestCase:
C
cpwu 已提交
12

13 14 15
    def init(self, conn, powSql):
        tdLog.debug(f"start to excute {__file__}")
        tdSql.init(conn.cursor())
C
cpwu 已提交
16 17

    def prepare_datas(self, dbname="db"):
18
        tdSql.execute(
C
cpwu 已提交
19
            f'''create table {dbname}.stb1
20 21 22 23
            (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)
            '''
        )
C
cpwu 已提交
24

25
        tdSql.execute(
C
cpwu 已提交
26 27
            f'''
            create table {dbname}.t1
28 29 30 31
            (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 已提交
32
            tdSql.execute(f'create table {dbname}.ct{i+1} using {dbname}.stb1 tags ( {i+1} )')
33 34 35

        for i in range(9):
            tdSql.execute(
C
cpwu 已提交
36
                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 )"
37 38
            )
            tdSql.execute(
C
cpwu 已提交
39
                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 )"
40
            )
C
cpwu 已提交
41 42 43 44
        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 )")
45

C
cpwu 已提交
46 47 48
        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  ) ")
49 50

        tdSql.execute(
C
cpwu 已提交
51
            f'''insert into {dbname}.t1 values
52 53 54 55 56 57 58 59 60 61 62 63 64 65
            ( '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 )
            '''
        )
C
cpwu 已提交
66

67 68 69 70 71 72
    def check_result_auto_pow2(self ,origin_query , pow_query):

        pow_result = tdSql.getResult(pow_query)
        origin_result = tdSql.getResult(origin_query)

        auto_result =[]
C
cpwu 已提交
73

74 75 76 77 78 79 80 81 82 83 84 85 86 87
        for row in origin_result:
            row_check = []
            for elem in row:
                if elem == None:
                    elem = None
                else:
                    elem = math.pow(elem,2)
                row_check.append(elem)
            auto_result.append(row_check)

        check_status = True

        for row_index , row in enumerate(pow_result):
            for col_index , elem in enumerate(row):
C
cpwu 已提交
88 89 90 91
                if auto_result[row_index][col_index]  is None  and  elem :
                    check_status = False
                elif auto_result[row_index][col_index] is not  None  and (auto_result[row_index][col_index] - elem > 0.001):
                    print(auto_result[row_index][col_index],",  elem: ", elem )
92 93 94 95 96 97 98 99 100 101 102 103 104 105
                    check_status = False
                else:
                    pass
        if not check_status:
            tdLog.notice("pow function value has not as expected , sql is \"%s\" "%pow_query )
            sys.exit(1)
        else:
            tdLog.info("pow value check pass , it work as expected ,sql is \"%s\"   "%pow_query )

    def check_result_auto_pow1(self ,origin_query , pow_query):
        pow_result = tdSql.getResult(pow_query)
        origin_result = tdSql.getResult(origin_query)

        auto_result =[]
C
cpwu 已提交
106

107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
        for row in origin_result:
            row_check = []
            for elem in row:
                if elem == None:
                    elem = None
                else :
                    elem = pow(elem ,1)
                row_check.append(elem)
            auto_result.append(row_check)

        check_status = True
        for row_index , row in enumerate(pow_result):
            for col_index , elem in enumerate(row):
                if auto_result[row_index][col_index] == None  and not (auto_result[row_index][col_index] == None and elem == None):
                    check_status = False
                elif auto_result[row_index][col_index] != None  and (auto_result[row_index][col_index] - elem > 0.00000001):
C
cpwu 已提交
123 124
                    print(auto_result[row_index][col_index],",  elem: ", elem )
                    check_status = False
125 126 127 128 129 130 131 132 133 134 135 136 137
                else:
                    pass
        if not check_status:
            tdLog.notice("pow function value has not as expected , sql is \"%s\" "%pow_query )
            sys.exit(1)
        else:
            tdLog.info("pow value check pass , it work as expected ,sql is \"%s\"   "%pow_query )

    def check_result_auto_pow__10(self ,origin_query , pow_query):
        pow_result = tdSql.getResult(pow_query)
        origin_result = tdSql.getResult(origin_query)

        auto_result =[]
C
cpwu 已提交
138

139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
        for row in origin_result:
            row_check = []
            for elem in row:
                if elem == None:
                    elem = None
                elif elem == 0:
                    elem = None
                else:
                    elem = pow(elem ,-10)
                row_check.append(elem)
            auto_result.append(row_check)

        check_status = True
        for row_index , row in enumerate(pow_result):
            for col_index , elem in enumerate(row):
                if auto_result[row_index][col_index] == None  and not (auto_result[row_index][col_index] == None and elem == None):
                    check_status = False
                elif auto_result[row_index][col_index] != None  and (auto_result[row_index][col_index] - elem > 0.00000001):
C
cpwu 已提交
157 158
                    print(auto_result[row_index][col_index],",  elem: ", elem )
                    check_status = False
159 160 161 162 163 164 165
                else:
                    pass
        if not check_status:
            tdLog.notice("pow function value has not as expected , sql is \"%s\" "%pow_query )
            sys.exit(1)
        else:
            tdLog.info("pow value check pass , it work as expected ,sql is \"%s\"   "%pow_query )
C
cpwu 已提交
166 167

    def test_errors(self, dbname="db"):
168
        error_sql_lists = [
C
cpwu 已提交
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
            f"select pow from {dbname}.t1",
            # f"select pow(-+--+c1 ,2) from {dbname}.t1",
            # f"select +-pow(c1,2) from {dbname}.t1",
            # f"select ++-pow(c1,2) from {dbname}.t1",
            # f"select ++--pow(c1,2) from {dbname}.t1",
            # f"select - -pow(c1,2)*0 from {dbname}.t1",
            # f"select pow(tbname+1,2) from {dbname}.t1 ",
            f"select pow(123--123,2)==1 from {dbname}.t1",
            f"select pow(c1,2) as 'd1' from {dbname}.t1",
            f"select pow(c1 ,c2 ,2) from {dbname}.t1",
            f"select pow(c1 ,NULL ,2) from {dbname}.t1",
            f"select pow(, 2) from {dbname}.t1;",
            f"select pow(pow(c1, 2) ab from {dbname}.t1)",
            f"select pow(c1 ,2 ) as int from {dbname}.t1",
            f"select pow from {dbname}.stb1",
            # f"select pow(-+--+c1) from {dbname}.stb1",
            # f"select +-pow(c1) from {dbname}.stb1",
            # f"select ++-pow(c1) from {dbname}.stb1",
            # f"select ++--pow(c1) from {dbname}.stb1",
            # f"select - -pow(c1)*0 from {dbname}.stb1",
            # f"select pow(tbname+1) from {dbname}.stb1 ",
            f"select pow(123--123 ,2)==1 from {dbname}.stb1",
            f"select pow(c1 ,2) as 'd1' from {dbname}.stb1",
            f"select pow(c1 ,c2 ,2 ) from {dbname}.stb1",
            f"select pow(c1 ,NULL,2) from {dbname}.stb1",
            f"select pow(,) from {dbname}.stb1;",
            f"select pow(pow(c1 , 2) ab from {dbname}.stb1)",
            f"select pow(c1 , 2) as int from {dbname}.stb1"
197 198 199
        ]
        for error_sql in error_sql_lists:
            tdSql.error(error_sql)
C
cpwu 已提交
200 201

    def support_types(self, dbname="db"):
202
        type_error_sql_lists = [
C
cpwu 已提交
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
            f"select pow(ts ,2 ) from {dbname}.t1" ,
            f"select pow(c7,c1 ) from {dbname}.t1",
            f"select pow(c8,c2) from {dbname}.t1",
            f"select pow(c9,c3 ) from {dbname}.t1",
            f"select pow(ts,c4 ) from {dbname}.ct1" ,
            f"select pow(c7,c5 ) from {dbname}.ct1",
            f"select pow(c8,c6 ) from {dbname}.ct1",
            f"select pow(c9,c8 ) from {dbname}.ct1",
            f"select pow(ts,2 ) from {dbname}.ct3" ,
            f"select pow(c7,2 ) from {dbname}.ct3",
            f"select pow(c8,2 ) from {dbname}.ct3",
            f"select pow(c9,2 ) from {dbname}.ct3",
            f"select pow(ts,2 ) from {dbname}.ct4" ,
            f"select pow(c7,2 ) from {dbname}.ct4",
            f"select pow(c8,2 ) from {dbname}.ct4",
            f"select pow(c9,2 ) from {dbname}.ct4",
            f"select pow(ts,2 ) from {dbname}.stb1" ,
            f"select pow(c7,2 ) from {dbname}.stb1",
            f"select pow(c8,2 ) from {dbname}.stb1",
            f"select pow(c9,2 ) from {dbname}.stb1" ,

            f"select pow(ts,2 ) from {dbname}.stbbb1" ,
            f"select pow(c7,2 ) from {dbname}.stbbb1",

            f"select pow(ts,2 ) from {dbname}.tbname",
            f"select pow(c9,2 ) from {dbname}.tbname"
229 230

        ]
C
cpwu 已提交
231

232 233
        for type_sql in type_error_sql_lists:
            tdSql.error(type_sql)
C
cpwu 已提交
234 235


236
        type_sql_lists = [
C
cpwu 已提交
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
            f"select pow(c1,2 ) from {dbname}.t1",
            f"select pow(c2,2 ) from {dbname}.t1",
            f"select pow(c3,2 ) from {dbname}.t1",
            f"select pow(c4,2 ) from {dbname}.t1",
            f"select pow(c5,2 ) from {dbname}.t1",
            f"select pow(c6,2 ) from {dbname}.t1",

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

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

            f"select pow(c1,2 ) from {dbname}.stb1",
            f"select pow(c2,2 ) from {dbname}.stb1",
            f"select pow(c3,2 ) from {dbname}.stb1",
            f"select pow(c4,2 ) from {dbname}.stb1",
            f"select pow(c5,2 ) from {dbname}.stb1",
            f"select pow(c6,2 ) from {dbname}.stb1",

            f"select pow(c6,2) as alisb from {dbname}.stb1",
            f"select pow(c6,2) alisb from {dbname}.stb1",
267 268 269 270 271
        ]

        for type_sql in type_sql_lists:
            tdSql.query(type_sql)

C
cpwu 已提交
272 273 274 275
    def basic_pow_function(self, dbname="db"):

        # basic query
        tdSql.query(f"select c1 from {dbname}.ct3")
276
        tdSql.checkRows(0)
C
cpwu 已提交
277
        tdSql.query(f"select c1 from {dbname}.t1")
278
        tdSql.checkRows(12)
C
cpwu 已提交
279
        tdSql.query(f"select c1 from {dbname}.stb1")
280 281 282
        tdSql.checkRows(25)

        # used for empty table  , ct3 is empty
C
cpwu 已提交
283
        tdSql.query(f"select pow(c1 ,2) from {dbname}.ct3")
284
        tdSql.checkRows(0)
C
cpwu 已提交
285
        tdSql.query(f"select pow(c2 ,2) from {dbname}.ct3")
286
        tdSql.checkRows(0)
C
cpwu 已提交
287
        tdSql.query(f"select pow(c3 ,2) from {dbname}.ct3")
288
        tdSql.checkRows(0)
C
cpwu 已提交
289
        tdSql.query(f"select pow(c4 ,2) from {dbname}.ct3")
290
        tdSql.checkRows(0)
C
cpwu 已提交
291
        tdSql.query(f"select pow(c5 ,2) from {dbname}.ct3")
292
        tdSql.checkRows(0)
C
cpwu 已提交
293
        tdSql.query(f"select pow(c6 ,2) from {dbname}.ct3")
294 295 296 297
        tdSql.checkRows(0)


        # # used for regular table
C
cpwu 已提交
298
        tdSql.query(f"select pow(c1 ,2) from {dbname}.t1")
299 300 301 302 303
        tdSql.checkData(0, 0, None)
        tdSql.checkData(1 , 0, 1.000000000)
        tdSql.checkData(3 , 0, 9.000000000)
        tdSql.checkData(5 , 0, None)

C
cpwu 已提交
304
        tdSql.query(f"select c1, c2, c3 , c4, c5 from {dbname}.t1")
305 306 307 308
        tdSql.checkData(1, 4, 1.11000)
        tdSql.checkData(3, 3, 33)
        tdSql.checkData(5, 4, None)

C
cpwu 已提交
309
        tdSql.query(f"select ts,c1, c2, c3 , c4, c5 from {dbname}.t1")
310 311 312 313
        tdSql.checkData(1, 5, 1.11000)
        tdSql.checkData(3, 4, 33)
        tdSql.checkData(5, 5, None)

C
cpwu 已提交
314 315 316 317
        self.check_result_auto_pow2( f"select c1, c2, c3 , c4, c5 from {dbname}.t1", f"select pow(c1 ,2), pow(c2 ,2) ,pow(c3, 2), pow(c4 ,2), pow(c5 ,2) from {dbname}.t1")
        self.check_result_auto_pow1( f"select c1, c2, c3 , c4, c5 from {dbname}.t1", f"select pow(c1 ,1), pow(c2 ,1) ,pow(c3, 1), pow(c4 ,1), pow(c5 ,1) from {dbname}.t1")
        self.check_result_auto_pow__10( f"select c1, c2, c3 , c4, c5 from {dbname}.t1", f"select pow(c1 ,-10), pow(c2 ,-10) ,pow(c3, -10), pow(c4 ,-10), pow(c5 ,-10) from {dbname}.t1")

318
        # used for sub table
C
cpwu 已提交
319
        tdSql.query(f"select c1 ,pow(c1 ,2) from {dbname}.ct1")
320 321 322 323 324 325 326
        tdSql.checkData(0, 1, 64.000000000)
        tdSql.checkData(1 , 1, 49.000000000)
        tdSql.checkData(3 , 1, 25.000000000)
        tdSql.checkData(4 , 1, 0)

        # # test bug fix for pow(c1,c2)

C
cpwu 已提交
327
        tdSql.query(f"select c1, c5 ,pow(c1,c5) from {dbname}.ct4")
328 329 330 331 332 333 334
        tdSql.checkData(0 , 2, None)
        tdSql.checkData(1 , 2, 104577724.506799981)
        tdSql.checkData(2 , 2, 3684781.623933245)
        tdSql.checkData(3 , 2, 152225.429759376)
        tdSql.checkData(4 , 2, 7573.273783071)


C
cpwu 已提交
335 336
        self.check_result_auto_pow2( f"select c1, c2, c3 , c4, c5 from {dbname}.ct1", f"select pow(c1,2), pow(c2,2) ,pow(c3,2), pow(c4,2), pow(c5,2) from {dbname}.ct1")
        self.check_result_auto_pow__10( f"select c1, c2, c3 , c4, c5 from {dbname}.ct1", f"select pow(c1,-10), pow(c2,-10) ,pow(c3,-10), pow(c4,-10), pow(c5,-10) from {dbname}.ct1")
337 338

        # nest query for pow functions
C
cpwu 已提交
339
        tdSql.query(f"select c1  , pow(c1,2) ,pow(pow(c1,2),2) , pow(pow(pow(c1,2),2),2) from {dbname}.ct1;")
340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
        tdSql.checkData(0 , 0 , 8)
        tdSql.checkData(0 , 1 , 64.000000000)
        tdSql.checkData(0 , 2 , 4096.000000000)
        tdSql.checkData(0 , 3 , 16777216.000000000)

        tdSql.checkData(1 , 0 , 7)
        tdSql.checkData(1 , 1 , 49.000000000)
        tdSql.checkData(1 , 2 , 2401.000000000)
        tdSql.checkData(1 , 3 , 5764801.000000000)

        tdSql.checkData(4 , 0 , 0)
        tdSql.checkData(4 , 1 , 0.000000000)
        tdSql.checkData(4 , 2 , 0.000000000)
        tdSql.checkData(4 , 3 , 0.000000000)

C
cpwu 已提交
355 356 357
        # # used for stable table

        tdSql.query(f"select pow(c1, 2) from {dbname}.stb1")
358
        tdSql.checkRows(25)
C
cpwu 已提交
359

360 361

        # used for not exists table
C
cpwu 已提交
362 363 364
        tdSql.error(f"select pow(c1, 2) from {dbname}.stbbb1")
        tdSql.error(f"select pow(c1, 2) from {dbname}.tbname")
        tdSql.error(f"select pow(c1, 2) from {dbname}.ct5")
365

C
cpwu 已提交
366 367
        # mix with common col
        tdSql.query(f"select c1, pow(c1 ,2) from {dbname}.ct1")
368 369 370 371
        tdSql.checkData(0 , 0 ,8)
        tdSql.checkData(0 , 1 ,64.000000000)
        tdSql.checkData(4 , 0 ,0)
        tdSql.checkData(4 , 1 ,0.000000000)
C
cpwu 已提交
372
        tdSql.query(f"select c1, pow(c1,2) from {dbname}.ct4")
373 374 375 376 377 378 379 380
        tdSql.checkData(0 , 0 , None)
        tdSql.checkData(0 , 1 ,None)
        tdSql.checkData(4 , 0 ,5)
        tdSql.checkData(4 , 1 ,25.000000000)
        tdSql.checkData(5 , 0 ,None)
        tdSql.checkData(5 , 1 ,None)

        # mix with common functions
C
cpwu 已提交
381
        tdSql.query(f"select c1, pow(c1 ,2),pow(c1,2), log(pow(c1,2) ,2) from {dbname}.ct4 ")
382 383 384 385
        tdSql.checkData(0 , 0 ,None)
        tdSql.checkData(0 , 1 ,None)
        tdSql.checkData(0 , 2 ,None)
        tdSql.checkData(0 , 3 ,None)
C
cpwu 已提交
386

387 388 389 390 391
        tdSql.checkData(3 , 0 , 6)
        tdSql.checkData(3 , 1 ,36.000000000)
        tdSql.checkData(3 , 2 ,36.000000000)
        tdSql.checkData(3 , 3 ,5.169925001)

C
cpwu 已提交
392
        tdSql.query(f"select c1, pow(c1,1),c5, floor(c5 ) from {dbname}.stb1 ")
393 394

        # # mix with agg functions , not support
C
cpwu 已提交
395 396 397 398 399 400
        tdSql.error(f"select c1, pow(c1 ,2),c5, count(c5) from {dbname}.stb1 ")
        tdSql.error(f"select c1, pow(c1 ,2),c5, count(c5) from {dbname}.ct1 ")
        tdSql.error(f"select pow(c1 ,2), count(c5) from {dbname}.stb1 ")
        tdSql.error(f"select pow(c1 ,2), count(c5) from {dbname}.ct1 ")
        tdSql.error(f"select c1, count(c5) from {dbname}.ct1 ")
        tdSql.error(f"select c1, count(c5) from {dbname}.stb1 ")
401 402 403

        # agg functions mix with agg functions

C
cpwu 已提交
404 405 406
        tdSql.query(f"select max(c5), count(c5) from {dbname}.stb1")
        tdSql.query(f"select max(c5), count(c5) from {dbname}.ct1")

407 408

        # bug fix for count
C
cpwu 已提交
409
        tdSql.query(f"select count(c1) from {dbname}.ct4 ")
410
        tdSql.checkData(0,0,9)
C
cpwu 已提交
411
        tdSql.query(f"select count(*) from {dbname}.ct4 ")
412
        tdSql.checkData(0,0,12)
C
cpwu 已提交
413
        tdSql.query(f"select count(c1) from {dbname}.stb1 ")
414
        tdSql.checkData(0,0,22)
C
cpwu 已提交
415
        tdSql.query(f"select count(*) from {dbname}.stb1 ")
416 417
        tdSql.checkData(0,0,25)

C
cpwu 已提交
418 419
        # # bug fix for compute
        tdSql.query(f"select c1, pow(c1 ,2) -0 ,pow(c1-4 ,2)-0 from {dbname}.ct4 ")
420 421 422 423 424 425 426
        tdSql.checkData(0, 0, None)
        tdSql.checkData(0, 1, None)
        tdSql.checkData(0, 2, None)
        tdSql.checkData(1, 0, 8)
        tdSql.checkData(1, 1, 64.000000000)
        tdSql.checkData(1, 2, 16.000000000)

C
cpwu 已提交
427
        tdSql.query(f"select c1, pow(c1 ,2) -0 ,pow(c1-0.1 ,2)-0.1 from {dbname}.ct4")
428 429 430 431 432 433 434
        tdSql.checkData(0, 0, None)
        tdSql.checkData(0, 1, None)
        tdSql.checkData(0, 2, None)
        tdSql.checkData(1, 0, 8)
        tdSql.checkData(1, 1, 64.000000000)
        tdSql.checkData(1, 2, 62.310000000)

C
cpwu 已提交
435
        tdSql.query(f"select c1, pow(c1, -10), c2, pow(c2, -10), c3, pow(c3, -10) from {dbname}.ct1")
436

C
cpwu 已提交
437
    def test_big_number(self, dbname="db"):
438

C
cpwu 已提交
439
        tdSql.query(f"select c1, pow(c1, 100000000) from {dbname}.ct1")  # bigint to double data overflow
440 441 442 443 444
        tdSql.checkData(0, 1, None)
        tdSql.checkData(1, 1, None)
        tdSql.checkData(4, 1, 0.000000000)


C
cpwu 已提交
445
        tdSql.query(f"select c1, pow(c1, 10000000000000) from {dbname}.ct1")  # bigint to double data overflow
446 447 448 449
        tdSql.checkData(0, 1, None)
        tdSql.checkData(1, 1, None)
        tdSql.checkData(4, 1, 0.000000000)

C
cpwu 已提交
450 451
        tdSql.query(f"select c1, pow(c1, 10000000000000000000000000) from {dbname}.ct1")  # bigint to double data overflow
        tdSql.query(f"select c1, pow(c1, 10000000000000000000000000.0) from {dbname}.ct1") # 10000000000000000000000000.0 is a double value
452 453 454 455
        tdSql.checkData(0, 1, None)
        tdSql.checkData(1, 1, None)
        tdSql.checkData(4, 1, 0.000000000)

C
cpwu 已提交
456 457
        tdSql.query(f"select c1, pow(c1, 10000000000000000000000000000000000) from {dbname}.ct1")  # bigint to double data overflow
        tdSql.query(f"select c1, pow(c1, 10000000000000000000000000000000000.0) from {dbname}.ct1") # 10000000000000000000000000.0 is a double value
458 459 460 461
        tdSql.checkData(0, 1, None)
        tdSql.checkData(1, 1, None)
        tdSql.checkData(4, 1, 0.000000000)

C
cpwu 已提交
462 463
        tdSql.query(f"select c1, pow(c1, 10000000000000000000000000000000000000000) from {dbname}.ct1")  # bigint to double data overflow
        tdSql.query(f"select c1, pow(c1, 10000000000000000000000000000000000000000.0) from {dbname}.ct1") # 10000000000000000000000000.0 is a double value
464 465 466 467
        tdSql.checkData(0, 1, None)
        tdSql.checkData(1, 1, None)
        tdSql.checkData(4, 1, 0.000000000)

C
cpwu 已提交
468
        tdSql.query(f"select c1, pow(c1, 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) from {dbname}.ct1")  # bigint to double data overflow
469

C
cpwu 已提交
470
    def pow_base_test(self, dbname="db"):
471 472

        # base is an regular number ,int or double
C
cpwu 已提交
473
        tdSql.query(f"select c1, pow(c1, 2) from {dbname}.ct1")
474
        tdSql.checkData(0, 1,64.000000000)
C
cpwu 已提交
475
        tdSql.query(f"select c1, pow(c1, 2.0) from {dbname}.ct1")
476 477
        tdSql.checkData(0, 1, 64.000000000)

C
cpwu 已提交
478
        tdSql.query(f"select c1, pow(1, 2.0) from {dbname}.ct1")
479 480 481 482 483
        tdSql.checkData(0, 1, 1.000000000)
        tdSql.checkRows(13)


        # # bug for compute in functions
C
cpwu 已提交
484
        # tdSql.query(f"select c1, abs(1/0) from {dbname}.ct1")
485 486 487
        # tdSql.checkData(0, 0, 8)
        # tdSql.checkData(0, 1, 1)

C
cpwu 已提交
488
        tdSql.query(f"select c1, pow(1, 2.0) from {dbname}.ct1")
489 490 491 492
        tdSql.checkData(0, 1, 1.000000000)
        tdSql.checkRows(13)

        # two cols start pow(x,y)
C
cpwu 已提交
493
        tdSql.query(f"select c1,c2, pow(c1,c2) from {dbname}.ct1")
494 495 496 497
        tdSql.checkData(0, 2, None)
        tdSql.checkData(1, 2, None)
        tdSql.checkData(4, 2, 1.000000000)

C
cpwu 已提交
498
        tdSql.query(f"select c1,c2, pow(c2,c1) from {dbname}.ct1")
499 500 501 502
        tdSql.checkData(0, 2, 3897131646727578700481513520437089271808.000000000)
        tdSql.checkData(1, 2, 17217033054561120738612297152331776.000000000)
        tdSql.checkData(4, 2, 1.000000000)

C
cpwu 已提交
503
        tdSql.query(f"select c1, pow(2.0 , c1) from {dbname}.ct1")
504 505 506 507
        tdSql.checkData(0, 1, 256.000000000)
        tdSql.checkData(1, 1, 128.000000000)
        tdSql.checkData(4, 1, 1.000000000)

C
cpwu 已提交
508
        tdSql.query(f"select c1, pow(2.0 , c1) from {dbname}.ct1")
509 510 511 512
        tdSql.checkData(0, 1, 256.000000000)
        tdSql.checkData(1, 1, 128.000000000)
        tdSql.checkData(4, 1, 1.000000000)

C
cpwu 已提交
513 514
    def abs_func_filter(self, dbname="db"):
        tdSql.query(f"select c1, abs(c1) -0 ,ceil(c1-0.1)-0 ,floor(c1+0.1)-0.1 ,ceil(pow(c1,2)-0.5) from {dbname}.ct4 where c1>5 ")
515 516 517 518 519 520 521
        tdSql.checkRows(3)
        tdSql.checkData(0,0,8)
        tdSql.checkData(0,1,8.000000000)
        tdSql.checkData(0,2,8.000000000)
        tdSql.checkData(0,3,7.900000000)
        tdSql.checkData(0,4,64.000000000)

C
cpwu 已提交
522
        tdSql.query(f"select c1, abs(c1) -0 ,ceil(c1-0.1)-0 ,floor(c1+0.1)-0.1 ,ceil(pow(c1,2)-0.5) from {dbname}.ct4 where c1=5 ")
523 524 525 526 527 528 529
        tdSql.checkRows(1)
        tdSql.checkData(0,0,5)
        tdSql.checkData(0,1,5.000000000)
        tdSql.checkData(0,2,5.000000000)
        tdSql.checkData(0,3,4.900000000)
        tdSql.checkData(0,4,25.000000000)

C
cpwu 已提交
530
        tdSql.query(f"select c1, abs(c1) -0 ,ceil(c1-0.1)-0 ,floor(c1+0.1)-0.1 ,ceil(pow(c1,2)-0.5) from {dbname}.ct4 where c1=5 ")
531 532 533 534 535 536 537
        tdSql.checkRows(1)
        tdSql.checkData(0,0,5)
        tdSql.checkData(0,1,5.000000000)
        tdSql.checkData(0,2,5.000000000)
        tdSql.checkData(0,3,4.900000000)
        tdSql.checkData(0,4,25.000000000)

C
cpwu 已提交
538
        tdSql.query(f"select c1,c2 , abs(c1) -0 ,ceil(c1-0.1)-0 ,floor(c1+0.1)-0.1 ,ceil(pow(c1,2)-0.5) from {dbname}.ct4 where c1<pow(c1,2) limit 1 ")
539 540 541 542 543 544 545
        tdSql.checkRows(1)
        tdSql.checkData(0,0,8)
        tdSql.checkData(0,1,88888)
        tdSql.checkData(0,2,8.000000000)
        tdSql.checkData(0,3,8.000000000)
        tdSql.checkData(0,4,7.900000000)
        tdSql.checkData(0,5,64.000000000)
C
cpwu 已提交
546 547 548 549 550

    def check_boundary_values(self, dbname="bound_test"):

        tdSql.execute(f"drop database if exists {dbname}")
        tdSql.execute(f"create database if not exists {dbname}")
551 552
        time.sleep(3)
        tdSql.execute(
C
cpwu 已提交
553
            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);"
554
        )
C
cpwu 已提交
555
        tdSql.execute(f'create table {dbname}.sub1_bound using {dbname}.stb_bound tags ( 1 )')
556
        tdSql.execute(
C
cpwu 已提交
557
                f"insert into {dbname}.sub1_bound values ( now()-1s, 2147483647, 9223372036854775807, 32767, 127, 3.40E+38, 1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
558 559
            )
        tdSql.execute(
C
cpwu 已提交
560
                f"insert into {dbname}.sub1_bound values ( now()-1s, -2147483647, -9223372036854775807, -32767, -127, -3.40E+38, -1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
561 562
            )
        tdSql.execute(
C
cpwu 已提交
563
                f"insert into {dbname}.sub1_bound values ( now(), 2147483646, 9223372036854775806, 32766, 126, 3.40E+38, 1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
564 565
            )
        tdSql.execute(
C
cpwu 已提交
566
                f"insert into {dbname}.sub1_bound values ( now(), -2147483646, -9223372036854775806, -32766, -126, -3.40E+38, -1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
567 568
            )
        tdSql.error(
C
cpwu 已提交
569
                f"insert into {dbname}.sub1_bound values ( now()+1s, 2147483648, 9223372036854775808, 32768, 128, 3.40E+38, 1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
570
            )
C
cpwu 已提交
571 572 573 574 575
        self.check_result_auto_pow2( f"select c1, c2, c3 , c4, c5 from {dbname}.sub1_bound ", f"select pow(c1,2), pow(c2,2) ,pow(c3,2), pow(c4,2), pow(c5,2) from {dbname}.sub1_bound")
        self.check_result_auto_pow__10( f"select c1, c2, c3 , c4, c5  from {dbname}.sub1_bound ", f"select pow(c1,-10), pow(c2,-10) ,pow(c3,-10), pow(c4,-10), pow(c5,-10) from {dbname}.sub1_bound")

        self.check_result_auto_pow2( f"select c1, c2, c3 , c3, c2 ,c1 from {dbname}.sub1_bound ", f"select pow(c1,2), pow(c2,2) ,pow(c3,2), pow(c3,2), pow(c2,2) ,pow(c1,2) from {dbname}.sub1_bound")

576

C
cpwu 已提交
577
        self.check_result_auto_pow2(f"select abs(abs(abs(abs(abs(abs(abs(abs(abs(c1)))))))))  nest_col_func from {dbname}.sub1_bound" , f"select pow(abs(c1) ,2) from {dbname}.sub1_bound" )
578 579

        # check basic elem for table per row
C
cpwu 已提交
580
        tdSql.query(f"select pow(abs(c1),2) ,pow(abs(c2),2) , pow(abs(c3),2) , pow(abs(c4),2), pow(abs(c5),2), pow(abs(c6),2) from {dbname}.sub1_bound ")
581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
        tdSql.checkData(0,0,math.pow(2147483647,2))
        tdSql.checkData(0,1,math.pow(9223372036854775807 ,2))
        tdSql.checkData(0,2,math.pow(32767,2))
        tdSql.checkData(0,3,math.pow(127 ,2))
        tdSql.checkData(0,4,math.pow(339999995214436424907732413799364296704.00000,2))
        tdSql.checkData(1,0,math.pow(2147483647 ,2))
        tdSql.checkData(1,1,math.pow(9223372036854775807 ,2))
        tdSql.checkData(1,2,math.pow(32767 ,2))
        tdSql.checkData(1,3,math.pow(127,2))
        tdSql.checkData(1,4,math.pow(339999995214436424907732413799364296704.00000 ,2))
        tdSql.checkData(3,0,math.pow(2147483646,2))
        tdSql.checkData(3,1,math.pow(9223372036854775806,2))
        tdSql.checkData(3,2,math.pow(32766,2))
        tdSql.checkData(3,3,math.pow(126 ,2))
        tdSql.checkData(3,4,math.pow(339999995214436424907732413799364296704.00000,2))
C
cpwu 已提交
596

597
        # check  + - * / in functions
C
cpwu 已提交
598
        tdSql.query(f"select pow(abs(c1+1) ,2) ,pow(abs(c2),2) , pow(abs(c3*1),2) , pow(abs(c4/2),2), pow(abs(c5) ,2)/2, pow(abs(c6) ,2) from {dbname}.sub1_bound ")
599 600 601 602 603
        tdSql.checkData(0,0,math.pow(2147483648.000000000,2))
        tdSql.checkData(0,1,math.pow(9223372036854775807,2))
        tdSql.checkData(0,2,math.pow(32767.000000000,2))
        tdSql.checkData(0,3,math.pow(63.500000000,2))
        tdSql.checkData(0,5,None)
604 605


C
cpwu 已提交
606 607 608 609 610
    def support_super_table_test(self, dbname="db"):
        self.check_result_auto_pow2( f"select c5 from {dbname}.stb1 order by ts " , f"select pow(c5,2) from {dbname}.stb1 order by ts" )
        self.check_result_auto_pow2( f"select c5 from {dbname}.stb1 order by tbname " , f"select pow(c5,2) from {dbname}.stb1 order by tbname" )
        self.check_result_auto_pow2( f"select c5 from {dbname}.stb1 where c1 > 0 order by tbname  " , f"select pow(c5,2) from {dbname}.stb1 where c1 > 0 order by tbname" )
        self.check_result_auto_pow2( f"select c5 from {dbname}.stb1 where c1 > 0 order by tbname  " , f"select pow(c5,2) from {dbname}.stb1 where c1 > 0 order by tbname" )
611

C
cpwu 已提交
612 613 614 615
        self.check_result_auto_pow2( f"select t1,c5 from {dbname}.stb1 order by ts " , f"select pow(t1,2), pow(c5,2) from {dbname}.stb1 order by ts" )
        self.check_result_auto_pow2( f"select t1,c5 from {dbname}.stb1 order by tbname " , f"select pow(t1,2) ,pow(c5,2) from {dbname}.stb1 order by tbname" )
        self.check_result_auto_pow2( f"select t1,c5 from {dbname}.stb1 where c1 > 0 order by tbname  " , f"select pow(t1,2) ,pow(c5,2) from {dbname}.stb1 where c1 > 0 order by tbname" )
        self.check_result_auto_pow2( f"select t1,c5 from {dbname}.stb1 where c1 > 0 order by tbname  " , f"select pow(t1,2) , pow(c5,2) from {dbname}.stb1 where c1 > 0 order by tbname" )
616

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

        tdLog.printNoPrefix("==========step1:create table ==============")
C
cpwu 已提交
621

622 623
        self.prepare_datas()

C
cpwu 已提交
624
        tdLog.printNoPrefix("==========step2:test errors ==============")
625 626

        self.test_errors()
C
cpwu 已提交
627 628

        tdLog.printNoPrefix("==========step3:support types ============")
629 630 631

        self.support_types()

C
cpwu 已提交
632
        tdLog.printNoPrefix("==========step4: pow basic query ============")
633 634 635

        self.basic_pow_function()

C
cpwu 已提交
636
        tdLog.printNoPrefix("==========step5: big number pow query ============")
637 638 639

        self.test_big_number()

C
cpwu 已提交
640
        tdLog.printNoPrefix("==========step6: base  number for pow query ============")
641 642 643

        self.pow_base_test()

C
cpwu 已提交
644
        tdLog.printNoPrefix("==========step7: pow boundary query ============")
645 646 647

        self.check_boundary_values()

C
cpwu 已提交
648
        tdLog.printNoPrefix("==========step8: pow filter query ============")
649 650 651

        self.abs_func_filter()

652 653
        tdLog.printNoPrefix("==========step9: check pow result of  stable query ============")

C
cpwu 已提交
654
        self.support_super_table_test()
655 656 657 658 659 660 661

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

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