tail.py 22.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
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:

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

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

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

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

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

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

    def test_errors(self, dbname="db"):
69
        error_sql_lists = [
C
cpwu 已提交
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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
            f"select tail  from {dbname}.t1",
            f"select tail(123--123)==1  from {dbname}.t1",
            f"select tail(123,123)  from {dbname}.t1",
            f"select tail(c1,ts)  from {dbname}.t1",
            f"select tail(c1,c1,ts)  from {dbname}.t1",
            f"select tail(c1) as 'd1'  from {dbname}.t1",
            f"select tail(c1 ,c2 )  from {dbname}.t1",
            f"select tail(c1 ,NULL)  from {dbname}.t1",
            f"select tail(,)  from {dbname}.t1;",
            f"select tail(tail(c1) ab  from {dbname}.t1)",
            f"select tail(c1) as int  from {dbname}.t1",
            f"select tail('c1')  from {dbname}.t1",
            f"select tail(NULL)  from {dbname}.t1",
            f"select tail('')  from {dbname}.t1",
            f"select tail(c%)  from {dbname}.t1",
            f"select tail(t1)  from {dbname}.t1",
            f"select tail(True)  from {dbname}.t1",
            f"select tail(c1,1) , count(c1)  from {dbname}.t1",
            f"select tail(c1,1) , avg(c1)  from {dbname}.t1",
            f"select tail(c1,1) , min(c1)  from {dbname}.t1",
            f"select tail(c1,1) , spread(c1)  from {dbname}.t1",
            f"select tail(c1,1) , diff(c1)  from {dbname}.t1",
            f"select tail from {dbname}.stb1 partition by tbname",
            f"select tail(123--123)==1 from {dbname}.stb1 partition by tbname",
            f"select tail(123,123) from {dbname}.stb1 partition by tbname",
            f"select tail(c1,ts) from {dbname}.stb1 partition by tbname",
            f"select tail(c1,c1,ts) from {dbname}.stb1 partition by tbname",
            f"select tail(c1) as 'd1' from {dbname}.stb1 partition by tbname",
            f"select tail(c1 ,c2 ) from {dbname}.stb1 partition by tbname",
            f"select tail(c1 ,NULL) from {dbname}.stb1 partition by tbname",
            f"select tail(,) from {dbname}.stb1 partition by tbname;",
            f"select tail(tail(c1) ab from {dbname}.stb1 partition by tbname)",
            f"select tail(c1) as int from {dbname}.stb1 partition by tbname",
            f"select tail('c1') from {dbname}.stb1 partition by tbname",
            f"select tail(NULL) from {dbname}.stb1 partition by tbname",
            f"select tail('') from {dbname}.stb1 partition by tbname",
            f"select tail(c%) from {dbname}.stb1 partition by tbname",
            f"select tail(t1) from {dbname}.stb1 partition by tbname",
            f"select tail(True) from {dbname}.stb1 partition by tbname",
            f"select tail(c1,1) , count(c1) from {dbname}.stb1 partition by tbname",
            f"select tail(c1,1) , avg(c1) from {dbname}.stb1 partition by tbname",
            f"select tail(c1,1) , min(c1) from {dbname}.stb1 partition by tbname",
            f"select tail(c1,1) , spread(c1) from {dbname}.stb1 partition by tbname",
            f"select tail(c1,1) , diff(c1) from {dbname}.stb1 partition by tbname",
114 115 116
        ]
        for error_sql in error_sql_lists:
            tdSql.error(error_sql)
C
cpwu 已提交
117 118

    def support_types(self, dbname="db"):
119
        other_no_value_types = [
C
cpwu 已提交
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
            f"select tail(ts,1)  from {dbname}.t1" ,
            f"select tail(c7,1)  from {dbname}.t1",
            f"select tail(c8,1)  from {dbname}.t1",
            f"select tail(c9,1)  from {dbname}.t1",
            f"select tail(ts,1) from {dbname}.ct1" ,
            f"select tail(c7,1) from {dbname}.ct1",
            f"select tail(c8,1) from {dbname}.ct1",
            f"select tail(c9,1) from {dbname}.ct1",
            f"select tail(ts,1) from {dbname}.ct3" ,
            f"select tail(c7,1) from {dbname}.ct3",
            f"select tail(c8,1) from {dbname}.ct3",
            f"select tail(c9,1) from {dbname}.ct3",
            f"select tail(ts,1) from {dbname}.ct4" ,
            f"select tail(c7,1) from {dbname}.ct4",
            f"select tail(c8,1) from {dbname}.ct4",
            f"select tail(c9,1) from {dbname}.ct4",
            f"select tail(ts,1) from {dbname}.stb1 partition by tbname" ,
            f"select tail(c7,1) from {dbname}.stb1 partition by tbname",
            f"select tail(c8,1) from {dbname}.stb1 partition by tbname",
            f"select tail(c9,1) from {dbname}.stb1 partition by tbname"
140
        ]
