time_range_wise.py 23.7 KB
Newer Older
C
cpwu 已提交
1
from datetime import datetime
C
cpwu 已提交
2
import time
C
cpwu 已提交
3 4 5 6 7 8 9

from dataclasses import dataclass
from typing import List, Any, Tuple
from util.log import *
from util.sql import *
from util.cases import *
from util.dnodes import *
C
cpwu 已提交
10
from util.constant import *
C
cpwu 已提交
11
from util.common import *
C
cpwu 已提交
12 13 14 15 16 17 18 19 20 21

PRIMARY_COL = "ts"

INT_COL = "c_int"
BINT_COL = "c_bint"
SINT_COL = "c_sint"
TINT_COL = "c_tint"
FLOAT_COL = "c_float"
DOUBLE_COL = "c_double"
BOOL_COL = "c_bool"
C
cpwu 已提交
22 23 24 25
TINT_UN_COL = "c_utint"
SINT_UN_COL = "c_usint"
BINT_UN_COL = "c_ubint"
INT_UN_COL = "c_uint"
C
cpwu 已提交
26 27 28 29
BINARY_COL = "c_binary"
NCHAR_COL = "c_nchar"
TS_COL = "c_ts"

C
cpwu 已提交
30 31 32 33 34
NUM_COL = [INT_COL, BINT_COL, SINT_COL, TINT_COL, FLOAT_COL, DOUBLE_COL, ]
CHAR_COL = [BINARY_COL, NCHAR_COL, ]
BOOLEAN_COL = [BOOL_COL, ]
TS_TYPE_COL = [TS_COL, ]

C
cpwu 已提交
35 36 37 38 39
INT_TAG = "t_int"

ALL_COL = [PRIMARY_COL, INT_COL, BINT_COL, SINT_COL, TINT_COL, FLOAT_COL, DOUBLE_COL, BINARY_COL, NCHAR_COL, BOOL_COL, TS_COL]
TAG_COL = [INT_TAG]

C
cpwu 已提交
40 41
# insert data args:
TIME_STEP = 10000
C
cpwu 已提交
42
NOW = int(datetime.timestamp(datetime.now()) * 1000)
C
cpwu 已提交
43

C
cpwu 已提交
44 45 46 47 48 49
# init db/table
DBNAME  = "db"
STBNAME = "stb1"
CTBNAME = "ct1"
NTBNAME = "nt1"

C
cpwu 已提交
50 51 52

@dataclass
class SMAschema:
C
cpwu 已提交
53 54 55 56 57 58 59 60 61 62 63 64 65 66
    creation            : str           = "CREATE"
    index_name          : str           = "sma_index_1"
    index_flag          : str           = "SMA INDEX"
    operator            : str           = "ON"
    tbname              : str           = None
    watermark           : str           = "5s"
    max_delay           : str           = "6m"
    func                : Tuple[str]    = None
    interval            : Tuple[str]    = ("6m", "10s")
    sliding             : str           = "6m"
    other               : Any           = None
    drop                : str           = "DROP"
    drop_flag           : str           = "INDEX"
    querySmaOptimize    : int           = 1
C
cpwu 已提交
67 68 69 70
    show                : str           = "SHOW"
    show_msg            : str           = "INDEXES"
    show_oper           : str           = "FROM"
    dbname              : str           = None
C
cpwu 已提交
71
    rollup_db           : bool          = False
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

    def __post_init__(self):
        if isinstance(self.other, dict):
            for k,v in self.other.items():

                if k.lower() == "index_name" and isinstance(v, str) and not self.index_name:
                    self.index_name = v
                    del self.other[k]

                if k.lower() == "index_flag" and isinstance(v, str) and not self.index_flag:
                    self.index_flag = v
                    del self.other[k]

                if k.lower() == "operator" and isinstance(v, str) and not self.operator:
                    self.operator = v
                    del self.other[k]

                if k.lower() == "tbname" and isinstance(v, str) and not self.tbname:
                    self.tbname = v
                    del self.other[k]

                if k.lower() == "watermark" and isinstance(v, str) and not self.watermark:
                    self.watermark = v
                    del self.other[k]

