function_stateduration.py 21.1 KB
Newer Older
W
wenzhouwww@live.cn 已提交
1 2 3 4
from util.log import *
from util.sql import *
from util.cases import *

C
cpwu 已提交
5
DBNAME = "db"
W
wenzhouwww@live.cn 已提交
6 7 8 9 10
class TDTestCase:

    def init(self, conn, logSql):
        tdLog.debug(f"start to excute {__file__}")
        tdSql.init(conn.cursor())
G
Ganlin Zhao 已提交
11

C
cpwu 已提交
12
    def prepare_datas(self, dbname=DBNAME):
W
wenzhouwww@live.cn 已提交
13
        tdSql.execute(
C
cpwu 已提交
14
            f'''create table {dbname}.stb1
W
wenzhouwww@live.cn 已提交
15 16 17 18
            (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 已提交
19

W
wenzhouwww@live.cn 已提交
20
        tdSql.execute(
C
cpwu 已提交
21 22
            f'''
            create table {dbname}.t1
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)
            '''
        )
        for i in range(4):
C
cpwu 已提交
27
            tdSql.execute(f'create table {dbname}.ct{i+1} using {dbname}.stb1 tags ( {i+1} )')
W
wenzhouwww@live.cn 已提交
28 29 30

        for i in range(9):
            tdSql.execute(
C
cpwu 已提交
31
                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 已提交
32 33
            )
            tdSql.execute(
C
cpwu 已提交
34
                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 已提交
35
            )
C
cpwu 已提交
36 37 38 39
        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 已提交
40

C
cpwu 已提交
41 42 43
        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 已提交
44 45

        tdSql.execute(
C
cpwu 已提交
46
            f'''insert into {dbname}.t1 values