C
cpwu 已提交
141

142 143
        for type_sql in other_no_value_types:
            tdSql.query(type_sql)
C
cpwu 已提交
144

145
        type_sql_lists = [
C
cpwu 已提交
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
            f"select tail(c1,1)  from {dbname}.t1",
            f"select tail(c2,1)  from {dbname}.t1",
            f"select tail(c3,1)  from {dbname}.t1",
            f"select tail(c4,1)  from {dbname}.t1",
            f"select tail(c5,1)  from {dbname}.t1",
            f"select tail(c6,1)  from {dbname}.t1",

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

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

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

            f"select tail(c6,1) as alisb from {dbname}.stb1 partition by tbname",
            f"select tail(c6,1) alisb from {dbname}.stb1 partition by tbname",
176 177 178 179 180 181 182
        ]

        for type_sql in type_sql_lists:
            tdSql.query(type_sql)

    def check_tail_table(self , tbname , col_name , tail_rows , offset):
        tail_sql = f"select tail({col_name} , {tail_rows} , {offset}) from {tbname}"
X
Xiaoyu Wang 已提交
183 184
        #equal_sql = f"select {col_name} from (select ts , {col_name} from {tbname} order by ts desc limit {tail_rows} offset {offset}) order by ts"
        equal_sql = f"select {col_name} from {tbname} order by ts desc limit {tail_rows} offset {offset}"
185 186 187 188 189 190 191 192 193 194 195 196
        tdSql.query(tail_sql)
        tail_result = tdSql.queryResult

        tdSql.query(equal_sql)

        equal_result = tdSql.queryResult

        if tail_result == equal_result:
            tdLog.info(" tail query check pass , tail sql is: %s" %tail_sql)
        else:
            tdLog.exit(" tail query check fail , tail sql is: %s " %tail_sql)

C
cpwu 已提交
197
    def basic_tail_function(self, dbname="db"):
198

C
cpwu 已提交
199 200
        # basic query
        tdSql.query(f"select c1 from {dbname}.ct3")
201
        tdSql.checkRows(0)
C
cpwu 已提交
202
        tdSql.query(f"select c1  from {dbname}.t1")
203
        tdSql.checkRows(12)
C
cpwu 已提交
204
        tdSql.query(f"select c1 from {dbname}.stb1")
205 206 207
        tdSql.checkRows(25)

        # used for empty table  , ct3 is empty
C
cpwu 已提交
208
        tdSql.query(f"select tail(c1,1) from {dbname}.ct3")
209
        tdSql.checkRows(0)
C
cpwu 已提交
210
        tdSql.query(f"select tail(c2,1) from {dbname}.ct3")
211
        tdSql.checkRows(0)
C
cpwu 已提交
212
        tdSql.query(f"select tail(c3,1) from {dbname}.ct3")
213
        tdSql.checkRows(0)
C
cpwu 已提交
214
        tdSql.query(f"select tail(c4,1) from {dbname}.ct3")
215
        tdSql.checkRows(0)
C
cpwu 已提交
216
        tdSql.query(f"select tail(c5,1) from {dbname}.ct3")
217
        tdSql.checkRows(0)
C
cpwu 已提交
218 219
        tdSql.query(f"select tail(c6,1) from {dbname}.ct3")

220 221
        # auto check for t1 table
        # used for regular table
C
cpwu 已提交
222 223 224
        tdSql.query(f"select tail(c1,1)  from {dbname}.t1")

        tdSql.query(f"desc {dbname}.t1")
225 226 227
        col_lists_rows = tdSql.queryResult
        col_lists = []
        for col_name in col_lists_rows:
W
wenzhouwww@live.cn 已提交
228 229
            if col_name[0] =="ts":
                continue
C
cpwu 已提交
230

231
            col_lists.append(col_name[0])
C
cpwu 已提交
232

233
        for col in col_lists:
C
cpwu 已提交
234
            for loop in range(100):
235 236
                limit = randint(1,100)
                offset = randint(0,100)
C
cpwu 已提交
237
                self.check_tail_table(f"{dbname}.t1" , col , limit , offset)
238 239

        # tail for invalid params