C
cpwu 已提交
97 98
                if k.lower() == "max_delay" and isinstance(v, str) and not self.max_delay:
                    self.max_delay = v
C
cpwu 已提交
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
                    del self.other[k]

                if k.lower() == "functions" and isinstance(v, tuple) and not self.func:
                    self.func = v
                    del self.other[k]

                if k.lower() == "interval" and isinstance(v, tuple) and not self.interval:
                    self.interval = v
                    del self.other[k]

                if k.lower() == "sliding" and isinstance(v, str) and not self.sliding:
                    self.sliding = v
                    del self.other[k]

                if k.lower() == "drop_flag" and isinstance(v, str) and not self.drop_flag:
                    self.drop_flag = v
                    del self.other[k]

C
cpwu 已提交
117 118 119 120 121 122 123 124 125 126 127
                if k.lower() == "show_msg" and isinstance(v, str) and not self.show_msg:
                    self.show_msg = v
                    del self.other[k]

                if k.lower() == "dbname" and isinstance(v, str) and not self.dbname:
                    self.dbname = v
                    del self.other[k]

                if k.lower() == "show_oper" and isinstance(v, str) and not self.show_oper:
                    self.show_oper = v
                    del self.other[k]
C
cpwu 已提交
128

C
cpwu 已提交
129 130 131 132 133
                if k.lower() == "rollup_db" and isinstance(v, bool) and not self.rollup_db:
                    self.rollup_db = v
                    del self.other[k]


C
cpwu 已提交
134
class TDTestCase:
C
cpwu 已提交
135
    updatecfgDict = {"querySmaOptimize": 1}
C
cpwu 已提交
136 137 138

    def init(self, conn, logSql):
        tdLog.debug(f"start to excute {__file__}")
C
cpwu 已提交
139
        tdSql.init(conn.cursor(), False)
C
cpwu 已提交
140
        self.precision = "ms"
C
cpwu 已提交
141
        self.sma_count = 0
C
cpwu 已提交
142
        self.sma_created_index = []
C
cpwu 已提交
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160

    """
        create sma index :
            1. only create on stable, err_type: [child-table, normal-table]
            2. one taosd, one sma index , err_type: [
                one stb --> multi sma index,
                multi stb in one db--> multi sma index,
                multi stb in multi db --> multi sma index
            ]
            3. arg of (interval/sliding) in query sql is equal to this arg in sma index
            4. client timezone is equal to timezone of sma index
            5. does not take effect unless querySmaOptimize flag is turned on,
    """
    def __create_sma_index(self, sma:SMAschema):
        sql = f"{sma.creation} {sma.index_flag} {sma.index_name} {sma.operator} {sma.tbname}"
        if sma.func:
            sql += f" function({', '.join(sma.func)})"
        if sma.interval:
C
cpwu 已提交
161 162 163 164 165
            interval, offset = self.__get_interval_offset(sma.interval)
            if offset:
                sql += f" interval({interval}, {offset})"
            else:
                sql += f" interval({interval})"
C
cpwu 已提交
166 167 168 169
        if sma.sliding:
            sql += f" sliding({sma.sliding})"
        if sma.watermark:
            sql += f" watermark {sma.watermark}"
C
cpwu 已提交
170 171
        if sma.max_delay:
            sql += f" max_delay {sma.max_delay}"
C
cpwu 已提交
172 173 174 175 176 177 178 179 180
        if isinstance(sma.other, dict):
            for k,v in sma.other.items():
                if isinstance(v,tuple) or isinstance(v, list):
                    sql += f" {k} ({' '.join(v)})"
                else:
                    sql += f" {k} {v}"
        if isinstance(sma.other, tuple) or isinstance(sma.other, list):
            sql += " ".join(sma.other)
        if isinstance(sma.other, int) or isinstance(sma.other, float) or isinstance(sma.other, str):