W
wenzhouwww@live.cn 已提交
47 48 49 50 51 52 53 54 55 56 57 58 59 60
            ( '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 已提交
61

C
cpwu 已提交
62
    def test_errors(self, dbname=DBNAME):
W
wenzhouwww@live.cn 已提交
63
        error_sql_lists = [
C
cpwu 已提交
64 65 66 67 68 69 70 71 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
            # f"select stateduration(c1,'GT',5,1s) from {dbname}.t1"
            f"select stateduration from {dbname}.t1",
            f"select stateduration(123--123)==1 from {dbname}.t1",
            f"select stateduration(123,123) from {dbname}.t1",
            f"select stateduration(c1,ts) from {dbname}.t1",
            f"select stateduration(c1,c1,ts) from {dbname}.t1",
            f"select stateduration(c1 ,c2 ) from {dbname}.t1",
            f"select stateduration(c1 ,NULL) from {dbname}.t1",
            #f"select stateduration(c1 ,'NULL',1.0,1s) from {dbname}.t1",
            f"select stateduration(c1 ,'GT','1',1s) from {dbname}.t1",
            f"select stateduration(c1 ,'GT','tbname',1s) from {dbname}.t1",
            f"select stateduration(c1 ,'GT','*',1s) from {dbname}.t1",
            f"select stateduration(c1 ,'GT',ts,1s) from {dbname}.t1",
            f"select stateduration(c1 ,'GT',max(c1),1s) from {dbname}.t1",
            # f"select stateduration(abs(c1) ,'GT',1,1s) from {dbname}.t1",
            # f"select stateduration(c1+2 ,'GT',1,1s) from {dbname}.t1",
            f"select stateduration(c1 ,'GT',1,1u) from {dbname}.t1",
            f"select stateduration(c1 ,'GT',1,now) from {dbname}.t1",
            f"select stateduration(c1 ,'GT','1',1s) from {dbname}.t1",
            f"select stateduration(c1 ,'GT','1',True) from {dbname}.t1",
            f"select stateduration(stateduration(c1) ab from {dbname}.t1)",
            f"select stateduration(c1 ,'GT',1,,)int from {dbname}.t1",
            f"select stateduration('c1','GT',1) from {dbname}.t1",
            f"select stateduration('c1','GT', 1 , NULL) from {dbname}.t1",
            f"select stateduration('c1','GT', 1 , '') from {dbname}.t1",
            f"select stateduration('c1','GT', 1 ,c%) from {dbname}.t1",
            f"select stateduration(c1 ,'GT',1,t1) from {dbname}.t1",
            f"select stateduration(c1 ,'GT',1,True) from {dbname}.t1",
            f"select stateduration(c1 ,'GT',1,1s) , count(c1) from {dbname}.t1",
            f"select stateduration(c1 ,'GT',1,1s) , avg(c1) from {dbname}.t1",
            f"select stateduration(c1 ,'GT',1,1s) , min(c1) from {dbname}.t1",
            f"select stateduration(c1 ,'GT',1,1s) , spread(c1) from {dbname}.t1",
            f"select stateduration(c1 ,'GT',1,1s) , diff(c1) from {dbname}.t1",
W
wenzhouwww@live.cn 已提交
97 98 99 100
        ]
        for error_sql in error_sql_lists:
            tdSql.error(error_sql)
            pass
G
Ganlin Zhao 已提交
101

C
cpwu 已提交
102
    def support_types(self, dbname=DBNAME):
W
wenzhouwww@live.cn 已提交
103
        other_no_value_types = [
C
cpwu 已提交
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
            f"select stateduration(ts,'GT',1,1s) from {dbname}.t1" ,
            f"select stateduration(c7,'GT',1,1s) from {dbname}.t1",
            f"select stateduration(c8,'GT',1,1s) from {dbname}.t1",
            f"select stateduration(c9,'GT',1,1s) from {dbname}.t1",
            f"select stateduration(ts,'GT',1,1s) from {dbname}.ct1" ,
            f"select stateduration(c7,'GT',1,1s) from {dbname}.ct1",
            f"select stateduration(c8,'GT',1,1s) from {dbname}.ct1",
            f"select stateduration(c9,'GT',1,1s) from {dbname}.ct1",
            f"select stateduration(ts,'GT',1,1s) from {dbname}.ct3" ,
            f"select stateduration(c7,'GT',1,1s) from {dbname}.ct3",
            f"select stateduration(c8,'GT',1,1s) from {dbname}.ct3",
            f"select stateduration(c9,'GT',1,1s) from {dbname}.ct3",
            f"select stateduration(ts,'GT',1,1s) from {dbname}.ct4" ,
            f"select stateduration(c7,'GT',1,1s) from {dbname}.ct4",
            f"select stateduration(c8,'GT',1,1s) from {dbname}.ct4",
            f"select stateduration(c9,'GT',1,1s) from {dbname}.ct4",
            f"select stateduration(ts,'GT',1,1s) from {dbname}.stb1 partition by tbname" ,
            f"select stateduration(c7,'GT',1,1s) from {dbname}.stb1 partition by tbname",
            f"select stateduration(c8,'GT',1,1s) from {dbname}.stb1 partition by tbname",
            f"select stateduration(c9,'GT',1,1s) from {dbname}.stb1 partition by tbname"
W
wenzhouwww@live.cn 已提交
124
        ]
G
Ganlin Zhao 已提交
125

W
wenzhouwww@live.cn 已提交
126 127 128
        for type_sql in other_no_value_types:
            tdSql.error(type_sql)
            tdLog.info("support type ok ,  sql is : %s"%type_sql)
G
Ganlin Zhao 已提交
129

W
wenzhouwww@live.cn 已提交
130
        type_sql_lists = [
C
cpwu 已提交
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
            f"select stateduration(c1,'GT',1,1s) from {dbname}.t1",
            f"select stateduration(c2,'GT',1,1s) from {dbname}.t1",
            f"select stateduration(c3,'GT',1,1s) from {dbname}.t1",
            f"select stateduration(c4,'GT',1,1s) from {dbname}.t1",
            f"select stateduration(c5,'GT',1,1s) from {dbname}.t1",
            f"select stateduration(c6,'GT',1,1s) from {dbname}.t1",

            f"select stateduration(c1,'GT',1,1s) from {dbname}.ct1",
            f"select stateduration(c2,'GT',1,1s) from {dbname}.ct1",
            f"select stateduration(c3,'GT',1,1s) from {dbname}.ct1",
            f"select stateduration(c4,'GT',1,1s) from {dbname}.ct1",
            f"select stateduration(c5,'GT',1,1s) from {dbname}.ct1",
            f"select stateduration(c6,'GT',1,1s) from {dbname}.ct1",

            f"select stateduration(c1,'GT',1,1s) from {dbname}.ct3",
            f"select stateduration(c2,'GT',1,1s) from {dbname}.ct3",
            f"select stateduration(c3,'GT',1,1s) from {dbname}.ct3",
            f"select stateduration(c4,'GT',1,1s) from {dbname}.ct3",
            f"select stateduration(c5,'GT',1,1s) from {dbname}.ct3",
            f"select stateduration(c6,'GT',1,1s) from {dbname}.ct3",

            f"select stateduration(c1,'GT',1,1s) from {dbname}.stb1 partition by tbname",
            f"select stateduration(c2,'GT',1,1s) from {dbname}.stb1 partition by tbname",
            f"select stateduration(c3,'GT',1,1s) from {dbname}.stb1 partition by tbname",
            f"select stateduration(c4,'GT',1,1s) from {dbname}.stb1 partition by tbname",
            f"select stateduration(c5,'GT',1,1s) from {dbname}.stb1 partition by tbname",
            f"select stateduration(c6,'GT',1,1s) from {dbname}.stb1 partition by tbname",

            f"select stateduration(c6,'GT',1,1s) as alisb from {dbname}.stb1 partition by tbname",
            f"select stateduration(c6,'GT',1,1s) alisb from {dbname}.stb1 partition by tbname",
W
wenzhouwww@live.cn 已提交
161 162 163 164 165
        ]

        for type_sql in type_sql_lists:
            tdSql.query(type_sql)

C
cpwu 已提交
166
    def support_opers(self, dbname=DBNAME):
W
wenzhouwww@live.cn 已提交
167
        oper_lists =  ['LT','lt','Lt','lT','GT','gt','Gt','gT','LE','le','Le','lE','GE','ge','Ge','gE','NE','ne','Ne','nE','EQ','eq','Eq','eQ']
G
Ganlin Zhao 已提交
168

W
wenzhouwww@live.cn 已提交
169 170 171
        oper_errors = [",","*","NULL","tbname","ts","sum","_c0"]

        for oper in oper_lists:
C
cpwu 已提交
172
            tdSql.query(f"select stateduration(c1 ,'{oper}',1,1s) as col   from {dbname}.t1")
W
wenzhouwww@live.cn 已提交
173 174 175
            tdSql.checkRows(12)

        for oper in oper_errors:
C
cpwu 已提交
176
            tdSql.error(f"select stateduration(c1 ,'{oper}',1,1s) as col   from {dbname}.t1")
W
wenzhouwww@live.cn 已提交
177 178


C
cpwu 已提交
179
    def basic_stateduration_function(self, dbname=DBNAME):
W
wenzhouwww@live.cn 已提交
180

G
Ganlin Zhao 已提交
181
        # basic query
C
cpwu 已提交
182
        tdSql.query(f"select c1 from {dbname}.ct3")
W
wenzhouwww@live.cn 已提交
183
        tdSql.checkRows(0)
C
cpwu 已提交
184
        tdSql.query(f"select c1 from {dbname}.t1")
W
wenzhouwww@live.cn 已提交
185
        tdSql.checkRows(12)
C
cpwu 已提交
186
        tdSql.query(f"select c1 from {dbname}.stb1")
W
wenzhouwww@live.cn 已提交
187 188 189
        tdSql.checkRows(25)

        # used for empty table  , ct3 is empty
C
cpwu 已提交
190
        tdSql.query(f"select stateduration(c6,'GT',1,1s) from {dbname}.ct3")
W
wenzhouwww@live.cn 已提交
191
        tdSql.checkRows(0)
C
cpwu 已提交
192
        tdSql.query(f"select stateduration(c6,'GT',1,1s) from {dbname}.ct3")
W
wenzhouwww@live.cn 已提交
193
        tdSql.checkRows(0)
C
cpwu 已提交
194
        tdSql.query(f"select stateduration(c6,'GT',1,1s) from {dbname}.ct3")
W
wenzhouwww@live.cn 已提交
195
        tdSql.checkRows(0)
C
cpwu 已提交
196
        tdSql.query(f"select stateduration(c6,'GT',1,1s) from {dbname}.ct3")
W
wenzhouwww@live.cn 已提交
197
        tdSql.checkRows(0)
C
cpwu 已提交
198
        tdSql.query(f"select stateduration(c6,'GT',1,1s) from {dbname}.ct3")
W
wenzhouwww@live.cn 已提交
199
        tdSql.checkRows(0)
C
cpwu 已提交
200
        tdSql.query(f"select stateduration(c6,'GT',1,1s) from {dbname}.ct3")
W
wenzhouwww@live.cn 已提交
201

G
Ganlin Zhao 已提交
202
        # will support _rowts mix with
C
cpwu 已提交
203
        # tdSql.query(f"select (c6,'GT',1,1s),_rowts from {dbname}.ct3")
G
Ganlin Zhao 已提交
204

W
wenzhouwww@live.cn 已提交
205 206
        # auto check for t1 table
        # used for regular table
C
cpwu 已提交
207
        tdSql.query(f"select stateduration(c6,'GT',1,1s) from {dbname}.t1")
W
wenzhouwww@live.cn 已提交
208 209 210

        # unique with super tags

C
cpwu 已提交
211
        tdSql.query(f"select stateduration(c6,'GT',1,1s) from {dbname}.ct1")
W
wenzhouwww@live.cn 已提交
212 213
        tdSql.checkRows(13)

C
cpwu 已提交
214
        tdSql.query(f"select stateduration(c6,'GT',1,1s) from {dbname}.ct4")
W
wenzhouwww@live.cn 已提交
215 216
        tdSql.checkRows(12)

C
cpwu 已提交
217
        tdSql.query(f"select stateduration(c6,'GT',1,1s),tbname from {dbname}.ct1")
G
Ganlin Zhao 已提交
218
        tdSql.checkRows(13)
C
cpwu 已提交
219
        tdSql.query(f"select stateduration(c6,'GT',1,1s),t1 from {dbname}.ct1")
G
Ganlin Zhao 已提交
220
        tdSql.checkRows(13)
W
wenzhouwww@live.cn 已提交
221

G
Ganlin Zhao 已提交
222
        # unique with common col
C
cpwu 已提交
223
        tdSql.query(f"select stateduration(c6,'GT',1,1s) ,ts  from {dbname}.ct1")
G
Ganlin Zhao 已提交
224
        tdSql.checkRows(13)
C
cpwu 已提交
225
        tdSql.query(f"select stateduration(c6,'GT',1,1s) ,c1  from {dbname}.ct1")
G
Ganlin Zhao 已提交
226
        tdSql.checkRows(13)
W
wenzhouwww@live.cn 已提交
227

G
Ganlin Zhao 已提交
228
        # unique with scalar function
C
cpwu 已提交
229
        tdSql.query(f"select stateduration(c6,'GT',1,1s) , abs(c1)  from {dbname}.ct1")
G
Ganlin Zhao 已提交
230
        tdSql.checkRows(13)
C
cpwu 已提交
231
        tdSql.query(f"select stateduration(c6,'GT',1,1s) , abs(c2)+2 from {dbname}.ct1")
G
Ganlin Zhao 已提交
232
        tdSql.checkRows(13)
W
wenzhouwww@live.cn 已提交
233

C
cpwu 已提交
234
        tdSql.error(f"select stateduration(c6,'GT',1,1s) , unique(c2) from {dbname}.ct1")
G
Ganlin Zhao 已提交
235 236

        # unique with aggregate function
C
cpwu 已提交
237 238 239 240
        tdSql.error(f"select stateduration(c6,'GT',1,1s) ,sum(c1)  from {dbname}.ct1")
        tdSql.error(f"select stateduration(c6,'GT',1,1s) ,max(c1)  from {dbname}.ct1")
        tdSql.error(f"select stateduration(c6,'GT',1,1s) ,csum(c1)  from {dbname}.ct1")
        tdSql.error(f"select stateduration(c6,'GT',1,1s) ,count(c1)  from {dbname}.ct1")
W
wenzhouwww@live.cn 已提交
241 242

        # unique with filter where
C
cpwu 已提交
243
        tdSql.query(f"select stateduration(c6,'GT',1,1s) from {dbname}.ct4 where c1 is null")
W
wenzhouwww@live.cn 已提交
244 245 246 247
        tdSql.checkData(0, 0, None)
        tdSql.checkData(1, 0, None)
        tdSql.checkData(2, 0, None)

C
cpwu 已提交
248
        tdSql.query(f"select stateduration(c1,'GT',1,1s) from {dbname}.t1 where c1 >2 ")
W
wenzhouwww@live.cn 已提交
249 250 251 252 253 254
        tdSql.checkData(0, 0, 0)
        tdSql.checkData(1, 0, 10886404)
        tdSql.checkData(2, 0, 23500810)
        tdSql.checkData(4, 0, 57456020)
        tdSql.checkData(5, 0, 60393624)

C
cpwu 已提交
255
        tdSql.query(f"select stateduration(c2,'GT',1,1s) from {dbname}.t1  where c2 between 0  and   99999")
W
wenzhouwww@live.cn 已提交
256 257 258 259
        tdSql.checkData(0, 0, 0)
        tdSql.checkData(1, 0, 6134400)
        tdSql.checkData(6, 0, -1)

G
Ganlin Zhao 已提交
260 261

        # unique with union all
C
cpwu 已提交
262
        tdSql.query(f"select stateduration(c1,'GT',1,1s) from {dbname}.ct4 union all select stateduration(c1,'GT',1,1s) from {dbname}.ct1")
W
wenzhouwww@live.cn 已提交
263
        tdSql.checkRows(25)
C
cpwu 已提交
264
        tdSql.query(f"select stateduration(c1,'GT',1,1s) from {dbname}.ct4 union all select distinct(c1) from {dbname}.ct4")
W
wenzhouwww@live.cn 已提交
265 266
        tdSql.checkRows(22)

G
Ganlin Zhao 已提交
267 268
        # unique with join
        # prepare join datas with same ts
W
wenzhouwww@live.cn 已提交
269

C
cpwu 已提交
270 271 272
        tdSql.execute(f"create stable {dbname}.st1 (ts timestamp , num int) tags(ind int)")
        tdSql.execute(f"create table {dbname}.tb1 using {dbname}.st1 tags(1)")
        tdSql.execute(f"create table {dbname}.tb2 using {dbname}.st1 tags(2)")
W
wenzhouwww@live.cn 已提交
273

C
cpwu 已提交
274 275 276
        tdSql.execute(f"create stable {dbname}.st2 (ts timestamp , num int) tags(ind int)")
        tdSql.execute(f"create table {dbname}.ttb1 using {dbname}.st2 tags(1)")
        tdSql.execute(f"create table {dbname}.ttb2 using {dbname}.st2 tags(2)")
W
wenzhouwww@live.cn 已提交
277 278 279 280 281

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

        for i in range(10):
            ts_value = start_ts+i*1000
C
cpwu 已提交
282 283
            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 已提交
284

C
cpwu 已提交
285 286
            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 已提交
287

C
cpwu 已提交
288
        tdSql.query(f"select stateduration(tb1.num,'GT',1,1s)  from {dbname}.tb1 tb1, {dbname}.tb2 tb2 where tb1.ts=tb2.ts ")
W
wenzhouwww@live.cn 已提交
289 290 291 292 293 294
        tdSql.checkRows(10)
        tdSql.checkData(0,0,-1)
        tdSql.checkData(1,0,-1)
        tdSql.checkData(2,0,0)
        tdSql.checkData(9,0,7)

C
cpwu 已提交
295
        tdSql.query(f"select stateduration(tb1.num,'GT',1,1s)  from {dbname}.tb1 tb1, {dbname}.tb2 tb2 where tb1.ts=tb2.ts union all select stateduration(tb2.num,'GT',1,1s)  from {dbname}.tb1 tb1, {dbname}.tb2 tb2 where tb1.ts=tb2.ts ")
W
wenzhouwww@live.cn 已提交
296 297 298
        tdSql.checkRows(20)

        # nest query
C
cpwu 已提交
299 300
        # tdSql.query(f"select unique(c1) from (select c1 from {dbname}.ct1)")
        tdSql.query(f"select c1 from (select stateduration(c1,'GT',1,1s) c1 from {dbname}.t1)")
W
wenzhouwww@live.cn 已提交
301 302 303 304 305 306
        tdSql.checkRows(12)
        tdSql.checkData(0, 0, None)
        tdSql.checkData(1, 0, -1)
        tdSql.checkData(2, 0, 0)
        tdSql.checkData(10, 0, 63072035)

C
cpwu 已提交
307
        tdSql.query(f"select sum(c1) from (select stateduration(c1,'GT',1,1d) c1 from {dbname}.t1)")
W
wenzhouwww@live.cn 已提交
308 309 310
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, 2893)

