update_data.py 15.7 KB
Newer Older
J
jiacy-jcy 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
###################################################################
#           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 -*-

J
update  
jiacy-jcy 已提交
14
from optparse import Values
J
jiacy-jcy 已提交
15 16 17 18 19 20 21
import random
import string
from util import constant
from util.log import *
from util.cases import *
from util.sql import *
from util.common import *
J
update  
jiacy-jcy 已提交
22
from util.sqlset import TDSetSql
J
jiacy-jcy 已提交
23 24 25 26
class TDTestCase:
    def init(self, conn, logSql):
        tdLog.debug("start to execute %s" % __file__)
        tdSql.init(conn.cursor())
J
update  
jiacy-jcy 已提交
27
        self.setsql = TDSetSql()
J
jiacy-jcy 已提交
28 29 30
        self.dbname = 'db_test'
        self.ntbname = 'ntb'
        self.stbname = 'stb'
J
update  
jiacy-jcy 已提交
31
        self.ctbname = 'ctb'
J
jiacy-jcy 已提交
32
        self.ts = 1537146000000
J
jiacy-jcy 已提交
33
        self.str_length = 20
J
jiacy-jcy 已提交
34 35 36 37 38 39 40 41 42 43 44 45
        self.column_dict = {
            'col1': 'tinyint',
            'col2': 'smallint',
            'col3': 'int',
            'col4': 'bigint',
            'col5': 'tinyint unsigned',
            'col6': 'smallint unsigned',
            'col7': 'int unsigned',
            'col8': 'bigint unsigned',
            'col9': 'float',
            'col10': 'double',
            'col11': 'bool',
J
jiacy-jcy 已提交
46 47
            'col12': f'binary({self.str_length})',
            'col13': f'nchar({self.str_length})',
J
jiacy-jcy 已提交
48 49
            'col_ts'  : 'timestamp'
        }
J
update  
jiacy-jcy 已提交
50 51 52 53 54 55 56 57 58 59 60 61 62
        self.tinyint = None
        self.smallint = None
        self.int = None
        self.bigint = None
        self.untinyint = None
        self.unsmallint = None
        self.unint = None
        self.unbigint = None
        self.bool = None
        self.float = None
        self.double = None
        self.binary = None
        self.tnchar = None
J
jiacy-jcy 已提交
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
    def insert_base_data(self,col_type,tbname,value=None):
        if value == None:
            if col_type.lower() == 'tinyint':
                tdSql.execute(f'insert into {tbname} values({self.ts},{self.tinyint})')
            elif col_type.lower() == 'smallint':
                tdSql.execute(f'insert into {tbname} values({self.ts},{self.smallint})')
            elif col_type.lower() == 'int':
                tdSql.execute(f'insert into {tbname} values({self.ts},{self.int})')
            elif col_type.lower() == 'bigint':
                tdSql.execute(f'insert into {tbname} values({self.ts},{self.bigint})')
            elif col_type.lower() == 'tinyint unsigned':
                tdSql.execute(f'insert into {tbname} values({self.ts},{self.untinyint})')
            elif col_type.lower() == 'smallint unsigned':
                tdSql.execute(f'insert into {tbname} values({self.ts},{self.unsmallint})')
            elif col_type.lower() == 'int unsigned':
                tdSql.execute(f'insert into {tbname} values({self.ts},{self.unint})')
            elif col_type.lower() == 'bigint unsigned':
                tdSql.execute(f'insert into {tbname} values({self.ts},{self.unbigint})')
            elif col_type.lower() == 'bool':
                tdSql.execute(f'insert into {tbname} values({self.ts},{self.bool})')    
            elif col_type.lower() == 'float':
                tdSql.execute(f'insert into {tbname} values({self.ts},{self.float})')      
            elif col_type.lower() == 'double':
                tdSql.execute(f'insert into {tbname} values({self.ts},{self.double})')
            elif 'binary' in col_type.lower():
                tdSql.execute(f'insert into {tbname} values({self.ts},"{self.binary}")')
            elif 'nchar' in col_type.lower():
                tdSql.execute(f'insert into {tbname} values({self.ts},"{self.nchar}")')   
