This commit is contained in:
cpwu 2022-06-30 15:34:38 +08:00
parent 6e1c6a9f88
commit 4b73cdb529
7 changed files with 105 additions and 151 deletions

View File

@ -17,6 +17,7 @@ import string
import requests import requests
import time import time
import socket import socket
import json
from .boundary import DataBoundary from .boundary import DataBoundary
import taos import taos
from util.log import * from util.log import *
@ -25,7 +26,7 @@ from util.cases import *
from util.dnodes import * from util.dnodes import *
from util.common import * from util.common import *
class TDCom: class TDCom:
def __init__(self): def __init__(self):
self.sml_type = None self.sml_type = None
self.env_setting = None self.env_setting = None
@ -206,12 +207,12 @@ class TDCom:
""" """
generate long name generate long name
mode could be numbers/letters/letters_mixed/mixed mode could be numbers/letters/letters_mixed/mixed
""" """
if mode == "numbers": if mode == "numbers":
chars = ''.join(random.choice(string.digits) for i in range(len)) chars = ''.join(random.choice(string.digits) for i in range(len))
elif mode == "letters": elif mode == "letters":
chars = ''.join(random.choice(string.ascii_letters.lower()) for i in range(len)) chars = ''.join(random.choice(string.ascii_letters.lower()) for i in range(len))
elif mode == "letters_mixed": elif mode == "letters_mixed":
chars = ''.join(random.choice(string.ascii_letters.upper() + string.ascii_letters.lower()) for i in range(len)) chars = ''.join(random.choice(string.ascii_letters.upper() + string.ascii_letters.lower()) for i in range(len))
else: else:
chars = ''.join(random.choice(string.ascii_letters.lower() + string.digits) for i in range(len)) chars = ''.join(random.choice(string.ascii_letters.lower() + string.digits) for i in range(len))
@ -276,7 +277,7 @@ class TDCom:
vgroups replica precision strict wal fsync comp cachelast single_stable buffer pagesize pages minrows maxrows duration keep retentions vgroups replica precision strict wal fsync comp cachelast single_stable buffer pagesize pages minrows maxrows duration keep retentions
''' '''
sqlString = f'create database if not exists {dbName} ' sqlString = f'create database if not exists {dbName} '
dbParams = "" dbParams = ""
if len(kwargs) > 0: if len(kwargs) > 0:
for param, value in kwargs.items(): for param, value in kwargs.items():
@ -306,7 +307,7 @@ class TDCom:
# return # return
# def create_ctables(self,tsql, dbName,stbName,ctbNum,tagDict): # def create_ctables(self,tsql, dbName,stbName,ctbNum,tagDict):
# tsql.execute("use %s" %dbName) # tsql.execute("use %s" %dbName)
# tagsValues = '' # tagsValues = ''
# for i in range(tagDict['int']): # for i in range(tagDict['int']):
# if i > 0: # if i > 0:
@ -323,7 +324,7 @@ class TDCom:
# sql = pre_create # sql = pre_create
# if sql != pre_create: # if sql != pre_create:
# tsql.execute(sql) # tsql.execute(sql)
# tdLog.debug("complete to create %d child tables in %s.%s" %(ctbNum, dbName, stbName)) # tdLog.debug("complete to create %d child tables in %s.%s" %(ctbNum, dbName, stbName))
# return # return
@ -352,7 +353,7 @@ class TDCom:
# tsql.execute(sql) # tsql.execute(sql)
# tdLog.debug("insert data ............ [OK]") # tdLog.debug("insert data ............ [OK]")
# return # return
def getBuildPath(self): def getBuildPath(self):
selfPath = os.path.dirname(os.path.realpath(__file__)) selfPath = os.path.dirname(os.path.realpath(__file__))
@ -367,7 +368,7 @@ class TDCom:
if ("packaging" not in rootRealPath): if ("packaging" not in rootRealPath):
buildPath = root[:len(root) - len("/build/bin")] buildPath = root[:len(root) - len("/build/bin")]
break break
return buildPath return buildPath
def getClientCfgPath(self): def getClientCfgPath(self):
buildPath = self.getBuildPath() buildPath = self.getBuildPath()
@ -398,7 +399,7 @@ class TDCom:
return newTdSql return newTdSql
################################################################################################################ ################################################################################################################
# port from the common.py of new test frame # port from the common.py of new test frame
################################################################################################################ ################################################################################################################
def gen_default_tag_str(self): def gen_default_tag_str(self):
default_tag_str = "" default_tag_str = ""
@ -527,9 +528,9 @@ class TDCom:
tag_value_list.append(self.gen_random_type_value(tag_elm["type"], "", "", "", "")) tag_value_list.append(self.gen_random_type_value(tag_elm["type"], "", "", "", ""))
else: else:
continue continue
return tag_value_list return tag_value_list
def gen_column_value_list(self, column_elm_list, ts_value=None): def gen_column_value_list(self, column_elm_list, ts_value=None):
if ts_value is None: if ts_value is None:
ts_value = self.genTs()[0] ts_value = self.genTs()[0]
@ -554,7 +555,7 @@ class TDCom:
return column_value_list return column_value_list
def create_stable(self, tsql, dbname=None, stbname="stb", column_elm_list=None, tag_elm_list=None, def create_stable(self, tsql, dbname=None, stbname="stb", column_elm_list=None, tag_elm_list=None,
count=1, default_stbname_prefix="stb", **kwargs): count=1, default_stbname_prefix="stb", **kwargs):
colname_prefix = 'c' colname_prefix = 'c'
tagname_prefix = 't' tagname_prefix = 't'
stbname_index_start_num = 1 stbname_index_start_num = 1
@ -589,20 +590,20 @@ class TDCom:
tag_value_str += f'"{tag_value}", ' tag_value_str += f'"{tag_value}", '
else: else:
tag_value_str += f'{tag_value}, ' tag_value_str += f'{tag_value}, '
tag_value_str = tag_value_str.rstrip()[:-1] tag_value_str = tag_value_str.rstrip()[:-1]
if int(count) <= 1: if int(count) <= 1:
create_ctable_sql = f'create table {dbname}.{default_ctbname_prefix}{ctbname_index_start_num} using {dbname}.{stbname} tags ({tag_value_str}) {ctb_params};' create_ctable_sql = f'create table {dbname}.{default_ctbname_prefix}{ctbname_index_start_num} using {dbname}.{stbname} tags ({tag_value_str}) {ctb_params};'
tsql.execute(create_ctable_sql) tsql.execute(create_ctable_sql)
else: else:
for _ in range(count): for _ in range(count):
create_ctable_sql = f'create table {dbname}.{default_ctbname_prefix}{ctbname_index_start_num} using {dbname}.{stbname} tags ({tag_value_str}) {ctb_params};' create_ctable_sql = f'create table {dbname}.{default_ctbname_prefix}{ctbname_index_start_num} using {dbname}.{stbname} tags ({tag_value_str}) {ctb_params};'
ctbname_index_start_num += 1 ctbname_index_start_num += 1
tdLog.info("create ctb sql: %s"%create_ctable_sql) tdLog.info("create ctb sql: %s"%create_ctable_sql)
tsql.execute(create_ctable_sql) tsql.execute(create_ctable_sql)
def create_table(self, tsql, dbname=None, tbname="ntb", column_elm_list=None, count=1, **kwargs): def create_table(self, tsql, dbname=None, tbname="ntb", column_elm_list=None, count=1, **kwargs):
tbname_index_start_num = 1 tbname_index_start_num = 1
tbname_prefix="ntb" tbname_prefix="ntb"
tb_params = "" tb_params = ""
@ -632,7 +633,7 @@ class TDCom:
column_value_str += f'"{column_value}", ' column_value_str += f'"{column_value}", '
else: else:
column_value_str += f'{column_value}, ' column_value_str += f'{column_value}, '
column_value_str = column_value_str.rstrip()[:-1] column_value_str = column_value_str.rstrip()[:-1]
if int(count) <= 1: if int(count) <= 1:
insert_sql = f'insert into {self.tb_name} values ({column_value_str});' insert_sql = f'insert into {self.tb_name} values ({column_value_str});'
tsql.execute(insert_sql) tsql.execute(insert_sql)
@ -651,4 +652,16 @@ class TDCom:
return res_list return res_list
else: else:
tdLog.exit(f"getOneRow out of range: row_index={location} row_count={self.query_row}") tdLog.exit(f"getOneRow out of range: row_index={location} row_count={self.query_row}")
def is_json(msg):
if isinstance(msg, str):
try:
json.loads(msg)
return True
except:
return False
else:
return False
tdCom = TDCom() tdCom = TDCom()