C
cpwu 已提交
311
        tdSql.query(f"select sum(c1) from (select distinct(c1) c1 from {dbname}.ct1) union all select sum(c1) from (select stateduration(c1,'GT',1,1s) c1 from {dbname}.ct1)")
W
wenzhouwww@live.cn 已提交
312 313
        tdSql.checkRows(2)

C
cpwu 已提交
314
        tdSql.query(f"select 1-abs(c1) from (select stateduration(c1,'GT',1,1s) c1 from {dbname}.t1)")
W
wenzhouwww@live.cn 已提交
315 316 317 318
        tdSql.checkRows(12)
        tdSql.checkData(0, 0, None)
        tdSql.checkData(1, 0, 0.000000000)
        tdSql.checkData(3, 0, -86404.000000000)
319

C
cpwu 已提交
320
        tdSql.query(f"select stateduration(abs(c1) ,'GT',1,1s) from {dbname}.t1")
321
        tdSql.checkRows(12)
C
cpwu 已提交
322
        tdSql.query(f"select stateduration(c1+2 ,'GT',1,1s) from {dbname}.t1")
323
        tdSql.checkRows(12)
G
Ganlin Zhao 已提交
324

W
wenzhouwww@live.cn 已提交
325 326 327

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

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

        # group by
C
cpwu 已提交
335 336
        tdSql.error(f"select stateduration(c1,'GT',1,1s) from {dbname}.ct1 group by c1")
        tdSql.error(f"select stateduration(c1,'GT',1,1s) from {dbname}.ct1 group by tbname")