C
cpwu 已提交
181
            sql += f" {sma.other}"
C
cpwu 已提交
182

C
cpwu 已提交
183 184
        return sql

C
cpwu 已提交
185 186 187 188 189 190 191 192 193 194 195
    def __get_sma_func_col(self, func):
        cols = []
        if isinstance(func, str):
            cols.append( func.split("(")[-1].split(")")[0] )
        elif isinstance(func, tuple) or isinstance(func, list):
            for func_col in func:
                cols.append(func_col.split("(")[-1].split(")")[0])
        else:
            cols = []
        return cols

C
cpwu 已提交
196
    def __check_sma_func(self, func:tuple):
C
cpwu 已提交
197
        if not isinstance(func, str) and not isinstance(func, tuple) and not isinstance(func, list):
C
cpwu 已提交
198 199
            return False
        if isinstance(func, str) :
C
cpwu 已提交
200 201 202 203 204
            if "(" not in func or ")" not in func:
                return False
            if func.split("(")[0].upper() not in SMA_INDEX_FUNCTIONS:
                return False
            if func.split("(")[1].split(")")[0] not in ALL_COL and func.split("(")[1].split(")")[0] not in TAG_COL :
C
cpwu 已提交
205
                return False
C
cpwu 已提交
206 207 208 209 210 211 212 213 214 215 216 217
        if isinstance(func, tuple) or isinstance(func, list):
            for arg in func:
                if not isinstance(arg, str):
                    return False
                if "(" not in arg or ")" not in arg:
                    return False
                if arg.split("(")[0].upper() not in SMA_INDEX_FUNCTIONS:
                    return False
                if arg.split("(")[1].split(")")[0] not in ALL_COL and arg.split("(")[1].split(")")[0] not in TAG_COL :
                    return False
        return True

C
cpwu 已提交
218
    def __check_sma_watermark(self, arg):
C
cpwu 已提交
219 220
        if not arg:
            return False
C
cpwu 已提交
221 222 223 224
        if not isinstance(arg, str):
            return False
        if arg[-1] not in SMA_WATMARK_MAXDELAY_INIT:
            return False
C
cpwu 已提交
225 226 227 228 229 230 231 232 233 234 235 236
        if len(arg) == 1:
            return False
        if not arg[:-1].isdecimal():
            return False
        if tdSql.get_times(arg) > WATERMARK_MAX:
            return False
        if tdSql.get_times(arg) < WATERMARK_MIN:
            return False

        return True

    def __check_sma_max_delay(self, arg):
C
cpwu 已提交
237 238
        if not self.__check_sma_watermark(arg):
            return False
C
cpwu 已提交
239 240
        if tdSql.get_times(arg) < MAX_DELAY_MIN:
            return False
C
cpwu 已提交
241

C
cpwu 已提交
242 243
        return True

C
cpwu 已提交
244
    def __check_sma_sliding(self, arg):
C
cpwu 已提交
245 246 247 248 249 250 251 252
        if not isinstance(arg, str):
            return False
        if arg[-1] not in TAOS_TIME_INIT:
            return False
        if len(arg) == 1:
            return False
        if not arg[:-1].isdecimal():
            return False
C
cpwu 已提交
253

C
cpwu 已提交
254
        return True
C
cpwu 已提交
255

C
cpwu 已提交
256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
    def __get_interval_offset(self, args):
        if isinstance(args, str):
            interval, offset = args, None
        elif isinstance(args,tuple) or isinstance(args, list):
            if len(args) == 1:
                interval, offset = args[0], None
            elif len(args) == 2:
                interval, offset = args
            else:
                interval, offset = False, False
        else:
            interval, offset = False, False

        return interval, offset

    def __check_sma_interval(self, args):
        if not isinstance(args, tuple) and not isinstance(args,str):
            return False
        interval, offset =  self.__get_interval_offset(args)
        if not interval:
            return False
        if not self.__check_sma_sliding(interval):