View File

@ -71,6 +71,34 @@ TAOS_KEYWORDS = [
"COPY", "IF", "NOW", "STABLES", "WHERE", "COPY", "IF", "NOW", "STABLES", "WHERE",
] ]
NUM_FUNC = [
"ABS", "ACOS", "ASIN", "ATAN", "CEIL", "COS", "FLOOR", "LOG", "POW", "ROUND", "SIN", "SQRT", "TAN",
]
STR_FUNC = [
"CHAR_LENGTH", "CONCAT", "CONCAT_WS", "LENGTH", "LOWER","LTRIM", "RTRIM", "SUBSTR", "UPPER",
]
CONVER_FUNC = ["CASR", "TO_ISO8601", "TO_JSON", "TP_UNIXTIMESTAMP"]
SELECT_FUNC = [
"APERCENTILE", "BOTTOM", "FIRST", "INTERP", "LAST", "MAX", "MIN", "PERCENTILE", "TAIL", "TOP", "UNIQUE",
]
AGG_FUNC = [
"AVG", "COUNT", "ELAPSED", "LEASTSQUARES", "MODE", "SPREAD", "STDDEV", "SUM", "HYPERLOGLOG", "HISTOGRAM",
]
TS_FUNC = [
"CSUM", "DERIVATIVE", "DIFF", "IRATE", "MAVG", "SAMPLE", "STATECOUNT", "STATEDURATION", "TWA"
]
SYSINFO_FUCN = [
"DATABASE", "CLIENT_VERSION", "SERVER_VERSION", "SERVER_STATUS", "CURRENT_USER", "USER"
]
# basic data type boundary # basic data type boundary
TINYINT_MAX = 127 TINYINT_MAX = 127
TINYINT_MIN = -128 TINYINT_MIN = -128