W
wenzhouwww@live.cn 已提交
337 338

        # super table
G
Ganlin Zhao 已提交
339

C
cpwu 已提交
340 341 342 343 344
    def check_unit_time(self, dbname=DBNAME):
        tdSql.error(f"select stateduration(c1,'GT',1,1b) from {dbname}.ct1")
        tdSql.error(f"select stateduration(c1,'GT',1,1u) from {dbname}.ct1")
        tdSql.error(f"select stateduration(c1,'GT',1,1000s) from {dbname}.t1")
        tdSql.query(f"select stateduration(c1,'GT',1,1s) from {dbname}.t1")
W
wenzhouwww@live.cn 已提交
345
        tdSql.checkData(10,0,63072035)
C
cpwu 已提交
346
        tdSql.query(f"select stateduration(c1,'GT',1,1m) from {dbname}.t1")
W
wenzhouwww@live.cn 已提交
347
        tdSql.checkData(10,0,int(63072035/60))
C
cpwu 已提交
348
        tdSql.query(f"select stateduration(c1,'GT',1,1h) from {dbname}.t1")
W
wenzhouwww@live.cn 已提交
349
        tdSql.checkData(10,0,int(63072035/60/60))
C
cpwu 已提交
350
        tdSql.query(f"select stateduration(c1,'GT',1,1d) from {dbname}.t1")