C
cpwu 已提交
278
            return False
C
cpwu 已提交
279 280 281 282 283 284 285 286 287
        if tdSql.get_times(interval) < INTERVAL_MIN:
            return False
        if offset:
            if not self.__check_sma_sliding(offset):
                return False
            if tdSql.get_times(interval) <= tdSql.get_times(offset) :
                return False

        return True
C
cpwu 已提交
288 289

    def __sma_create_check(self, sma:SMAschema):
C
cpwu 已提交
290
        if  self.updatecfgDict["querySmaOptimize"] == 0:
C
cpwu 已提交
291
            return False
C
cpwu 已提交
292 293
        tdSql.query("select database()")
        dbname =  tdSql.getData(0,0)
X
Xiaoyu Wang 已提交
294
        tdSql.query("select * from information_schema.ins_databases")
C
cpwu 已提交
295 296 297 298
        for index , value in enumerate(tdSql.cursor.description):
            if value[0] == "retention":
                r_index = index
                break
C
cpwu 已提交
299 300
        for row in tdSql.queryResult:
            if row[0] == dbname:
C
cpwu 已提交
301
                if row[r_index] is None:
C
cpwu 已提交
302
                    continue
C
cpwu 已提交
303
                if ":" in row[r_index]:
C
cpwu 已提交
304 305 306
                    sma.rollup_db = True
        if sma.rollup_db :
            return False
C
cpwu 已提交
307
        tdSql.query("show stables")
C
cpwu 已提交
308 309
        if not sma.tbname:
            return False
C
cpwu 已提交
310 311 312 313 314
        stb_in_list = False
        for row in tdSql.queryResult:
            if sma.tbname == row[0]:
                stb_in_list = True
        if not stb_in_list:
C
cpwu 已提交
315
            return False
C
cpwu 已提交
316
        if not sma.creation or not isinstance(sma.creation, str) or sma.creation.upper() != "CREATE":
C
cpwu 已提交
317
            return False
C
cpwu 已提交
318
        if not sma.index_flag or not isinstance(sma.index_flag, str) or  sma.index_flag.upper() != "SMA INDEX" :
C
cpwu 已提交
319
            return False
C
cpwu 已提交
320
        if not sma.index_name or not isinstance(sma.index_name, str) or sma.index_name.upper() in TAOS_KEYWORDS:
C
cpwu 已提交
321
            return False
C
cpwu 已提交
322
        if not sma.operator or not isinstance(sma.operator, str) or sma.operator.upper() != "ON":
C
cpwu 已提交
323
            return False
C
cpwu 已提交
324

C
cpwu 已提交
325 326
        if not sma.func or not self.__check_sma_func(sma.func):
            return False
C
cpwu 已提交
327 328 329 330 331 332 333 334 335
        tdSql.query(f"desc {sma.tbname}")
        _col_list = []
        for col_row in  tdSql.queryResult:
            _col_list.append(col_row[0])
        _sma_func_cols = self.__get_sma_func_col(sma.func)
        for  _sma_func_col in _sma_func_cols:
            if _sma_func_col not in _col_list:
                return False

C
cpwu 已提交
336
        if sma.sliding and not self.__check_sma_sliding(sma.sliding):
C
cpwu 已提交
337
            return False
C
cpwu 已提交
338
        interval, _ =  self.__get_interval_offset(sma.interval)
C
cpwu 已提交
339
        if not sma.interval or not self.__check_sma_interval(sma.interval) :
C
cpwu 已提交
340
            return False
C
cpwu 已提交
341
        if sma.sliding and tdSql.get_times(interval) < tdSql.get_times(sma.sliding):
C
cpwu 已提交
342
            return False
C
cpwu 已提交
343 344 345
        if sma.watermark and not self.__check_sma_watermark(sma.watermark):
            return False
        if sma.max_delay and not self.__check_sma_max_delay(sma.max_delay):
C
cpwu 已提交
346
            return False