C
cpwu 已提交
240 241 242 243 244 245 246

        tdSql.error(f"select tail(c1,-10,10) from {dbname}.ct1")
        tdSql.error(f"select tail(c1,10,10000) from {dbname}.ct1")
        tdSql.error(f"select tail(c1,10,-100) from {dbname}.ct1")
        tdSql.error(f"select tail(c1,100/2,10) from {dbname}.ct1")
        tdSql.error(f"select tail(c1,5,10*2) from {dbname}.ct1")
        tdSql.query(f"select tail(c1,100,100) from {dbname}.ct1")
247
        tdSql.checkRows(0)
C
cpwu 已提交
248
        tdSql.query(f"select tail(c1,10,100) from {dbname}.ct1")
249
        tdSql.checkRows(0)
C
cpwu 已提交
250 251 252
        tdSql.error(f"select tail(c1,10,101) from {dbname}.ct1")
        tdSql.query(f"select tail(c1,10,0) from {dbname}.ct1")
        tdSql.query(f"select tail(c1,100,10) from {dbname}.ct1")
253
        tdSql.checkRows(3)
C
cpwu 已提交
254

255 256
        # tail with super tags

C
cpwu 已提交
257
        tdSql.query(f"select tail(c1,10,10) from {dbname}.ct1")
258 259
        tdSql.checkRows(3)

C
cpwu 已提交
260 261 262 263 264 265
        tdSql.query(f"select tail(c1,10,10),tbname from {dbname}.ct1")
        tdSql.query(f"select tail(c1,10,10),t1 from {dbname}.ct1")

        # tail with common col
        tdSql.query(f"select tail(c1,10,10) ,ts  from {dbname}.ct1")
        tdSql.query(f"select tail(c1,10,10) ,c1  from {dbname}.ct1")
266

C
cpwu 已提交
267 268 269 270
        # tail with scalar function
        tdSql.query(f"select tail(c1,10,10) ,abs(c1)  from {dbname}.ct1")
        tdSql.error(f"select tail(c1,10,10) , tail(c2,10,10) from {dbname}.ct1")
        tdSql.query(f"select tail(c1,10,10) , abs(c2)+2 from {dbname}.ct1")
271 272

        # bug need fix for scalar value or compute again
C
cpwu 已提交
273 274 275
        # tdSql.error(f"select tail(c1,10,10) , 123 from {dbname}.ct1")
        # tdSql.error(f"select abs(tail(c1,10,10)) from {dbname}.ct1")
        # tdSql.error(f"select abs(tail(c1,10,10)) + 2 from {dbname}.ct1")
276

C
cpwu 已提交
277 278 279 280 281
        # tail with aggregate function
        tdSql.error(f"select tail(c1,10,10) ,sum(c1)  from {dbname}.ct1")
        tdSql.error(f"select tail(c1,10,10) ,max(c1)  from {dbname}.ct1")
        tdSql.error(f"select tail(c1,10,10) ,csum(c1)  from {dbname}.ct1")
        tdSql.error(f"select tail(c1,10,10) ,count(c1)  from {dbname}.ct1")
282 283

        # tail with filter where
C
cpwu 已提交
284
        tdSql.query(f"select tail(c1,3,1) from {dbname}.ct4 where c1 is null")
285 286 287
        tdSql.checkData(0, 0, None)
        tdSql.checkData(1, 0, None)

C
cpwu 已提交
288
        tdSql.query(f"select tail(c1,3,2) from {dbname}.ct4 where c1 >2 order by 1")
289
        tdSql.checkData(0, 0, 5)
290
        tdSql.checkData(1, 0, 6)
291
        tdSql.checkData(2, 0, 7)
292

C
cpwu 已提交
293
        tdSql.query(f"select tail(c1,2,1) from {dbname}.ct4  where c2 between 0  and   99999 order by 1")
294 295
        tdSql.checkData(0, 0, 1)
        tdSql.checkData(1, 0, 2)
296

C
cpwu 已提交
297 298
        # tail with union all
        tdSql.query(f"select tail(c1,2,1) from {dbname}.ct4 union all select c1 from {dbname}.ct1")
299
        tdSql.checkRows(15)
C
cpwu 已提交
300
        tdSql.query(f"select tail(c1,2,1) from {dbname}.ct4 union all select c1 from {dbname}.ct2 order by 1")
301
        tdSql.checkRows(2)
302 303
        tdSql.checkData(0, 0, 0)
        tdSql.checkData(1, 0, 1)
