homework-jianmu/tests/system-test/1-insert/composite_primary_key_creat...

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())