C
cpwu 已提交
347
        if sma.other:
C
cpwu 已提交
348 349 350 351 352
            return False

        return True

    def sma_create_check(self, sma:SMAschema):
C
cpwu 已提交
353 354 355
        if self.__sma_create_check(sma):
            tdSql.query(self.__create_sma_index(sma))
            self.sma_count += 1
C
cpwu 已提交
356
            self.sma_created_index.append(sma.index_name)
C
cpwu 已提交
357
            tdSql.query(self.__show_sma_index(sma))
C
cpwu 已提交
358
            tdSql.checkRows(self.sma_count)
C
cpwu 已提交
359
            tdSql.checkData(0, 2, sma.tbname)
C
cpwu 已提交
360

C
cpwu 已提交
361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381
        else:
            tdSql.error(self.__create_sma_index(sma))

    def __drop_sma_index(self, sma:SMAschema):
        sql = f"{sma.drop} {sma.drop_flag} {sma.index_name}"
        return sql

    def __sma_drop_check(self, sma:SMAschema):
        if not sma.drop:
            return False
        if not sma.drop_flag:
            return False
        if not sma.index_name:
            return False

        return True

    def sma_drop_check(self, sma:SMAschema):
        if self.__sma_drop_check(sma):
            tdSql.query(self.__drop_sma_index(sma))
            self.sma_count -= 1
C
cpwu 已提交
382 383 384
            self.sma_created_index = list(filter(lambda x: x != sma.index_name, self.sma_created_index))
            tdSql.query("show streams")
            tdSql.checkRows(self.sma_count)
C
cpwu 已提交
385
            time.sleep(1)
C
cpwu 已提交
386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410
        else:
            tdSql.error(self.__drop_sma_index(sma))

    def __show_sma_index(self, sma:SMAschema):
        sql = f"{sma.show} {sma.show_msg} {sma.show_oper} {sma.tbname}"
        return sql

    def __sma_show_check(self, sma:SMAschema):
        if not sma.show:
            return False
        if not sma.show_msg:
            return False
        if not sma.show_oper:
            return False
        if not sma.tbname:
            return False

        return True

    def sma_show_check(self, sma:SMAschema):
        if self.__sma_show_check(sma):
            tdSql.query(self.__show_sma_index(sma))
            tdSql.checkRows(self.sma_count)
        else:
            tdSql.error(self.__show_sma_index(sma))
C
cpwu 已提交
411

C
cpwu 已提交
412 413 414 415 416
    @property
    def __create_sma_sql(self):
        err_sqls = []
        cur_sqls = []
        # err_set
C
cpwu 已提交
417
        # # case 1: required fields check
C
cpwu 已提交
418 419 420 421 422
        err_sqls.append( SMAschema(creation="", tbname=STBNAME, func=(f"min({INT_COL})",f"max({INT_COL})") ) )
        err_sqls.append( SMAschema(index_name="",tbname=STBNAME, func=(f"min({INT_COL})",f"max({INT_COL})") ) )
        err_sqls.append( SMAschema(index_flag="",tbname=STBNAME, func=(f"min({INT_COL})",f"max({INT_COL})") ) )
        err_sqls.append( SMAschema(operator="",tbname=STBNAME, func=(f"min({INT_COL})",f"max({INT_COL})") ) )
        err_sqls.append( SMAschema(tbname="", func=(f"min({INT_COL})",f"max({INT_COL})") ) )
C
cpwu 已提交
423
        err_sqls.append( SMAschema(func=("",),tbname=STBNAME ) )
C
cpwu 已提交
424
        err_sqls.append( SMAschema(interval=(""),tbname=STBNAME, func=(f"min({INT_COL})",f"max({INT_COL})") ) )
C
cpwu 已提交
425