View File

@ -96,6 +96,15 @@ class TDSql:
return self.queryResult return self.queryResult
return self.queryRows return self.queryRows
def is_err_sql(self, sql):
err_flag = True
try:
self.cursor.execute(sql)
except BaseException:
err_flag = False
return False if err_flag else True
def getVariable(self, search_attr): def getVariable(self, search_attr):
''' '''
get variable of search_attr access "show variables" get variable of search_attr access "show variables"
@ -249,7 +258,6 @@ class TDSql:
raise Exception(repr(e)) raise Exception(repr(e))
return self.queryResult return self.queryResult
def executeTimes(self, sql, times): def executeTimes(self, sql, times):
for i in range(times): for i in range(times):
try: try:
@ -336,6 +344,38 @@ class TDSql:
elif precision == "ns": elif precision == "ns":
return int(times*1000*1000) return int(times*1000*1000)
def get_type(self, col):
if self.cursor.istype(col, "BOOL"):
return "BOOL"
if self.cursor.istype(col, "INT"):
return "INT"
if self.cursor.istype(col, "BIGINT"):
return "BIGINT"
if self.cursor.istype(col, "TINYINT"):
return "TINYINT"
if self.cursor.istype(col, "SMALLINT"):
return "SMALLINT"
if self.cursor.istype(col, "FLOAT"):
return "FLOAT"
if self.cursor.istype(col, "DOUBLE"):
return "DOUBLE"
if self.cursor.istype(col, "BINARY"):
return "BINARY"
if self.cursor.istype(col, "NCHAR"):
return "NCHAR"
if self.cursor.istype(col, "TIMESTAMP"):
return "TIMESTAMP"
if self.cursor.istype(col, "JSON"):
return "JSON"
if self.cursor.istype(col, "TINYINT UNSIGNED"):
return "TINYINT UNSIGNED"
if self.cursor.istype(col, "SMALLINT UNSIGNED"):
return "SMALLINT UNSIGNED"
if self.cursor.istype(col, "INT UNSIGNED"):
return "INT UNSIGNED"
if self.cursor.istype(col, "BIGINT UNSIGNED"):
return "BIGINT UNSIGNED"
def taosdStatus(self, state): def taosdStatus(self, state):
tdLog.sleep(5) tdLog.sleep(5)
pstate = 0 pstate = 0