C
cpwu 已提交
304
        tdSql.query(f"select tail(c2,2,1) from {dbname}.ct4 union all select abs(c2)/2 from {dbname}.ct4")
305 306
        tdSql.checkRows(14)

C
cpwu 已提交
307 308
        # tail with join
        # prepare join datas with same ts
309

C
cpwu 已提交
310 311 312
        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)")
313

C
cpwu 已提交
314 315 316
        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)")
317 318 319 320 321

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

        for i in range(10):
            ts_value = start_ts+i*1000
C
cpwu 已提交
322 323
            tdSql.execute(f" insert into {dbname}.tb1 values({ts_value} , {i})")
            tdSql.execute(f" insert into {dbname}.tb2 values({ts_value} , {i})")
324

C
cpwu 已提交
325 326
            tdSql.execute(f" insert into {dbname}.ttb1 values({ts_value} , {i})")
            tdSql.execute(f" insert into {dbname}.ttb2 values({ts_value} , {i})")
327

C
cpwu 已提交
328
        tdSql.query(f"select tail(tb2.num,3,2)   from {dbname}.tb1 tb1, {dbname}.tb2 tb2 where tb1.ts=tb2.ts order by 1 desc")
329
        tdSql.checkRows(3)
330
        tdSql.checkData(0,0,7)
331
        tdSql.checkData(1,0,6)
332
        tdSql.checkData(2,0,5)
333 334

        # nest query
C
cpwu 已提交
335 336
        # tdSql.query(f"select tail(c1,2) from (select _rowts , c1 from {dbname}.ct1)")
        tdSql.query(f"select c1 from (select tail(c1,2) c1 from {dbname}.ct4) order by 1 nulls first")
337
        tdSql.checkRows(2)
338 339
        tdSql.checkData(0, 0, None)
        tdSql.checkData(1, 0, 0)
340

C
cpwu 已提交
341
        tdSql.query(f"select sum(c1) from (select tail(c1,2) c1 from {dbname}.ct1)")
342 343 344
        tdSql.checkRows(1)
        tdSql.checkData(0, 0, 18)

C
cpwu 已提交
345
        tdSql.query(f"select abs(c1) from (select tail(c1,2) c1 from {dbname}.ct1)")
346 347
        tdSql.checkRows(2)
        tdSql.checkData(0, 0, 9)
C
cpwu 已提交
348

349
        #partition by tbname
C
cpwu 已提交
350
        tdSql.query(f"select tail(c1,5) from {dbname}.stb1 partition by tbname ")
351 352
        tdSql.checkRows(10)

C
cpwu 已提交
353
        tdSql.query(f"select tail(c1,3) from {dbname}.stb1 partition by tbname ")
354
        tdSql.checkRows(6)
C
cpwu 已提交
355 356 357 358

        # group by
        tdSql.error(f"select tail(c1,2) from {dbname}.ct1 group by c1")
        tdSql.error(f"select tail(c1,2) from {dbname}.ct1 group by tbname")
359 360

        # super table
C
cpwu 已提交
361 362
        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")
363 364 365
        tdSql.checkRows(4)


C
cpwu 已提交
366 367
        # bug need fix
        # tdSql.query(f"select tbname , tail(c1,2) from {dbname}.stb1 partition by tbname")
368 369
        # tdSql.checkRows(4)

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

C
cpwu 已提交
373
        # tdSql.query(f"select tbname , count(c1) from {dbname}.stb1 partition by tbname order by tbname ")
374
        # tdSql.checkRows(2)
C
cpwu 已提交
375
        # tdSql.query(f"select tbname , max(c1) ,c1 from {dbname}.stb1 partition by tbname order by tbname ")
376
        # tdSql.checkRows(2)
C
cpwu 已提交
377
        # tdSql.query(f"select tbname ,first(c1) from {dbname}.stb1 partition by tbname order by tbname ")
378 379
        # tdSql.checkRows(2)

C
cpwu 已提交
380
        tdSql.query(f"select tail(c1,2) from {dbname}.stb1 partition by tbname")
381 382 383
        tdSql.checkRows(4)


C
cpwu 已提交
384 385
        # # bug need fix
        # tdSql.query(f"select tbname , tail(c1,2) from {dbname}.stb1  where t1 = 0 partition by tbname ")
386
        # tdSql.checkRows(2)
C
cpwu 已提交
387
        # tdSql.query(f"select tbname , tail(c1,2) from {dbname}.stb1  where t1 = 0 partition by tbname order by tbname ")
388
        # tdSql.checkRows(2)