J
update  
jiacy-jcy 已提交
91
    def data_check(self,tbname,col_name,col_type,value):
J
jiacy-jcy 已提交
92 93 94 95 96 97 98 99
        tdSql.query(f'select {col_name} from {tbname}')
        if col_type.lower() == 'float' or col_type.lower() == 'double':
            if abs(tdSql.queryResult[0][0] - value) / value <= 0.0001:
                tdSql.checkEqual(tdSql.queryResult[0][0],tdSql.queryResult[0][0])
            else:
                tdLog.exit(f'{col_name} data check failure')
        else:
            tdSql.checkEqual(tdSql.queryResult[0][0],value)
J
update  
jiacy-jcy 已提交
100 101 102 103 104 105 106
    def update_and_check_data(self,tbname,col_name,col_type,value,dbname):
        if 'binary' in col_type.lower() or 'nchar' in col_type.lower():
            tdSql.execute(f'insert into {tbname} values({self.ts},"{value}")')
        else:
            tdSql.execute(f'insert into {tbname} values({self.ts},{value})')
        self.data_check(tbname,col_name,col_type,value)
        tdSql.execute(f'flush database {dbname}')
J
update  
jiacy-jcy 已提交
107
        tdSql.execute('reset query cache')
J
update  
jiacy-jcy 已提交
108
        self.data_check(tbname,col_name,col_type,value)