View File

@ -163,38 +163,6 @@ class TDTestCase:
# return filter(None, sqls) # return filter(None, sqls)
return list(filter(None, sqls)) return list(filter(None, sqls))
def __get_type(self, col):
if tdSql.cursor.istype(col, "BOOL"):
return "BOOL"
if tdSql.cursor.istype(col, "INT"):
return "INT"
if tdSql.cursor.istype(col, "BIGINT"):
return "BIGINT"
if tdSql.cursor.istype(col, "TINYINT"):
return "TINYINT"
if tdSql.cursor.istype(col, "SMALLINT"):
return "SMALLINT"
if tdSql.cursor.istype(col, "FLOAT"):
return "FLOAT"
if tdSql.cursor.istype(col, "DOUBLE"):
return "DOUBLE"
if tdSql.cursor.istype(col, "BINARY"):
return "BINARY"
if tdSql.cursor.istype(col, "NCHAR"):
return "NCHAR"
if tdSql.cursor.istype(col, "TIMESTAMP"):
return "TIMESTAMP"
if tdSql.cursor.istype(col, "JSON"):
return "JSON"
if tdSql.cursor.istype(col, "TINYINT UNSIGNED"):
return "TINYINT UNSIGNED"
if tdSql.cursor.istype(col, "SMALLINT UNSIGNED"):
return "SMALLINT UNSIGNED"
if tdSql.cursor.istype(col, "INT UNSIGNED"):
return "INT UNSIGNED"
if tdSql.cursor.istype(col, "BIGINT UNSIGNED"):
return "BIGINT UNSIGNED"
def explain_check(self): def explain_check(self):
sqls = self.sql_list() sqls = self.sql_list()
tdLog.printNoPrefix("===step 1: curent case, must return query OK") tdLog.printNoPrefix("===step 1: curent case, must return query OK")

View File

@ -116,37 +116,6 @@ class TDTestCase:
# return filter(None, sqls) # return filter(None, sqls)
return list(filter(None, sqls)) return list(filter(None, sqls))
def __get_type(self, col):
if tdSql.cursor.istype(col, "BOOL"):
return "BOOL"
if tdSql.cursor.istype(col, "INT"):
return "INT"
if tdSql.cursor.istype(col, "BIGINT"):
return "BIGINT"
if tdSql.cursor.istype(col, "TINYINT"):
return "TINYINT"
if tdSql.cursor.istype(col, "SMALLINT"):
return "SMALLINT"
if tdSql.cursor.istype(col, "FLOAT"):
return "FLOAT"
if tdSql.cursor.istype(col, "DOUBLE"):
return "DOUBLE"
if tdSql.cursor.istype(col, "BINARY"):
return "BINARY"
if tdSql.cursor.istype(col, "NCHAR"):
return "NCHAR"
if tdSql.cursor.istype(col, "TIMESTAMP"):
return "TIMESTAMP"
if tdSql.cursor.istype(col, "JSON"):
return "JSON"
if tdSql.cursor.istype(col, "TINYINT UNSIGNED"):
return "TINYINT UNSIGNED"
if tdSql.cursor.istype(col, "SMALLINT UNSIGNED"):
return "SMALLINT UNSIGNED"
if tdSql.cursor.istype(col, "INT UNSIGNED"):
return "INT UNSIGNED"
if tdSql.cursor.istype(col, "BIGINT UNSIGNED"):
return "BIGINT UNSIGNED"
def hyperloglog_check(self): def hyperloglog_check(self):
sqls = self.sql_list() sqls = self.sql_list()
@ -228,10 +197,10 @@ class TDTestCase:
tag_sql += f"{k} {v}," tag_sql += f"{k} {v},"
tdSql.execute(f'create table if not exists {stbname} ({column_sql[:-1]}) tags({tag_sql[:-1]})') tdSql.execute(f'create table if not exists {stbname} ({column_sql[:-1]}) tags({tag_sql[:-1]})')
def __insert_data(self): def __insert_data(self):
pass pass
def __hyperloglog_check_distribute(self): def __hyperloglog_check_distribute(self):
dbname = "dbtest" dbname = "dbtest"
stbname = "stb" stbname = "stb"
@ -286,7 +255,7 @@ class TDTestCase:
tdSql.query(f"select hyperloglog({k}) from {stbname} group by {k}") tdSql.query(f"select hyperloglog({k}) from {stbname} group by {k}")
tdSql.execute(f'drop database {dbname}') tdSql.execute(f'drop database {dbname}')
def __insert_data(self, rows): def __insert_data(self, rows):
now_time = int(datetime.datetime.timestamp(datetime.datetime.now()) * 1000) now_time = int(datetime.datetime.timestamp(datetime.datetime.now()) * 1000)