W
wenzhouwww@live.cn 已提交
351
        tdSql.checkData(10,0,int(63072035/60/24/60))
C
cpwu 已提交
352
        tdSql.query(f"select stateduration(c1,'GT',1,1w) from {dbname}.t1")
W
wenzhouwww@live.cn 已提交
353
        tdSql.checkData(10,0,int(63072035/60/7/24/60))
G
Ganlin Zhao 已提交
354 355


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

C
cpwu 已提交
358 359 360
        tdSql.execute(f"drop database if exists {dbname}")
        tdSql.execute(f"create database if not exists {dbname}")
        tdSql.execute(f"use {dbname}")
W
wenzhouwww@live.cn 已提交
361
        tdSql.execute(
C
cpwu 已提交
362
            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 已提交
363
        )
C
cpwu 已提交
364
        tdSql.execute(f'create table {dbname}.sub1_bound using {dbname}.stb_bound tags ( 1 )')
W
wenzhouwww@live.cn 已提交
365
        tdSql.execute(
C
cpwu 已提交
366
                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() )"
W
wenzhouwww@live.cn 已提交
367 368
            )
        tdSql.execute(
C
cpwu 已提交
369
                f"insert into {dbname}.sub1_bound values ( now(), 2147483646, 9223372036854775806, 32766, 126, 3.40E+38, 1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
W
wenzhouwww@live.cn 已提交
370 371 372
            )

        tdSql.execute(
C
cpwu 已提交
373
                f"insert into {dbname}.sub1_bound values ( now(), -2147483646, -9223372036854775806, -32766, -126, -3.40E+38, -1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
W
wenzhouwww@live.cn 已提交
374 375 376
            )

        tdSql.execute(
C
cpwu 已提交
377
                f"insert into {dbname}.sub1_bound values ( now(), 2147483643, 9223372036854775803, 32763, 123, 3.39E+38, 1.69e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
W
wenzhouwww@live.cn 已提交
378 379 380
            )

        tdSql.execute(
C
cpwu 已提交
381
                f"insert into {dbname}.sub1_bound values ( now(), -2147483643, -9223372036854775803, -32763, -123, -3.39E+38, -1.69e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
W
wenzhouwww@live.cn 已提交
382
            )