J
update  
jiacy-jcy 已提交
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
    def error_check(self,tbname,column_dict,tb_type=None,stbname=None):
        str_length = self.str_length+1
        for col_name,col_type in column_dict.items():
            if tb_type == 'ntb':
                tdSql.execute(f'create table {tbname} (ts timestamp,{col_name} {col_type})')
            elif tb_type == 'ctb':
                tdSql.execute(f'create table {stbname} (ts timestamp,{col_name} {col_type}) tags(t0 int)')
                tdSql.execute(f'create table {tbname} using {stbname} tags(1)')
            self.insert_base_data(col_name,tbname)
            if col_type.lower() == 'double':
                for error_value in [tdCom.getLongName(self.str_length),True,False,1.1*constant.DOUBLE_MIN,1.1*constant.DOUBLE_MAX]:
                    tdSql.error(f'insert into {tbname} values({self.ts},{error_value})')
            elif col_type.lower() == 'float':
                for error_value in [tdCom.getLongName(self.str_length),True,False,1.1*constant.FLOAT_MIN,1.1*constant.FLOAT_MAX]:
                    tdSql.error(f'insert into {tbname} values({self.ts},{error_value})')
            elif 'binary' in col_type.lower() or 'nchar' in col_type.lower():
                for error_value in [tdCom.getLongName(str_length)]:
                    tdSql.error(f'insert into {tbname} values({self.ts},"{error_value}")')
            elif col_type.lower() == 'bool':
                for error_value in [tdCom.getLongName(self.str_length)]:
                    tdSql.error(f'insert into {tbname} values({self.ts},{error_value})')
            elif col_type.lower() == 'tinyint':
                for error_value in [constant.TINYINT_MIN-1,constant.TINYINT_MAX+1,random.uniform(constant.FLOAT_MIN,constant.FLOAT_MAX),tdCom.getLongName(self.str_length),True,False]:
                    tdSql.error(f'insert into {tbname} values({self.ts},{error_value})')
            elif col_type.lower() == 'smallint':
                for error_value in [constant.SMALLINT_MIN-1,constant.SMALLINT_MAX+1,random.uniform(constant.FLOAT_MIN,constant.FLOAT_MAX),tdCom.getLongName(self.str_length),True,False]:
                    tdSql.error(f'insert into {tbname} values({self.ts},{error_value})')
            elif col_type.lower() == 'int':
                for error_value in [constant.INT_MIN-1,constant.INT_MAX+1,random.uniform(constant.FLOAT_MIN,constant.FLOAT_MAX),tdCom.getLongName(self.str_length),True,False]:
                    tdSql.error(f'insert into {tbname} values({self.ts},{error_value})')
            elif col_type.lower() == 'bigint':
                for error_value in [constant.BIGINT_MIN-1,constant.BIGINT_MAX+1,random.uniform(constant.FLOAT_MIN,constant.FLOAT_MAX),tdCom.getLongName(self.str_length),True,False]:
                    tdSql.error(f'insert into {tbname} values({self.ts},{error_value})')
            elif col_type.lower() == 'tinyint unsigned':
                for error_value in [constant.TINYINT_UN_MIN-1,constant.TINYINT_UN_MAX+1,random.uniform(constant.FLOAT_MIN,constant.FLOAT_MAX),tdCom.getLongName(self.str_length),True,False]:
                    tdSql.error(f'insert into {tbname} values({self.ts},{error_value})')     
            elif col_type.lower() == 'smallint unsigned':
                for error_value in [constant.SMALLINT_UN_MIN-1,constant.SMALLINT_UN_MAX+1,random.uniform(constant.FLOAT_MIN,constant.FLOAT_MAX),tdCom.getLongName(self.str_length),True,False]:
                    tdSql.error(f'insert into {tbname} values({self.ts},{error_value})')
            elif col_type.lower() == 'int unsigned':
                for error_value in [constant.INT_UN_MIN-1,constant.INT_UN_MAX+1,random.uniform(constant.FLOAT_MIN,constant.FLOAT_MAX),tdCom.getLongName(self.str_length),True,False]:
                    tdSql.error(f'insert into {tbname} values({self.ts},{error_value})')
            elif col_type.lower() == 'bigint unsigned':
                for error_value in [constant.BIGINT_UN_MIN-1,constant.BIGINT_UN_MAX+1,random.uniform(constant.FLOAT_MIN,constant.FLOAT_MAX),tdCom.getLongName(self.str_length),True,False]:
                    tdSql.error(f'insert into {tbname} values({self.ts},{error_value})')           
            tdSql.execute(f'drop table {tbname}')
            if tb_type == 'ctb':
                tdSql.execute(f'drop table {stbname}')
    def update_data_check(self,tbname,column_dict,dbname,tb_type=None,stbname=None):
J
jiacy-jcy 已提交
158 159 160 161 162 163 164 165 166 167 168
        up_tinyint = random.randint(constant.TINYINT_MIN,constant.TINYINT_MAX)
        up_smallint = random.randint(constant.SMALLINT_MIN,constant.SMALLINT_MAX)
        up_int = random.randint(constant.INT_MIN,constant.INT_MAX)
        up_bigint = random.randint(constant.BIGINT_MIN,constant.BIGINT_MAX)
        up_untinyint = random.randint(constant.TINYINT_UN_MIN,constant.TINYINT_UN_MAX)
        up_unsmallint = random.randint(constant.SMALLINT_UN_MIN,constant.SMALLINT_UN_MAX)
        up_unint = random.randint(constant.INT_UN_MIN,constant.INT_MAX)
        up_unbigint = random.randint(constant.BIGINT_UN_MIN,constant.BIGINT_UN_MAX)
        up_bool = random.randint(0,100)%2
        up_float = random.uniform(constant.FLOAT_MIN,constant.FLOAT_MAX)
        up_double = random.uniform(constant.DOUBLE_MIN*(1E-300),constant.DOUBLE_MAX*(1E-300))
J
jiacy-jcy 已提交
169 170
        binary_length = random.randint(0,self.str_length)
        nchar_length = random.randint(0,self.str_length)
J
jiacy-jcy 已提交
171 172
        up_binary = tdCom.getLongName(binary_length)
        up_nchar = tdCom.getLongName(nchar_length)