C
cpwu 已提交
426 427 428 429 430 431 432 433 434
        # # case 2: err fields
        err_sqls.append( SMAschema(creation="show",tbname=STBNAME, func=(f"min({INT_COL})",f"max({INT_COL})") ) )
        err_sqls.append( SMAschema(creation="alter",tbname=STBNAME, func=(f"min({INT_COL})",f"max({INT_COL})") ) )
        err_sqls.append( SMAschema(creation="select",tbname=STBNAME, func=(f"min({INT_COL})",f"max({INT_COL})") ) )

        err_sqls.append( SMAschema(index_flag="SMA INDEXES", tbname=STBNAME, func=(f"min({INT_COL})",f"max({INT_COL})") ) )
        err_sqls.append( SMAschema(index_flag="SMA INDEX ,", tbname=STBNAME, func=(f"min({INT_COL})",f"max({INT_COL})") ) )
        err_sqls.append( SMAschema(index_name="tbname", tbname=STBNAME, func=(f"min({INT_COL})",f"max({INT_COL})") ) )

C
cpwu 已提交
435
        # current_set
C
cpwu 已提交
436

C
cpwu 已提交
437 438 439 440 441
        cur_sqls.append( SMAschema(max_delay="",tbname=STBNAME, func=(f"min({INT_COL})",f"max({INT_COL})") ) )
        cur_sqls.append( SMAschema(watermark="",index_name="sma_index_2",tbname=STBNAME, func=(f"min({INT_COL})",f"max({INT_COL})") ) )
        cur_sqls.append( SMAschema(sliding="",index_name='sma_index_3',tbname=STBNAME, func=(f"min({INT_COL})",f"max({INT_COL})") ) )

        return err_sqls, cur_sqls
C
cpwu 已提交
442

C
cpwu 已提交
443 444 445 446
    def test_create_sma(self):
        err_sqls , cur_sqls = self.__create_sma_sql
        for err_sql in err_sqls:
            self.sma_create_check(err_sql)
C
cpwu 已提交
447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468
        for cur_sql in cur_sqls:
            self.sma_create_check(cur_sql)

    @property
    def __drop_sma_sql(self):
        err_sqls = []
        cur_sqls = []
        # err_set
        ## case 1: required fields check
        err_sqls.append( SMAschema(drop="") )
        err_sqls.append( SMAschema(drop_flag="") )
        err_sqls.append( SMAschema(index_name="") )

        for index in self.sma_created_index:
            cur_sqls.append(SMAschema(index_name=index))

        return err_sqls, cur_sqls

    def test_drop_sma(self):
        err_sqls , cur_sqls = self.__drop_sma_sql
        for err_sql in err_sqls:
            self.sma_drop_check(err_sql)
C
cpwu 已提交
469 470
        for cur_sql in cur_sqls:
            self.sma_drop_check(cur_sql)
C
cpwu 已提交
471 472

    def all_test(self):
C
cpwu 已提交
473
        self.test_create_sma()
C
cpwu 已提交
474
        self.test_drop_sma()
C
cpwu 已提交
475

C
cpwu 已提交
476
    def __create_tb(self, stb=STBNAME, ctb_num=20, ntbnum=1, dbname=DBNAME):
C
cpwu 已提交
477
        tdLog.printNoPrefix("==========step: create table")
C
cpwu 已提交
478 479
        create_stb_sql = f'''create table {dbname}.{stb}(
                {PRIMARY_COL} timestamp, {INT_COL} int, {BINT_COL} bigint, {SINT_COL} smallint, {TINT_COL} tinyint,
C
cpwu 已提交
480 481 482 483
                {FLOAT_COL} float, {DOUBLE_COL} double, {BOOL_COL} bool,
                {BINARY_COL} binary(16), {NCHAR_COL} nchar(32), {TS_COL} timestamp,
                {TINT_UN_COL} tinyint unsigned, {SINT_UN_COL} smallint unsigned,
                {INT_UN_COL} int unsigned, {BINT_UN_COL} bigint unsigned
C
cpwu 已提交
484
            ) tags ({INT_TAG} int)
C
cpwu 已提交
485 486 487
            '''
        tdSql.execute(create_stb_sql)

