225 lines
10 KiB
Python
225 lines
10 KiB
Python
from enum import Enum
|
|
|
|
from util.log import *
|
|
from util.sql import *
|
|
from util.cases import *
|
|
|
|
|
|
class IllegalDataType(Enum):
|
|
NULL = 'null'
|
|
BOOL = 'bool'
|
|
TINYINT = 'tinyint'
|
|
SMALLINT = 'smallint'
|
|
FLOAT = 'float'
|
|
DOUBLE = 'double'
|
|
TIMESTAMP = 'timestamp'
|
|
NCHAR = 'nchar(100)'
|
|
UTINYINT = 'tinyint unsigned'
|
|
USMALLINT = 'smallint unsigned'
|
|
JSON = 'json'
|
|
VARBINARY = 'varbinary(100)'
|
|
DECIMAL = 'decimal'
|
|
BLOB = 'blob'
|
|
MEDIUMBLOB = 'mediumblob'
|
|
GEOMETRY = 'geometry(512)'
|
|
EMPTY = '\'\''
|
|
SPACE = '\' \''
|
|
|
|
|
|
class LegalDataType(Enum):
|
|
INT = 'INT'
|
|
UINT = 'INT UNSIGNED'
|
|
BIGINT = 'BIGINT'
|
|
UBIGINT = 'BIGINT UNSIGNED'
|
|
VARCHAR = 'VARCHAR(100)'
|
|
BINARY = 'BINARY(100)'
|
|
|
|
class LegalSpell(Enum):
|
|
CASE1 = 'primary key'
|
|
CASE2 = 'PRIMARY KEY'
|
|
CASE3 = 'Primary Key'
|
|
CASE4 = 'PriMary keY'
|
|
|
|
class IllegalSpell(Enum):
|
|
CASE1 = 'primary'
|
|
CASE2 = 'key'
|
|
CASE3 = 'primay key'
|
|
CASE4 = 'primary ky'
|
|
CASE5 = 'primarykey'
|
|
CASE6 = 'key primary'
|
|
CASE7 = 'primay key primay key'
|
|
|
|
|
|
class TableType(Enum):
|
|
SUPERTABLE = 0
|
|
CHILDTABLE = 1
|
|
NORNALTABLE = 2
|
|
|
|
SHOW_LOG = True
|
|
|
|
class TDTestCase:
|
|
|
|
def init(self, conn, logSql, replicaVar=1):
|
|
self.replicaVar = int(replicaVar)
|
|
self.database = "db_create_composite_primary_key"
|
|
tdLog.debug(f"start to excute {__file__}")
|
|
tdSql.init(conn.cursor(), True)
|
|
|
|
def prepare_db(self):
|
|
tdSql.execute(f"drop database if exists {self.database}")
|
|
tdSql.execute(f"create database {self.database}")
|
|
tdSql.execute(f"use {self.database}")
|
|
|
|
def check_pk_definition(self, table_name: str, d_type: LegalDataType, t_type: TableType):
|
|
tdSql.query(f"describe {table_name}", show=SHOW_LOG)
|
|
tdSql.checkData(1, 3, "PRIMARY KEY")
|
|
|
|
if d_type == LegalDataType.BINARY:
|
|
d_type = LegalDataType.VARCHAR
|
|
|
|
if t_type == TableType.SUPERTABLE:
|
|
expected_value = f"CREATE STABLE `{table_name}` (`ts` TIMESTAMP ENCODE 'delta-i' COMPRESS 'lz4' LEVEL 'medium', `pk` {d_type.value} ENCODE 'simple8b' COMPRESS 'lz4' LEVEL 'medium' PRIMARY KEY, `c2` INT ENCODE 'simple8b' COMPRESS 'lz4' LEVEL 'medium') TAGS (`engine` INT)"
|
|
elif t_type == TableType.NORNALTABLE:
|
|
expected_value = f"CREATE TABLE `{table_name}` (`ts` TIMESTAMP ENCODE 'delta-i' COMPRESS 'lz4' LEVEL 'medium', `pk` {d_type.value} ENCODE 'simple8b' COMPRESS 'lz4' LEVEL 'medium' PRIMARY KEY, `c2` INT ENCODE 'simple8b' COMPRESS 'lz4' LEVEL 'medium')"
|
|
|
|
tdSql.query(f"show create table {table_name}", show=SHOW_LOG)
|
|
result = tdSql.queryResult
|
|
|
|
tdSql.checkEqual("PRIMARY KEY" in result[0][1], True)
|
|
|
|
def test_pk_datatype_legal(self, stable_name: str, ctable_name: str, ntable_name: str, dtype: LegalDataType):
|
|
# create super table and child table
|
|
tdSql.execute(f"drop table if exists {stable_name}", show=SHOW_LOG)
|
|
tdSql.execute(f"drop table if exists {ntable_name}", show=SHOW_LOG)
|
|
|
|
tdSql.execute(f"create table {stable_name} (ts timestamp, pk {dtype.value} primary key, c2 int) tags (engine int)", show=SHOW_LOG)
|
|
self.check_pk_definition(stable_name, dtype, TableType.SUPERTABLE)
|
|
|
|
tdSql.execute(f"create table {ctable_name} using {stable_name} tags (0)", show=SHOW_LOG)
|
|
tdSql.execute(f"create table {ctable_name}_1 using {stable_name} tags (1) {ctable_name}_2 using {stable_name} tags (2) {ctable_name}_3 using {stable_name} tags (3)", show=SHOW_LOG)
|
|
|
|
# create normal table
|
|
tdSql.execute(f"create table {ntable_name} (ts timestamp, pk {dtype.value} primary key, c2 int)", show=SHOW_LOG)
|
|
self.check_pk_definition(ntable_name, dtype, TableType.NORNALTABLE)
|
|
|
|
def test_pk_datatype_illegal(self, stable_name: str, ntable_name: str, dtype: LegalDataType):
|
|
# create super table and child table
|
|
tdSql.execute(f"drop table if exists {stable_name}", show=SHOW_LOG)
|
|
tdSql.execute(f"drop table if exists {ntable_name}", show=SHOW_LOG)
|
|
|
|
tdSql.error(f"create table {stable_name} (ts timestamp, pk {dtype.value} primary key, c2 int) tags (engine int)", show=SHOW_LOG)
|
|
|
|
# create normal table
|
|
tdSql.error(f"create table {ntable_name} (ts timestamp, pk {dtype.value} primary key, c2 int)", show=SHOW_LOG)
|
|
|
|
def test_pk_spell_legal(self, stable_name: str, ntable_name: str, pk_spell: LegalSpell):
|
|
# create super table and child table
|
|
tdSql.execute(f"drop table if exists {stable_name}", show=SHOW_LOG)
|
|
tdSql.execute(f"drop table if exists {ntable_name}", show=SHOW_LOG)
|
|
|
|
tdSql.execute(f"create table {stable_name} (ts timestamp, pk int {pk_spell.value}, c2 int) tags (engine int)", show=SHOW_LOG)
|
|
|
|
# create normal table
|
|
tdSql.execute(f"create table {ntable_name} (ts timestamp, pk int {pk_spell.value}, c2 int)", show=SHOW_LOG)
|
|
|
|
def test_pk_spell_illegal(self, stable_name: str, ntable_name: str, pk_spell: LegalSpell):
|
|
# create super table and child table
|
|
tdSql.execute(f"drop table if exists {stable_name}", show=SHOW_LOG)
|
|
tdSql.execute(f"drop table if exists {ntable_name}", show=SHOW_LOG)
|
|
|
|
tdSql.error(f"create table {stable_name} (ts timestamp, pk int {pk_spell.value}, c2 int) tags (engine int)", show=SHOW_LOG)
|
|
|
|
# create normal table
|
|
tdSql.error(f"create table {ntable_name} (ts timestamp, pk int {pk_spell.value}, c2 int)", show=SHOW_LOG)
|
|
|
|
def test_update_pk(self, table_name: str, t_type: TableType):
|
|
# create super table and child table
|
|
tdSql.execute(f"drop table if exists {table_name}", show=SHOW_LOG)
|
|
|
|
if t_type == TableType.SUPERTABLE:
|
|
tdSql.execute(f"create table {table_name} (ts timestamp, c2 int) tags (engine int)", show=SHOW_LOG)
|
|
elif t_type == TableType.NORNALTABLE:
|
|
# create normal table
|
|
tdSql.execute(f"create table {table_name} (ts timestamp, c2 int)", show=SHOW_LOG)
|
|
|
|
tdSql.error(f"alter table {table_name} add column pk varchar(100) primary key", show=SHOW_LOG)
|
|
|
|
tdSql.execute(f"drop table if exists {table_name}", show=SHOW_LOG)
|
|
if t_type == TableType.SUPERTABLE:
|
|
tdSql.execute(f"create table {table_name} (ts timestamp, pk varchar(200) primary key, c2 int) tags (engine int)", show=SHOW_LOG)
|
|
elif t_type == TableType.NORNALTABLE:
|
|
# create normal table
|
|
tdSql.execute(f"create table {table_name} (ts timestamp, pk varchar(200) primary key, c2 int)", show=SHOW_LOG)
|
|
|
|
tdSql.error(f"alter table {table_name} add column new_pk varchar(20) primary key", show=SHOW_LOG)
|
|
for date_type in IllegalDataType.__members__.items():
|
|
tdSql.error(f"alter table {table_name} modify column pk {date_type[1].value}", show=SHOW_LOG)
|
|
for date_type in LegalDataType.__members__.items():
|
|
tdSql.error(f"alter table {table_name} modify column pk {date_type[1].value}", show=SHOW_LOG)
|
|
|
|
tdSql.error(f"alter table {table_name} modify column pk varchar(300)", show=SHOW_LOG)
|
|
tdSql.error(f"alter table {table_name} rename column pk new_pk", show=SHOW_LOG)
|
|
tdSql.error(f"alter table {table_name} drop column pk", show=SHOW_LOG)
|
|
|
|
def run(self):
|
|
tdSql.prepare(replica = self.replicaVar)
|
|
self.prepare_db()
|
|
|
|
# 1.check legal data type
|
|
for date_type in LegalDataType.__members__.items():
|
|
self.test_pk_datatype_legal('s_table', 'c_table', 'n_table', date_type[1])
|
|
|
|
# 2.check illegal data type
|
|
for date_type in IllegalDataType.__members__.items():
|
|
self.test_pk_datatype_illegal('s_table', 'n_table', date_type[1])
|
|
|
|
# 3.check legal spell
|
|
for date_type in LegalSpell.__members__.items():
|
|
self.test_pk_spell_legal('s_table', 'n_table', date_type[1])
|
|
|
|
# 4.check illegal spell
|
|
for date_type in IllegalSpell.__members__.items():
|
|
self.test_pk_spell_illegal('s_table', 'n_table', date_type[1])
|
|
|
|
# 5.only define ts and pk columns
|
|
# create super table and child table
|
|
tdSql.execute(f"drop table if exists s_table", show=SHOW_LOG)
|
|
tdSql.execute(f"drop table if exists n_table", show=SHOW_LOG)
|
|
|
|
tdSql.execute(f"create table s_table (ts timestamp, pk int primary key) tags (engine int)", show=SHOW_LOG)
|
|
tdSql.execute(f"create table c_table using s_table tags (1)", show=SHOW_LOG)
|
|
tdSql.execute(f"insert into c_table values(now, 1)", show=SHOW_LOG)
|
|
tdSql.query(f"select * from s_table", show=SHOW_LOG)
|
|
tdSql.checkRows(1)
|
|
|
|
# create normal table
|
|
tdSql.execute(f"create table n_table (ts timestamp, pk int primary key)", show=SHOW_LOG)
|
|
tdSql.execute(f"insert into n_table values(now, 1)", show=SHOW_LOG)
|
|
tdSql.query(f"select * from n_table", show=SHOW_LOG)
|
|
tdSql.checkRows(1)
|
|
|
|
# 6.mutiple pk & pk not defined as sencod column
|
|
tdSql.execute(f"drop table if exists s_table", show=SHOW_LOG)
|
|
tdSql.execute(f"drop table if exists n_table", show=SHOW_LOG)
|
|
|
|
# create super table
|
|
tdSql.error(f"create table s_table (ts timestamp, c1 int, pk1 int primary key) tags (engine int)", show=SHOW_LOG)
|
|
tdSql.error(f"create table s_table (ts timestamp, pk1 int primary key, pk2 int primary key) tags (engine int)", show=SHOW_LOG)
|
|
tdSql.error(f"create table s_table (ts timestamp, pk1 int primary key, c2 int, pk2 int primary key) tags (engine int)", show=SHOW_LOG)
|
|
# create normal table
|
|
tdSql.error(f"create table n_table (ts timestamp, c1 int, pk1 int primary key)", show=SHOW_LOG)
|
|
tdSql.error(f"create table n_table (ts timestamp, pk1 int primary key, pk2 int primary key)", show=SHOW_LOG)
|
|
tdSql.error(f"create table n_table (ts timestamp, pk1 int primary key, c2 int, pk2 int primary key)", show=SHOW_LOG)
|
|
|
|
# 7.add\update\delete pk column is not support
|
|
self.test_update_pk('s_table', TableType.SUPERTABLE)
|
|
self.test_update_pk('n_table', TableType.NORNALTABLE)
|
|
|
|
def stop(self):
|
|
tdSql.close()
|
|
tdLog.success(f"{__file__} successfully executed")
|
|
|
|
|
|
tdCases.addLinux(__file__, TDTestCase())
|
|
tdCases.addWindows(__file__, TDTestCase())
|