J
update  
jiacy-jcy 已提交
173 174 175 176 177 178 179 180
        
        for col_name,col_type in column_dict.items():
            if tb_type == 'ntb':
                tdSql.execute(f'create table {tbname} (ts timestamp,{col_name} {col_type})')
            elif tb_type == 'ctb':
                tdSql.execute(f'create table {stbname} (ts timestamp,{col_name} {col_type}) tags(t0 int)')
                tdSql.execute(f'create table {tbname} using {stbname} tags(1)')
            self.insert_base_data(col_name,tbname)
J
jiacy-jcy 已提交
181
            if col_type.lower() == 'tinyint':
J
update  
jiacy-jcy 已提交
182
                self.update_and_check_data(tbname,col_name,col_type,up_tinyint,dbname)
J
jiacy-jcy 已提交
183
            elif col_type.lower() == 'smallint':
J
update  
jiacy-jcy 已提交
184
                self.update_and_check_data(tbname,col_name,col_type,up_smallint,dbname)
J
jiacy-jcy 已提交
185
            elif col_type.lower() == 'int':
J
update  
jiacy-jcy 已提交
186
                self.update_and_check_data(tbname,col_name,col_type,up_int,dbname)
J
jiacy-jcy 已提交
187
            elif col_type.lower() == 'bigint':
J
update  
jiacy-jcy 已提交
188
                self.update_and_check_data(tbname,col_name,col_type,up_bigint,dbname)
J
jiacy-jcy 已提交
189
            elif col_type.lower() == 'tinyint unsigned':
J
update  
jiacy-jcy 已提交
190
                self.update_and_check_data(tbname,col_name,col_type,up_untinyint,dbname)
J
jiacy-jcy 已提交
191
            elif col_type.lower() == 'smallint unsigned':
J
update  
jiacy-jcy 已提交
192
                self.update_and_check_data(tbname,col_name,col_type,up_unsmallint,dbname)
J
jiacy-jcy 已提交
193
            elif col_type.lower() == 'int unsigned':
J
update  
jiacy-jcy 已提交
194
                self.update_and_check_data(tbname,col_name,col_type,up_unint,dbname)
J
jiacy-jcy 已提交
195
            elif col_type.lower() == 'bigint unsigned':
J
update  
jiacy-jcy 已提交
196
                self.update_and_check_data(tbname,col_name,col_type,up_unbigint,dbname)
J
jiacy-jcy 已提交
197
            elif col_type.lower() == 'bool':
J
update  
jiacy-jcy 已提交
198
                self.update_and_check_data(tbname,col_name,col_type,up_bool,dbname)    
J
jiacy-jcy 已提交
199
            elif col_type.lower() == 'float':
J
update  
jiacy-jcy 已提交
200
                self.update_and_check_data(tbname,col_name,col_type,up_float,dbname)      
J
jiacy-jcy 已提交
201
            elif col_type.lower() == 'double':
J
update  
jiacy-jcy 已提交
202
                self.update_and_check_data(tbname,col_name,col_type,up_double,dbname)
J
jiacy-jcy 已提交
203
            elif 'binary' in col_type.lower():
J
update  
jiacy-jcy 已提交
204
                self.update_and_check_data(tbname,col_name,col_type,up_binary,dbname)
J
jiacy-jcy 已提交
205
            elif 'nchar' in col_type.lower():
J
update  
jiacy-jcy 已提交
206 207 208
                self.update_and_check_data(tbname,col_name,col_type,up_nchar,dbname)
            tdSql.execute(f'insert into {tbname} values({self.ts},null)')
            tdSql.query(f'select {col_name} from {tbname}')
J
jiacy-jcy 已提交
209
            tdSql.checkEqual(tdSql.queryResult[0][0],None)
J
update  
jiacy-jcy 已提交
210
            tdSql.execute(f'flush database {self.dbname}')