C
cpwu 已提交
488 489 490 491 492 493 494 495 496 497 498 499 500 501 502
        for i in range(ntbnum):
            create_ntb_sql = f'''create table {dbname}.nt{i+1}(
                    {PRIMARY_COL} timestamp, {INT_COL} int, {BINT_COL} bigint, {SINT_COL} smallint, {TINT_COL} tinyint,
                    {FLOAT_COL} float, {DOUBLE_COL} double, {BOOL_COL} bool,
                    {BINARY_COL} binary(16), {NCHAR_COL} nchar(32), {TS_COL} timestamp,
                    {TINT_UN_COL} tinyint unsigned, {SINT_UN_COL} smallint unsigned,
                    {INT_UN_COL} int unsigned, {BINT_UN_COL} bigint unsigned
                )
                '''
            tdSql.execute(create_ntb_sql)

        for i in range(ctb_num):
            tdSql.execute(f'create table {dbname}.ct{i+1} using {dbname}.{stb} tags ( {i+1} )')

    def __insert_data(self, rows, ctb_num=20, dbname=DBNAME, star_time=NOW):
C
cpwu 已提交
503
        tdLog.printNoPrefix("==========step: start inser data into tables now.....")
C
cpwu 已提交
504 505 506
        # from ...pytest.util.common import DataSet
        data = DataSet()
        data.get_order_set(rows, bint_step=2)
C
cpwu 已提交
507

C
cpwu 已提交
508
        for i in range(rows):
C
cpwu 已提交
509 510
            row_data = f'''
                {data.int_data[i]}, {data.bint_data[i]}, {data.sint_data[i]}, {data.tint_data[i]}, {data.float_data[i]}, {data.double_data[i]},
C
cpwu 已提交
511 512
                {data.bool_data[i]}, '{data.vchar_data[i]}', '{data.nchar_data[i]}', {data.ts_data[i]}, {data.utint_data[i]},
                {data.usint_data[i]}, {data.uint_data[i]}, {data.ubint_data[i]}
C
cpwu 已提交
513
            '''
C
cpwu 已提交
514
            tdSql.execute( f"insert into {dbname}.{NTBNAME} values ( {star_time - i * int(TIME_STEP * 1.2)}, {row_data} )" )
C
cpwu 已提交
515

C
cpwu 已提交
516 517
            for j in range(ctb_num):
                tdSql.execute( f"insert into {dbname}.ct{j+1} values ( {star_time - j * i * TIME_STEP}, {row_data} )" )
C
cpwu 已提交
518 519 520 521 522 523 524 525

    def run(self):
        self.rows = 10

        tdLog.printNoPrefix("==========step0:all check")

        tdLog.printNoPrefix("==========step1:create table in normal database")
        tdSql.prepare()
C
cpwu 已提交
526 527
        self.__create_tb(dbname=DBNAME)
        self.__insert_data(rows=self.rows)
C
cpwu 已提交
528 529
        self.all_test()

C
cpwu 已提交
530 531
        # # from ...pytest.util.sql import *

C
cpwu 已提交
532
        # drop databases, create same name db、stb and sma index
C
cpwu 已提交
533
        tdSql.prepare()