C
cpwu 已提交
389
        # tdSql.query(f"select tbname , tail(c1,2) from {dbname}.stb1  where c1 = 0 partition by tbname order by tbname ")
390
        # tdSql.checkRows(3)
C
cpwu 已提交
391
        # tdSql.query(f"select tbname , tail(c1,2) from {dbname}.stb1  where c1 = 0 partition by tbname ")
392
        # tdSql.checkRows(3)
C
cpwu 已提交
393
        # tdSql.query(f"select tbname , tail(c1,2) from {dbname}.stb1  where c1 = 0 partition by tbname ")
394
        # tdSql.checkRows(3)
C
cpwu 已提交
395
        tdSql.query(f"select tail(t1,2) from {dbname}.stb1  ")
396
        tdSql.checkRows(2)
C
cpwu 已提交
397
        tdSql.query(f"select tail(t1+c1,2) from {dbname}.stb1 ")
398
        tdSql.checkRows(2)
C
cpwu 已提交
399
        tdSql.query(f"select tail(t1+c1,2) from {dbname}.stb1 partition by tbname ")
400
        tdSql.checkRows(4)
C
cpwu 已提交
401
        tdSql.query(f"select tail(t1,2) from {dbname}.stb1 partition by tbname ")
402
        tdSql.checkRows(4)
403

C
cpwu 已提交
404 405
        # nest query
        tdSql.query(f"select  tail(c1,2) from (select _rowts , t1 ,c1 , tbname from {dbname}.stb1 ) ")
406 407 408
        tdSql.checkRows(2)
        tdSql.checkData(0,0,None)
        tdSql.checkData(1,0,9)
C
cpwu 已提交
409
        tdSql.query(f"select  tail(t1,2) from (select _rowts , t1 , tbname from {dbname}.stb1 )")
410 411 412
        tdSql.checkRows(2)
        tdSql.checkData(0,0,4)
        tdSql.checkData(1,0,1)
413

C
cpwu 已提交
414
    def check_boundary_values(self, dbname="bound_test"):
415

C
cpwu 已提交
416 417
        tdSql.execute(f"drop database if exists {dbname}")
        tdSql.execute(f"create database if not exists {dbname}")
418
        tdSql.execute(
C
cpwu 已提交
419
            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);"
420
        )
C
cpwu 已提交
421
        tdSql.execute(f'create table {dbname}.sub1_bound using {dbname}.stb_bound tags ( 1 )')
422
        tdSql.execute(
C
cpwu 已提交
423
                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() )"
424 425
            )
        tdSql.execute(
C
cpwu 已提交
426
                f"insert into {dbname}.sub1_bound values ( now(), 2147483646, 9223372036854775806, 32766, 126, 3.40E+38, 1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
427 428 429
            )

        tdSql.execute(
C
cpwu 已提交
430
                f"insert into {dbname}.sub1_bound values ( now(), -2147483646, -9223372036854775806, -32766, -126, -3.40E+38, -1.7e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
431 432 433
            )

        tdSql.execute(
C
cpwu 已提交
434
                f"insert into {dbname}.sub1_bound values ( now(), 2147483643, 9223372036854775803, 32763, 123, 3.39E+38, 1.69e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
435 436 437
            )

        tdSql.execute(
C
cpwu 已提交
438
                f"insert into {dbname}.sub1_bound values ( now(), -2147483643, -9223372036854775803, -32763, -123, -3.39E+38, -1.69e+308, True, 'binary_tb1', 'nchar_tb1', now() )"
439
            )
C
cpwu 已提交
440

441
        tdSql.error(
C
cpwu 已提交
442
                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() )"
443
            )
C
cpwu 已提交
444 445

        tdSql.query(f"select tail(c2,2) from {dbname}.sub1_bound order by 1 desc")
446 447 448 449 450 451 452
        tdSql.checkRows(2)
        tdSql.checkData(0,0,9223372036854775803)

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

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

454 455
        self.prepare_datas()

C
cpwu 已提交
456
        tdLog.printNoPrefix("==========step2:test errors ==============")
457 458

        self.test_errors()
C
cpwu 已提交
459 460

        tdLog.printNoPrefix("==========step3:support types ============")
461 462 463

        self.support_types()

C
cpwu 已提交
464
        tdLog.printNoPrefix("==========step4: tail basic query ============")
465 466 467

        self.basic_tail_function()

C
cpwu 已提交
468
        tdLog.printNoPrefix("==========step5: tail boundary query ============")
469 470 471 472 473 474 475 476 477 478

        self.check_boundary_values()


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

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