J
update  
jiacy-jcy 已提交
211 212
            tdSql.execute('reset query cache')
            tdSql.query(f'select {col_name} from {tbname}')
J
update  
jiacy-jcy 已提交
213
            tdSql.checkEqual(tdSql.queryResult[0][0],None)
J
update  
jiacy-jcy 已提交
214 215 216 217
            tdSql.execute(f'drop table {tbname}')
            if tb_type == 'ctb':
                tdSql.execute(f'drop table {stbname}')
    def update_check(self):
J
jiacy-jcy 已提交
218 219 220
        tdSql.execute(f'drop database if exists {self.dbname}')
        tdSql.execute(f'create database {self.dbname}')
        tdSql.execute(f'use {self.dbname}')
J
update  
jiacy-jcy 已提交
221
        self.update_data_check(self.ntbname,self.column_dict,self.dbname,'ntb')
J
jiacy-jcy 已提交
222 223 224
        for col_name,col_type in self.column_dict.items():
            tdSql.execute(f'create table {self.ntbname} (ts timestamp,{col_name} {col_type})')
            self.insert_base_data(col_name,self.ntbname)
J
update  
jiacy-jcy 已提交
225 226 227 228 229 230 231 232
            if 'binary' in col_type.lower():
                up_binary = tdCom.getLongName(self.str_length+1)
                tdSql.execute(f'alter table {self.ntbname} modify column {col_name} binary({self.str_length+1})')
                self.update_and_check_data(self.ntbname,col_name,col_type,up_binary,self.dbname)
            elif 'nchar' in col_type.lower():
                up_nchar = tdCom.getLongName(self.str_length+1)
                tdSql.execute(f'alter table {self.ntbname} modify column {col_name} nchar({self.str_length+1})')
                self.update_and_check_data(self.ntbname,col_name,col_type,up_nchar,self.dbname)
J
jiacy-jcy 已提交
233
            tdSql.execute(f'drop table {self.ntbname}')
J
update  
jiacy-jcy 已提交
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
        
        self.update_data_check(self.ctbname,self.column_dict,self.dbname,'ctb',self.stbname)
        for col_name,col_type in self.column_dict.items():
            tdSql.execute(f'create table {self.stbname} (ts timestamp,{col_name} {col_type}) tags(t0 int)')
            tdSql.execute(f'create table {self.ctbname} using {self.stbname} tags(1)')
            self.insert_base_data(col_name,self.ctbname)
            if 'binary' in col_type.lower():
                up_binary = tdCom.getLongName(self.str_length+1)
                tdSql.execute(f'alter table {self.stbname} modify column {col_name} binary({self.str_length+1})')
                self.update_and_check_data(self.ctbname,col_name,col_type,up_binary,self.dbname)
            elif 'nchar' in col_type.lower():
                up_nchar = tdCom.getLongName(self.str_length+1)
                tdSql.execute(f'alter table {self.stbname} modify column {col_name} nchar({self.str_length+1})')
                self.update_and_check_data(self.ctbname,col_name,col_type,up_nchar,self.dbname)
            tdSql.execute(f'drop table {self.stbname}')
J
jiacy-jcy 已提交
249

J
update  
jiacy-jcy 已提交
250 251 252 253 254 255 256
                
    def update_check_error(self):
        tdSql.execute(f'drop database if exists {self.dbname}')
        tdSql.execute(f'create database {self.dbname}')
        tdSql.execute(f'use {self.dbname}')
        self.error_check(self.ntbname,self.column_dict,'ntb')
        self.error_check(self.ctbname,self.column_dict,'ctb',self.stbname)
J
jiacy-jcy 已提交
257

J
update  
jiacy-jcy 已提交
258 259 260 261
    def run(self):
        self.update_check()
        self.update_check_error()
        
J
jiacy-jcy 已提交
262 263 264 265 266 267
    def stop(self):
        tdSql.close()
        tdLog.success("%s successfully executed" % __file__)

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