C
cpwu 已提交
534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579
        self.__create_tb(dbname=DBNAME)
        self.__insert_data(rows=self.rows,star_time=NOW + self.rows * 2 * TIME_STEP)
        tdLog.printNoPrefix("==========step1.1 : create a tsma index and checkdata")
        tdSql.execute(f"create sma index {DBNAME}.sma_index_name1 on {DBNAME}.{STBNAME} function(max({INT_COL}),max({BINT_COL}),min({INT_COL})) interval(6m,10s) sliding(6m)")
        self.__insert_data(rows=self.rows)
        tdSql.query(f"select max({INT_COL}), max({BINT_COL}), min({INT_COL}) from {DBNAME}.{STBNAME} interval(6m,10s) sliding(6m)")
        tdSql.checkData(0, 0, self.rows - 1)
        tdSql.checkData(0, 1, (self.rows - 1) * 2 )
        tdSql.checkData(tdSql.queryRows - 1, 2, 0)
        # tdSql.checkData(0, 2, 0)

        tdLog.printNoPrefix("==========step1.2 : alter table schema, drop col without index")
        tdSql.execute(f"alter stable {DBNAME}.{STBNAME} drop column {BINARY_COL}")
        tdSql.query(f"select max({INT_COL}), max({BINT_COL}), min({INT_COL}) from {DBNAME}.{STBNAME} interval(6m,10s) sliding(6m)")
        tdSql.checkData(0, 0, self.rows - 1)
        tdSql.checkData(0, 1, (self.rows - 1) * 2 )
        tdSql.checkData(tdSql.queryRows - 1, 2, 0)

        tdLog.printNoPrefix("==========step1.3 : alter table schema, drop col with index")
        # TODO: TD-18047, can not drop col,  when col in tsma-index and tsma-index is not dropped.
        tdSql.error(f"alter stable {DBNAME}.stb1 drop column {BINT_COL}")

        tdLog.printNoPrefix("==========step1.4 : alter table schema, add col")
        tdSql.execute(f"alter stable {DBNAME}.{STBNAME} add column {BINT_COL}_1 bigint")
        tdSql.execute(f"insert into {DBNAME}.{CTBNAME} ({PRIMARY_COL}, {BINT_COL}_1) values(now(), 111)")
        tdSql.query(f"select max({INT_COL}), max({BINT_COL}), min({INT_COL}) from {DBNAME}.{STBNAME} interval(6m,10s) sliding(6m)")
        tdSql.checkData(0, 0, self.rows - 1)
        tdSql.checkData(0, 1, (self.rows - 1) * 2 )
        tdSql.checkData(tdSql.queryRows - 1, 2, 0)
        # tdSql.checkData(0, 2, 0)
        tdSql.query(f"select max({BINT_COL}_1) from {DBNAME}.{STBNAME} ")
        tdSql.checkData(0, 0 , 111)

        tdSql.execute(f"flush database {DBNAME}")

        tdLog.printNoPrefix("==========step1.5 : drop child table")
        tdSql.execute(f"drop table {CTBNAME}")
        tdSql.query(f"select max({INT_COL}), max({BINT_COL}), min({INT_COL}) from {DBNAME}.{STBNAME} interval(6m,10s) sliding(6m)")
        tdSql.checkData(0, 0, self.rows - 1)
        tdSql.checkData(0, 1, (self.rows - 1) * 2 )
        tdSql.checkData(tdSql.queryRows - 1, 2, 0)

        tdLog.printNoPrefix("==========step1.6 : drop stable")
        tdSql.execute(f"drop table {STBNAME}")
        tdSql.error(f"select * from {DBNAME}.{STBNAME}")

C
cpwu 已提交
580
        self.all_test()
C
cpwu 已提交
581

C
cpwu 已提交
582 583 584 585 586
        tdLog.printNoPrefix("==========step2:create table in rollup database")
        tdSql.execute("create database db3 retentions 1s:4m,2s:8m,3s:12m")
        tdSql.execute("use db3")
        tdSql.execute(f"create stable stb1 ({PRIMARY_COL} timestamp, {INT_COL} int) tags (tag1 int) rollup(first) watermark 5s max_delay 1m sma({INT_COL}) ")
        self.all_test()
C
cpwu 已提交
587 588 589 590

        tdSql.execute("drop database if exists db1 ")
        tdSql.execute("drop database if exists db2 ")

C
cpwu 已提交
591 592 593 594 595
        # tdDnodes.stop(1)
        # tdDnodes.start(1)

        tdSql.execute("flush database db ")

C
cpwu 已提交
596 597 598 599 600 601 602 603 604 605
        tdLog.printNoPrefix("==========step4:after wal, all check again ")
        self.all_test()

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


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