homework-jianmu/tests/system-test/eco-system/manager/drop_table.py

146 lines
4.2 KiB
Python

###################################################################
# Copyright (c) 2016 by TAOS Technologies, Inc.
# All rights reserved.
#
# This file is proprietary and confidential to TAOS Technologies.
# No part of this file may be reproduced, stored, transmitted,
# disclosed or used in any form or by any means other than as
# expressly provided by the written permission from Jianhui Tao
#
###################################################################
# -*- coding: utf-8 -*-
from util.log import *
from util.cases import *
from util.sql import *
from util.common import *
from util.sqlset import *
import random
import time
import traceback
class TDTestCase:
def init(self, conn, logSql, replicaVar=1):
self.replicaVar = int(replicaVar)
tdLog.debug("start to execute %s" % __file__)
tdSql.init(conn.cursor(), True)
# describe table
def describe_table(self, tbname):
columns = []
tags = []
sql = f"describe {tbname}"
row_cnt = tdSql.query(sql)
for i in range(0, row_cnt):
col_name = tdSql.queryResult[i][0]
type_name = tdSql.queryResult[i][3]
if type_name == "TAG":
tags.append(col_name)
else:
columns.append(col_name)
return columns,tags
# show tables
def show_tables(self):
sql = "show tables;"
row_cnt = tdSql.query(sql)
tables = []
for i in range(0, row_cnt):
tb_name = tdSql.queryResult[i][0]
tables.append(tb_name)
# execute sql
def execute(self, sql):
try:
tdSql.execute(sql, 3)
tdLog.info(f" exec ok. {sql}")
except:
tdLog.info(f" exe failed. {sql}")
traceback.print_exc()
# query
def query_table(self, columns, tags):
if len(columns) < 5 :
return
if len(tags) < 5:
return
sel_cols = random.sample(columns, random.randint(1,int(len(columns)-1)))
sel_tags = random.sample(tags, random.randint(1, int(len(tags)-1)))
field_cols = ",".join(sel_cols)
field_tags = ",".join(sel_tags)
#sql = f"select {field_cols},{field_tags} from meters ;"
sql = f"select {field_cols},{field_tags} from meters"
try:
tdLog.info( " query sql:" + sql)
tdSql.query("select * from meters limit 1")
except:
tdLog.info( " query failed :" + sql)
traceback.print_exc()
# change table schema
def drop_table(self, change_cnt):
# init
tables = self.show_tables()
for i in range(change_cnt):
col_idx = random.randint(0, ncol - 1)
tag_idx = random.randint(0, ntag - 1)
cols = list(self.column_dict.keys())
tags = list(self.tag_dict.keys())
# column
key = cols[col_idx]
value = self.column_dict[key]
sql = f'alter table meters drop column {key}'
self.execute(sql)
sql = f'alter table meters add column {key} {value}'
self.execute(sql)
# column
key = tags[col_idx]
value = self.tag_dict[key]
sql = f'alter table meters drop tag {key}'
self.execute(sql)
sql = f'alter table meters add tag {key} {value}'
self.execute(sql)
# drop and rename
if i % 5 == 0:
# update columns
#columns,tags = self.describe_table("meters")
tdLog.info(f" ======= describe table column count = {len(cols)} tags= {len(tags)}======")
self.query_table(cols, tags)
# run
def run(self):
# seed
random.seed(int(time.time()))
self.dbname = "schema_change"
# switch db
tdSql.execute(f"use {self.dbname};")
# change meters
self.drop_table(1000000)
# stop
def stop(self):
tdSql.close()
tdLog.success("%s successfully executed" % __file__)
tdCases.addWindows(__file__, TDTestCase())
tdCases.addLinux(__file__, TDTestCase())