View File

@ -195,38 +195,6 @@ class TDTestCase:
# return filter(None, sqls) # return filter(None, sqls)
return list(filter(None, current_sqls)), list(filter(None, err_sqls)) return list(filter(None, current_sqls)), list(filter(None, err_sqls))
def __get_type(self, col):
if tdSql.cursor.istype(col, "BOOL"):
return "BOOL"
if tdSql.cursor.istype(col, "INT"):
return "INT"
if tdSql.cursor.istype(col, "BIGINT"):
return "BIGINT"
if tdSql.cursor.istype(col, "TINYINT"):
return "TINYINT"
if tdSql.cursor.istype(col, "SMALLINT"):
return "SMALLINT"
if tdSql.cursor.istype(col, "FLOAT"):
return "FLOAT"
if tdSql.cursor.istype(col, "DOUBLE"):
return "DOUBLE"
if tdSql.cursor.istype(col, "BINARY"):
return "BINARY"
if tdSql.cursor.istype(col, "NCHAR"):
return "NCHAR"
if tdSql.cursor.istype(col, "TIMESTAMP"):
return "TIMESTAMP"
if tdSql.cursor.istype(col, "JSON"):
return "JSON"
if tdSql.cursor.istype(col, "TINYINT UNSIGNED"):
return "TINYINT UNSIGNED"
if tdSql.cursor.istype(col, "SMALLINT UNSIGNED"):
return "SMALLINT UNSIGNED"
if tdSql.cursor.istype(col, "INT UNSIGNED"):
return "INT UNSIGNED"
if tdSql.cursor.istype(col, "BIGINT UNSIGNED"):
return "BIGINT UNSIGNED"
def leastsquares_check(self): def leastsquares_check(self):
current_sqls, err_sqls = self.sql_list() current_sqls, err_sqls = self.sql_list()
for i in range(len(err_sqls)): for i in range(len(err_sqls)):

View File

@ -159,38 +159,6 @@ class TDTestCase:
# return filter(None, sqls) # return filter(None, sqls)
return list(filter(None, sqls)) return list(filter(None, sqls))
def __get_type(self, col):
if tdSql.cursor.istype(col, "BOOL"):
return "BOOL"
if tdSql.cursor.istype(col, "INT"):
return "INT"
if tdSql.cursor.istype(col, "BIGINT"):
return "BIGINT"
if tdSql.cursor.istype(col, "TINYINT"):
return "TINYINT"
if tdSql.cursor.istype(col, "SMALLINT"):
return "SMALLINT"
if tdSql.cursor.istype(col, "FLOAT"):
return "FLOAT"
if tdSql.cursor.istype(col, "DOUBLE"):
return "DOUBLE"
if tdSql.cursor.istype(col, "BINARY"):
return "BINARY"
if tdSql.cursor.istype(col, "NCHAR"):
return "NCHAR"
if tdSql.cursor.istype(col, "TIMESTAMP"):
return "TIMESTAMP"
if tdSql.cursor.istype(col, "JSON"):
return "JSON"
if tdSql.cursor.istype(col, "TINYINT UNSIGNED"):
return "TINYINT UNSIGNED"
if tdSql.cursor.istype(col, "SMALLINT UNSIGNED"):
return "SMALLINT UNSIGNED"
if tdSql.cursor.istype(col, "INT UNSIGNED"):
return "INT UNSIGNED"
if tdSql.cursor.istype(col, "BIGINT UNSIGNED"):
return "BIGINT UNSIGNED"
def spread_check(self): def spread_check(self):
sqls = self.sql_list() sqls = self.sql_list()
tdLog.printNoPrefix("===step 1: curent case, must return query OK") tdLog.printNoPrefix("===step 1: curent case, must return query OK")