#!/bin/env python # -*- coding: utf-8 -*- # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. """ /*************************************************************************** * * @file test_sys_time_zone.py * **************************************************************************/ """ import os import sys import time import datetime import pytest from data import partition as DATA sys.path.append("../") from lib import palo_config from lib import palo_client import pymysql from lib import util from lib import palo_job from lib import common config = palo_config.config broker_name = config.broker_name broker_property = config.broker_property broker_info = palo_config.broker_info repo_location = config.repo_location LOG = palo_client.LOG L = palo_client.L repo_name = "backup_restore_repo_zone" def setup_module(): """ setUp """ global Palo_client global mysql_cursor Palo_client = palo_client.PaloClient(config.fe_host, config.fe_query_port, config.palo_db, config.fe_user, config.fe_password) Palo_client.init() master = Palo_client.get_master_host() Palo_client = common.get_client(master) connect = pymysql.connect(host=config.mysql_host, port=config.mysql_port,\ user=config.mysql_user, passwd=config.mysql_password) mysql_cursor = connect.cursor() try: ret = Palo_client.create_repository(repo_name, broker_name, repo_location=repo_location, repo_properties=broker_property) assert ret, "palo create_repository failed" except Exception as e: print(str(e)) sql = "set time_zone = '+08:00'" check2(sql) def mysql_execute(sql, db=None): """ 连接mysql执行语句 """ try: if db is None: db = os.environ["MYSQL_DB"] mysql_cursor.execute("use %s" % db) mysql_cursor.execute(sql) LOG.info(L('mysql execute sql', db=db, sql=sql)) return mysql_cursor.fetchall() except Exception as error: LOG.error(L('error', error=error)) assert False, "execute error. %s" % str(error) def get_timestamp(res): """将字符串转为时间戳, '18:01:10' -> 数字时间戳,这样好比较大小,不存在两个时间差1s,分钟对应的数值差1""" res1 = str(res[0][0]) timeArray = time.strptime(res1, "%H:%M:%S") timestamp = time.mktime(timeArray) LOG.info(L('get_timestamp, input, output', res=res, timestamp=timestamp)) return timestamp def check2(psql, msql=None): """palo & mysql execute sql :sql: execute sql :msql: mysql 执行的sql """ if not msql: msql = psql LOG.info(L('palo sql', palo_sql=psql)) res1= Palo_client.execute(psql) LOG.info(L('mysql sql', mysql_sql=msql)) res2 = mysql_execute(msql) if "CURTIME" in psql: ##可能会差1s左右,故转为时间戳个数 timestamp_res1 = get_timestamp(res1) timestamp_res2 = get_timestamp(res2) LOG.info(L('CURTIME sql : palo res; mysql res', \ timestamp_res1=timestamp_res1, timestamp_res2=timestamp_res2)) assert abs(timestamp_res1 - timestamp_res2) <= 1, "palo %s, mysql %s, \ excepted res1 - res2 <= 1" % (timestamp_res1, timestamp_res2) else: util.check(res1, res2) def show_be_broker_time(): """show be,broker time,把be、broker里和时间相关的变量,非空则放到list里,逐条比较是否相等 show be:LastStartTime:上次启动的时间,不会一直变,格式2019-09-04 20:54:55 show broker:LastStartTime:上次启动的时间,不会一直变,格式2019-09-04 20:54:55 """ be_list = Palo_client.get_alive_backend_list() be_info = be_list[0] list = [] LOG.info(L('be info is', be_info=be_info)) be_start_time = palo_job.BackendProcInfo(be_info).get_backend_start_time() LOG.info(L('palo be start time', start_time=be_start_time)) list.append(be_start_time) broker = Palo_client.get_broker_start_update_time() if broker: LOG.info(L('broker start_time', start_time=broker)) list += [broker] return list def unity_datetime_format(time, snapshot_flag=False): """统一datetime的格式",snapshot_flag是否是snapshot,格式不一样""" LOG.info(L('unity datetime format', time=time, snapshot=snapshot_flag)) try: if snapshot_flag: unity_time = datetime.datetime.strptime('%s' % time, '%Y-%m-%d-%H-%M-%S') else: unity_time = datetime.datetime.strptime('%s' % time, '%Y-%m-%d %H:%M:%S') except ValueError as e: if snapshot_flag: unity_time = datetime.datetime.strptime('%s' % time, '%Y-%m-%d-%H-%M-%S.%f') else: unity_time = datetime.datetime.strptime('%s' % time, '%Y-%m-%d %H:%M:%S.%f') return unity_time def recombinate_time(origin_time, offset_hour, offset_minutes): """在origin_time时间上叠加上offset_time时间 -01:10 和+06:10 距离+08:00的分钟计算方式不一样 """ seconds = 0 if offset_hour < 0: ##+09:10 seconds = (offset_hour * 60 - offset_minutes) * 60 elif offset_hour >= 8: ##-01:10 seconds = (offset_hour * 60 + offset_minutes) * 60 else: ##+06:10 seconds = (offset_hour * 60 - offset_minutes) * 60 offset_time = datetime.timedelta(days=0, seconds=seconds, microseconds=0) assert isinstance(offset_time, datetime.timedelta) offert_time = (origin_time - offset_time).isoformat() try: offert_time = datetime.datetime.strptime(offert_time, '%Y-%m-%dT%H:%M:%S') except ValueError as e: offert_time = datetime.datetime.strptime(offert_time, '%Y-%m-%dT%H:%M:%S.%f') return offert_time def wait_for_integer_min(): """Waiting time to judge in the same minute""" sql = "select SECOND(now())" ret = Palo_client.execute(sql) if int(ret[0][0]) > 50: time.sleep(20) def check2_gap_time_zone(palo_res, mysql_res, zone, snapshot_flag=False): """比较两个tiemdate时间的差;如:2019-09-19 04:05:59 格式 参数:palo_res, mysql_res,要对比的两个时间;zone 新设置的时区值""" res = get_day_and_second(zone) hour = 8 - int(res[0]) second = int(res[1]) for palo_data, mysql_data in zip(palo_res, mysql_res): if palo_data == 'N/A' or palo_data == '': ###没broker时,返回的是N/A assert palo_data == mysql_data, "err: excepted %s == %s" % (palo_data, mysql_data) continue unity_palo = unity_datetime_format(palo_data, snapshot_flag) unity_mysql = unity_datetime_format(mysql_data, snapshot_flag) ##小于+08:00,如+01:10,-03:10. 偏移量是正数 palo_date = recombinate_time(unity_palo, hour, second) assert palo_date == unity_mysql, "res %s, excepted %s" % (palo_date, unity_mysql) def get_day_and_second(date_delta): """从datetime里获取小时和分钟 eg:-08:10,取出 8和10""" if date_delta: res_list = date_delta.split(':') day = res_list[0] second = res_list[1] return day, second return False def backup(repo_name, database_name, table_name, snapshot_label): """创建仓库,备份""" ret = Palo_client.backup(snapshot_label=snapshot_label, backup_list=[table_name], repo_name=repo_name, database_name=database_name, is_wait=True) LOG.info(L("backup res", snapshot_label=snapshot_label, repo_name=repo_name, \ table_name=table_name, res=ret)) assert ret def restore(repo_name, database_name, table_name, snapshot_label): """恢复到新表里""" ##restore new_table_name = table_name + "_new" restore_list = list() restore_list.append('%s AS %s' % (table_name, new_table_name)) ret = Palo_client.restore(snapshot_name=snapshot_label, repo_name=repo_name, restore_list=restore_list, database_name=database_name, is_wait=True) LOG.info(L("restore res", snapshot_label=snapshot_label, repo_name=repo_name, \ table_name=table_name, res=ret)) assert ret # check line1 = 'select * from %s order by k1' % table_name line2 = 'select * from %s order by k1' % new_table_name LOG.info(L('palo sql 1', palo_sql=line1)) ret1 = Palo_client.execute(line1) LOG.info(L('palo sql 2', palo_sql=line2)) ret2 = Palo_client.execute(line2) util.check(ret1, ret2) def get_backup_time(backup_db): """获取备份相关时间信息""" ##backup snapshot_name = '' res_backup = '' time_list = [] res_backup = Palo_client.show_backup(backup_db) LOG.info(L('show backup res', res_backup=res_backup)) assert res_backup backup_info = res_backup[-1] time_list = [palo_job.BackupJob(backup_info).get_create_time(), \ palo_job.BackupJob(backup_info).get_snap_finish_time(),\ palo_job.BackupJob(backup_info).get_upload_finish_time(), \ palo_job.BackupJob(backup_info).get_finished_time()] snapshot_name = palo_job.BackupJob(backup_info).get_snapshotName() return time_list, snapshot_name def get_restore_time(restore_db): """获取备份恢复相关时间信息""" ##restore snapshot_name = '' res_backup = '' time_list = [] res = Palo_client.show_restore(restore_db) LOG.info(L('show RESTORE res', res_restore=res)) assert res time_list += [palo_job.RestoreJob(res[-1]).get_create_time(),\ palo_job.RestoreJob(res[-1]).get_meta_prepare_time(), palo_job.RestoreJob(res[-1]).get_snapshot_finished_time(), palo_job.RestoreJob(res[-1]).get_down_load_finished(), palo_job.RestoreJob(res[-1]).get_finished()] return time_list, snapshot_name def get_repo_time(): """获取备repo相关时间信息""" ##repo time_list = [] res = Palo_client.show_repository() assert res LOG.info(L('show REPOSITORIES res', res=res[0])) time_list = [palo_job.RepoInfo(res[0]).get_create_time()] return time_list, palo_job.RepoInfo(res[0]).get_repo_name() def get_snapshot_time(repo, snapshot_name=None): """获取备snapshot相关时间信息""" snap_res = Palo_client.show_snapshot(repo, snapshot_name) LOG.info(L('show snapshot repo, snapshot_name, res',\ repo=repo, snapshot_name=snapshot_name, res=snap_res)) assert snap_res time_list = [palo_job.SnapshotInfo(snap_res[0]).get_timestamp()] LOG.info(L('get snapshot time', time_list=time_list)) return time_list def create_table(database_name, table_name): """建表""" Palo_client.clean(database_name) Palo_client.create_database(database_name) Palo_client.use(database_name) sql = "drop table if exists %s" % table_name LOG.info(L('palo sql', palo_sql=sql)) res = Palo_client.execute(sql) # 建表 partition_name_list = ['partition_a', 'partition_b', 'partition_c', 'partition_d'] partition_value_list = ['100', '500', '1000', 'MAXVALUE'] partition_info = palo_client.PartitionInfo('k3', partition_name_list, partition_value_list) distribution_type_d = 'HASH(k1, k2, k5)' distribution_info_d = palo_client.DistributionInfo(distribution_type_d, 31) Palo_client.create_table(table_name, DATA.schema_1, partition_info, distribution_info_d) assert Palo_client.show_tables(table_name) for partition_name in partition_name_list: assert Palo_client.get_partition(table_name, partition_name) def test_set_sys_time_zone(): """ { "title": "test_sys_time_zone.test_set_sys_time_zone", "describe": "设置系统变量system_time_zone。系统不允许,会报错", "tag": "function,p1,fuzz" } """ """ 设置系统变量system_time_zone。系统不允许,会报错 """ zone = '+08:00' excepted = "%s variable '%s' is read-only. Use SET %s to assign the value" try: sql = "set system_time_zone = '%s'" % zone res = Palo_client.execute(sql) assert 0 == 1, "palo sql %s shoud not ok" % sql except Exception as err: LOG.info(L('test_set_sys_time_zone err', error=err)) assert excepted in str(err), "diff: res %s, excepted %s" % (err, excepted) try: sql = "set global system_time_zone = '%s'" % zone Palo_client.execute(sql) assert 0 == 1, "palo sql %s shoud not ok" % sql except Exception as err: LOG.info(L('test_set_sys_time_zone err', error=err)) assert excepted in str(err), "diff: res %s, excepted %s" % (err, excepted) def test_set_time_zone(): """ { "title": "test_sys_time_zone.test_set_time_zone", "describe": "设置time_zone变量。测试点:多种方式;与system_time_zone不匹配等", "tag": "function,p1,fuzz" } """ """ 设置time_zone变量。 测试点:多种方式;与system_time_zone不匹配等 """ zone_ok = ['America/Los_Angeles', 'Asia/Shanghai', '-00:00', '+00:00', '-08:00', '+09:00',\ '-08:10', '+08:10', '+12:00', '-12:00'] zone_err = ['met', 'CMT', 'CTT', 'CAT','UTC','utc', 'CST', 'cst', '-12:01',\ '+12:01', '-08:90', '+08:90', '09:00', 'SYSTEM'] for zone in zone_ok: Palo_client.set_time_zone(zone) res_var = Palo_client.show_variables("time_zone") assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone) excepted = "Unknown or incorrect time zone" for zone in zone_err: try: Palo_client.set_time_zone(zone) LOG.error(L('err res', zone=zone)) except Exception as err: assert excepted in str(err), "res %s, excepted %s" % (str(err), excepted) try: Palo_client.set_time_zone(zone) LOG.error(L('err res', zone=zone)) except Exception as err: assert excepted in str(err), "res %s, excepted %s" % (str(err), excepted) def test_set_time_zone_show_proc(): """ { "title": "test_sys_time_zone.test_set_time_zone_show_proc", "describe": "验证时区设置对show proc相关的时间显示", "tag": "function,p1" } """ """ 验证时区设置对show proc相关的时间显示 """ zone_list = ['-01:10', '+03:30', '+09:01'] for zone in zone_list: Palo_client.set_time_zone('+08:00') res_var = Palo_client.show_variables("time_zone") assert res_var[1][1] == "+08:00", "res %s, excepted +08:00" % res_var[1][1] time.sleep(5) res_before = show_be_broker_time() Palo_client.set_time_zone(zone) res_var = Palo_client.show_variables("time_zone") assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone) #varify_time_zone_correct(zone, Palo_client, False, zone) time.sleep(5) res_after = show_be_broker_time() assert res_after LOG.info(L('zone, before res, after res',\ zone=zone, res_before=res_before, res_after=res_after)) check2_gap_time_zone(res_before, res_after, zone) def test_set_time_zone_show_backup(): """ { "title": "test_sys_time_zone.test_set_time_zone_show_backup", "describe": "创建db,导入数据,备份,setUp里会设置时区为+08:00,有这些数据后,先获取时间信息,然后设置新时区,再次获取时间", "tag": "function,p1" } """ """show backup_restore 创建db,导入数据,备份 setUp里会设置时区为+08:00,有这些数据后,先获取时间信息,然后设置新时区,再次获取时间 """ Palo_client.set_time_zone('+08:00') res_var = Palo_client.show_variables("time_zone") assert res_var[1][1] == "+08:00", "res %s, excepted +08:00" % res_var[1][1] database_name, table_name, index_name = util.gen_name_list() create_table(database_name, table_name) # 导入 data_desc_list = palo_client.LoadDataInfo(DATA.file_path_1, table_name) assert Palo_client.batch_load(util.get_label(), data_desc_list, broker=broker_info) ##进行备份恢复 snapshot_label = util.get_snapshot_label('backup') backup(repo_name, database_name, table_name, snapshot_label) ######第一次获取时间 res_before, snapshot = get_backup_time(database_name) assert res_before ########set time zone zone = "+01:00" Palo_client.set_time_zone(zone) res_var = Palo_client.show_variables("time_zone") LOG.info(L('zone, res', zone=zone, res=res_var)) assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone) time.sleep(5) #######再次获取时间 res_after, snapshot = get_backup_time(database_name) assert res_after LOG.info(L('zone, before res, after res',\ zone=zone, res_before=res_before, res_after=res_after)) check2_gap_time_zone(res_before, res_after, zone) Palo_client.clean(database_name) def test_set_time_zone_show_backup_restore(): """ { "title": "test_sys_time_zone.test_set_time_zone_show_backup_restore", "describe": "创建db,导入数据,备份,后恢复, setUp里会设置时区为+08:00,有这些数据后,先获取时间信息,然后设置新时区,再次获取时间", "tag": "function,p1" } """ """show backup_restore 创建db,导入数据,备份,后恢复 setUp里会设置时区为+08:00,有这些数据后,先获取时间信息,然后设置新时区,再次获取时间 """ Palo_client.set_time_zone("+08:00") database_name, table_name, index_name = util.gen_name_list() create_table(database_name, table_name) # 导入 data_desc_list = palo_client.LoadDataInfo(DATA.file_path_1, table_name) assert Palo_client.batch_load(util.get_label(), data_desc_list, broker=broker_info, is_wait=True) ##进行备份恢复 snapshot_label = util.get_snapshot_label('backup_restore') backup(repo_name, database_name, table_name, snapshot_label) restore(repo_name, database_name, table_name, snapshot_label) ######第一次获取时间 res_before, snapshot = get_restore_time(database_name) #有内容才继续 assert res_before zone = "+01:00" Palo_client.set_time_zone(zone) res_var = Palo_client.show_variables("time_zone") LOG.info(L('zone, res', zone=zone, res=res_var)) assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone) time.sleep(5) #######再次获取时间 res_after, snapshot = get_restore_time(database_name) assert res_after ###因为标准是+08:00,现在设置+01:00,时间相差7小时,0分钟 LOG.info(L('zone, before res, after res, excepted',\ zone=zone, res_before=res_before, res_after=res_after)) check2_gap_time_zone(res_before, res_after, zone) Palo_client.clean(database_name) def test_set_time_zone_show_repo(): """ { "title": "test_sys_time_zone.test_set_time_zone_show_repo", "describe": "setUp里会设置时区为+08:00,先获取时间信息,然后设置新时区,再次获取时间", "tag": "function,p1" } """ """show repo setUp里会设置时区为+08:00,先获取时间信息,然后设置新时区,再次获取时间 """ ##set time zone zone = "+08:00" Palo_client.set_time_zone(zone) res_var = Palo_client.show_variables("time_zone") assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone) res_before = get_repo_time() assert res_before ##set time zone zone = "+01:00" Palo_client.set_time_zone(zone) res_var = Palo_client.show_variables("time_zone") assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone) time.sleep(5) res_after = get_repo_time() assert res_after LOG.info(L('zone, before res, after res',\ zone=zone, res_before=res_before, res_after=res_after)) check2_gap_time_zone(res_before[0], res_after[0], zone) def test_set_time_zone_show_snapshot(): """ { "title": "test_sys_time_zone.test_set_time_zone_show_snapshot", "describe": "setUp里会设置时区为+08:00,先获取时间信息,然后设置新时区,再次获取时间", "tag": "function,p1,fuzz" } """ """show snapshot setUp里会设置时区为+08:00,先获取时间信息,然后设置新时区,再次获取时间 """ ###snapshot, 与时间无关 res_repo = get_repo_time() assert res_repo repo = res_repo[1] snapshot_name = None LOG.info(L('repo,snapshot_name', repo=repo, snapshot_name=snapshot_name)) if repo: zone = "+08:00" Palo_client.set_time_zone(zone) res_var = Palo_client.show_variables("time_zone") assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone) res_before = get_snapshot_time(repo, snapshot_name) assert res_before ##set time zone zone = "+01:00" Palo_client.set_time_zone(zone) res_var = Palo_client.show_variables("time_zone") assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone) time.sleep(5) res_after = get_snapshot_time(repo, snapshot_name) assert res_after LOG.info(L('zone, before res, after res',\ zone=zone, res_before=res_before, res_after=res_after)) try: check2_gap_time_zone(res_before, res_after, zone, True) LOG.error(L('snapshot time zone varify err', res_before=res_before, res_after=res_after)) except Exception as err: assert 'excepted' in str(err), "excepted excepted, err: %s" % str(err) else: raise pytest.skip('get zone failed') def test_set_time_zone_alter_table(): """ { "title": "test_sys_time_zone.test_set_time_zone_alter_table", "describe": "setUp里会设置时区为+08:00,先获取时间信息,然后设置新时区,再次获取时间", "tag": "function,p1" } """ """ 设置time_zone变量,验证对导schema change的影响。 setUp里会设置时区为+08:00,先获取时间信息,然后设置新时区,再次获取时间 """ database_name, table_name, index_name = util.gen_name_list() #建表 create_table(database_name, table_name) zone = "+08:00" Palo_client.set_time_zone(zone) res_var = Palo_client.show_variables("time_zone") assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone) ##alter table column_list = [('k11', 'INT KEY', None, '5')] ret = Palo_client.schema_change_add_column(table_name, column_list,\ after_column_name='k1', is_wait_job=True) assert ret res_before = [] res_after = [] schema_change_job_list = Palo_client.get_table_schema_change_job_list(table_name, database_name) LOG.info(L('palo db, table, res', db=database_name, table=table_name, res=schema_change_job_list)) res_before.append(schema_change_job_list[-1][palo_job.SchemaChangeJob.CreateTime]) res_before.append(schema_change_job_list[-1][palo_job.SchemaChangeJob.FinishTime]) ##set time zone zone = "+01:00" Palo_client.set_time_zone(zone) res_var = Palo_client.show_variables("time_zone") assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone) schema_change_job_list = Palo_client.get_table_schema_change_job_list(table_name, database_name) LOG.info(L('palo db, table, res', db=database_name, table=table_name, res=schema_change_job_list)) res_after.append(schema_change_job_list[-1][palo_job.SchemaChangeJob.CreateTime]) res_after.append(schema_change_job_list[-1][palo_job.SchemaChangeJob.FinishTime]) ###check LOG.info(L('zone, before res, after res',\ zone=zone, res_before=res_before, res_after=res_after)) check2_gap_time_zone(res_before, res_after, zone) Palo_client.clean(database_name) def test_set_time_zone_delete_job(): """ { "title": "test_sys_time_zone.test_set_time_zone_delete_job", "describe": "设置time_zone变量,验证对删除任务的影响。setUp里会设置时区为+08:00,先获取时间信息,然后设置新时区,再次获取时间", "tag": "function,p1" } """ """ 设置time_zone变量,验证对删除任务的影响。 setUp里会设置时区为+08:00,先获取时间信息,然后设置新时区,再次获取时间 """ database_name, table_name, index_name = util.gen_name_list() create_table(database_name, table_name) ##delete table zone = "CST" Palo_client.set_time_zone(zone) res_var = Palo_client.show_variables("time_zone") assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone) ret = Palo_client.delete(table_name, [('k1', '=', '3')], 'partition_a') assert ret res = Palo_client.show_delete(database_name) LOG.info(L('palo delete result', palo_result=res)) delete_time_before = palo_job.DeleteJob(res[-1]).get_create_time() ##set time zone zone = "+01:00" Palo_client.set_time_zone(zone) res_var = Palo_client.show_variables("time_zone") assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone) res_2 = Palo_client.show_delete(database_name) assert res_2 delete_time_after = palo_job.DeleteJob(res_2[-1]).get_create_time() LOG.info(L('zone, before res, after res',\ zone=zone, res_before=[delete_time_before], res_after=[delete_time_after])) print(delete_time_before) print(delete_time_after) check2_gap_time_zone([delete_time_before], [delete_time_after], zone) Palo_client.clean(database_name) def test_set_time_zone_select_time_function(): """ { "title": "test_sys_time_zone.test_set_time_zone_select_time_function", "describe": "设置time_zone变量,验证对时间相关函数的影响。测试点:5个函数,now(),curtime(),UNIX_TIMESTAMP() FROM_UNIXTIME(), CONVERT_TZ()", "tag": "function,p1" } """ """ 设置time_zone变量,验证对时间相关函数的影响。 测试点:5个函数,now(),curtime(),UNIX_TIMESTAMP() FROM_UNIXTIME(), CONVERT_TZ() """ zone_list = ["+06:00", "+09:10", "-01:10", "+08:00"] for zone in zone_list: sql = "set time_zone = '%s'" % zone check2(sql) res_var = Palo_client.show_variables("time_zone") assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone) #UNIX_TIMESTAMP sql = "select UNIX_TIMESTAMP('1970-01-01 08:00:00'), UNIX_TIMESTAMP('1970-01-01 18:10:10')" check2(sql) ##curtime sql = "SELECT CURTIME()" check2(sql) ##FROM_UNIXTIME sql = "select FROM_UNIXTIME(123.4, '%Y-%m-%d %H:%i:%s'), FROM_UNIXTIME(-123,\ '%Y-%m-%d %H:%i:%s'), FROM_UNIXTIME(+123, '%Y-%m-%d %H:%i:%s')" check2(sql) #CONVERT_TZ sql = "SELECT CONVERT_TZ('2004-01-01 12:00:00','+01:00','+10:00')" check2(sql) ##now wait_for_integer_min() sql = "select date(now()), HOUR(now()), MINUTE(now()), DAY(now()),\ MONTH(now()), QUARTER(now()), YEAR(now())" check2(sql) def test_set_time_zone_insert_load_select(): """ { "title": "test_sys_time_zone.test_set_time_zone_insert_load_select", "describe": "设置time_zone变量,验证对导入和查询时间相关函数的影响。测试点:导入数据里含now,curtime()和不受影响的函数utc_timestamp,验证查询结果", "tag": "function,p1" } """ """ 设置time_zone变量,验证对导入和查询时间相关函数的影响。 测试点:导入数据里含now,curtime()和不受影响的函数utc_timestamp,验证查询结果 """ database_name, table_name, index_name = util.gen_name_list() Palo_client.clean(database_name) Palo_client.create_database(database_name) Palo_client.use(database_name) zone = "CST" Palo_client.set_time_zone(zone) res_var = Palo_client.show_variables("time_zone") assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone) sql = "drop table if exists %s" % table_name LOG.info(L('palo&mysql sql', sql=sql)) res = Palo_client.execute(sql) mysql_cursor.execute(sql) sql = 'create table %s(k1 tinyint, k2 smallint NULL, k3 tinyint NULL, k4 tinyint NULL,\ k5 date NULL, k6 datetime NULL, k8 date NULL, k9 datetime NULL, \ k7 varchar(20) NULL, k10 double sum, k11 float sum) engine=olap \ distributed by hash(k1) buckets 5 properties("storage_type"="column")' % table_name msql = 'create table %s(k1 tinyint, k2 smallint, k3 tinyint NULL, k4 tinyint NULL,\ k5 date, k6 datetime, k8 date, k9 datetime, k7 varchar(20),\ k10 double, k11 float)' % table_name check2(sql, msql) wait_for_integer_min() insert_sql = "insert into %s values (1, HOUR(now()), MINUTE(now()),\ UNIX_TIMESTAMP('1970-01-01 08:00:00'), date(now()),\ '2019-09-09 09:00:00', date(now())," % table_name insert_sql += "FROM_UNIXTIME(+123, '%Y-%m-%d %H:%i:%s'), '7', 10.10, 11.11)" check2(insert_sql) select_sql = "select * from %s" % table_name check2(select_sql) Palo_client.clean(database_name) def teardown_module(): """清理环境""" sql = "set time_zone = '+08:00'" check2(sql) if __name__ == "__main__": print("test") setup_module() test_set_time_zone_select_time_function() test_set_time_zone_insert_load_select()