G
Ganlin Zhao 已提交
383

W
wenzhouwww@live.cn 已提交
384
        tdSql.error(
C
cpwu 已提交
385
                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() )"
W
wenzhouwww@live.cn 已提交
386
            )
G
Ganlin Zhao 已提交
387

C
cpwu 已提交
388
        tdSql.query(f"select stateduration(c1,'GT',1,1s) from {dbname}.sub1_bound")
W
wenzhouwww@live.cn 已提交
389 390 391 392 393 394
        tdSql.checkRows(5)

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

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

W
wenzhouwww@live.cn 已提交
396 397
        self.prepare_datas()

G
Ganlin Zhao 已提交
398
        tdLog.printNoPrefix("==========step2:test errors ==============")
W
wenzhouwww@live.cn 已提交
399 400

        self.test_errors()
G
Ganlin Zhao 已提交
401 402

        tdLog.printNoPrefix("==========step3:support types ============")
W
wenzhouwww@live.cn 已提交
403 404 405

        self.support_types()

G
Ganlin Zhao 已提交
406
        tdLog.printNoPrefix("==========step4:support opers ============")
W
wenzhouwww@live.cn 已提交
407 408
        self.support_opers()

G
Ganlin Zhao 已提交
409
        tdLog.printNoPrefix("==========step5: stateduration basic query ============")
W
wenzhouwww@live.cn 已提交
410 411 412

        self.basic_stateduration_function()

G
Ganlin Zhao 已提交
413
        tdLog.printNoPrefix("==========step6: stateduration boundary query ============")
W
wenzhouwww@live.cn 已提交
414 415 416

        self.check_boundary_values()

G
Ganlin Zhao 已提交
417
        tdLog.printNoPrefix("==========step6: stateduration unit time test ============")
W
wenzhouwww@live.cn 已提交
418 419 420 421 422 423 424 425 426 427

        self.check_unit_time()


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

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