#!/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_create_dynamic_partition_parameter.py # @date 2021/06/02 10:28:20 # @brief This file is a test file for doris dynamic partition parameters. # ############################################################################# """ 测试动态分区功能参数 """ import time import datetime import sys from dateutil.relativedelta import relativedelta sys.path.append("../") from lib import palo_config from lib import palo_client from lib import palo_job from lib import util client = None config = palo_config.config LOG = palo_client.LOG L = palo_client.L def setup_module(): """ setUp """ global client client = palo_client.get_client(config.fe_host, config.fe_query_port, user=config.fe_user, password=config.fe_password, http_port=config.fe_http_port) def create(table_name, datetype, info, column=None, keys_desc=None, partition_info=None): """ 建表 info:动态分区建表参数 """ if partition_info is None: partition_info = palo_client.PartitionInfo('k1', [], []) distribution_info = palo_client.DistributionInfo('HASH(k1)', 3) dynamic_info = palo_client.DynamicPartitionInfo(info) dynamic = dynamic_info.to_string() if column is None: column = [('k1', datetype), ('k2', 'varchar(20)'), ('k3', 'int', 'sum')] client.create_table(table_name, column, partition_info, distribution_info, keys_desc=keys_desc, dynamic_partition_info=dynamic) assert client.show_tables(table_name), 'fail to create table' def get_partition_name_list(start, end, prefix): """ 分区名 """ partition_name_list = [] for i in range(-start, -end - 1, -1): p_name = (datetime.datetime.now() - datetime.timedelta(days=i)) partition_name_list.append(str(prefix + p_name.strftime("%Y%m%d"))) return partition_name_list def get_partition_value_list(start, end): """ 分区范围 """ partition_value_list = [] for i in range(-start, -end - 1, -1): p_value = (datetime.datetime.now() - datetime.timedelta(days=i)) p_value2 = (datetime.datetime.now() - datetime.timedelta(days=(i - 1))) p_value = p_value.strftime("%Y-%m-%d") p_value2 = p_value2.strftime("%Y-%m-%d") tmp = '[types: [DATEV2]; keys: [%s]; ..types: [DATEV2]; keys: [%s]; )' % (p_value, p_value2) partition_value_list.append(tmp) return partition_value_list def check_partition_list(table_name, partition_name_list): """ 验证分区是否创建成功 """ ret = client.get_partition_list(table_name) partitions_list = util.get_attr(ret, palo_job.PartitionInfo.PartitionName) expect_plist_sorted = sorted(partition_name_list) actural_plist_sorted = sorted(partitions_list) assert expect_plist_sorted == actural_plist_sorted, \ 'expect: %s, actural: %s' % (expect_plist_sorted, actural_plist_sorted) def check_partition_range(table_name, partition_value_list): """ 验证分区范围是否正确 """ ret = client.get_partition_list(table_name) LOG.info(L('', PARTITION_RANGE=util.get_attr(ret, palo_job.PartitionInfo.Range), EXPECT=partition_value_list)) assert util.get_attr(ret, palo_job.PartitionInfo.Range) == partition_value_list def test_dynamic_partition_enable(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_enable", "describe": "验证dynamic_partition.enable参数功能enable=true开启动态分区功能", "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} create(table_name, 'date', dynamic_partition_info) partition_name_list = get_partition_name_list(-3, 3, 'p') partition_value_list = get_partition_value_list(-3, 3) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.drop_table(table_name, database_name) dynamic_partition_info = {'enable': 'false', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} create(table_name, 'date', dynamic_partition_info) check_partition_list(table_name, []) client.clean(database_name) def test_dynamic_partition_hour(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_hour", "describe": "time_unit=HOUR建表,仅支持datetime格式", "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) now_time = datetime.datetime.now() partition_name_list = [] for i in range(30, -31, -1): p_name = (now_time - datetime.timedelta(hours=i)) partition_name_list.append(str("p" + p_name.strftime("%Y%m%d%H"))) partition_value_list = [] for i in range(30, -31, -1): p_value = (now_time - datetime.timedelta(hours=i)) p_value2 = (now_time - datetime.timedelta(hours=(i - 1))) p_value = p_value.strftime("%Y-%m-%d %H:00:00") p_value2 = p_value2.strftime("%Y-%m-%d %H:00:00") partition = '[types: [DATETIMEV2]; keys: [%s]; ..types: [DATETIMEV2]; keys: [%s]; )' % (p_value, p_value2) partition_value_list.append(partition) dynamic_partition_info = {'enable': 'true', 'time_unit': 'HOUR', 'start': -30, 'end': 30, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} create(table_name, 'datetime', dynamic_partition_info) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.clean(database_name) def test_dynamic_partition_day_date(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_day_date", "describe": "time_unit=DAY建表,datetype=date", "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) partition_name_list = get_partition_name_list(-3, 3, 'p') partition_value_list = get_partition_value_list(-3, 3) dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} create(table_name, 'date', dynamic_partition_info) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.clean(database_name) def test_dynamic_partition_day_int(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_day_int", "describe": "time_unit=DAY建表,datetype=int", "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) partition_name_list = get_partition_name_list(-3, 3, 'p') partition_value_list = [] for i in range(3, -4, -1): p_value = (datetime.datetime.now() - datetime.timedelta(days=i)) p_value2 = (datetime.datetime.now() - datetime.timedelta(days=(i - 1))) p_value = p_value.strftime("%Y%m%d") p_value2 = p_value2.strftime("%Y%m%d") partition = '[types: [INT]; keys: [%s]; ..types: [INT]; keys: [%s]; )' % (p_value, p_value2) partition_value_list.append(partition) dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} create(table_name, 'int', dynamic_partition_info) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.clean(database_name) def test_dynamic_partition_day_datetime(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_day_datetime", "describe": "time_unit=DAY建表,datetype=datetime", "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) partition_name_list = get_partition_name_list(-3, 3, 'p') partition_value_list = [] for i in range(3, -4, -1): p_value = (datetime.datetime.now() - datetime.timedelta(days=i)) p_value2 = (datetime.datetime.now() - datetime.timedelta(days=(i - 1))) p_value = p_value.strftime("%Y-%m-%d 00:00:00") p_value2 = p_value2.strftime("%Y-%m-%d 00:00:00") partition = '[types: [DATETIMEV2]; keys: [%s]; ..types: [DATETIMEV2]; keys: [%s]; )' % (p_value, p_value2) partition_value_list.append(partition) dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} create(table_name, 'datetime', dynamic_partition_info) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.clean(database_name) def test_dynamic_partition_week_date(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_week_date", "describe": "time_unit=WEEK建表,datetype=date" "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) partition_name_list = [] today = datetime.datetime.now().weekday() start_day = datetime.datetime.now() - datetime.timedelta(days=today) # todo: 2022-2023 week name not same for i in range(30, -31, -1): p_name = start_day - datetime.timedelta(days=7 * i) week = str("0" + str(int(p_name.strftime("%U")) + 1)) partition_name_list.append(str("p" + p_name.strftime("%Y_") + week[-2:])) partition_value_list = [] for i in range(30, -31, -1): p_value = start_day - datetime.timedelta(days=7 * i) p_value2 = start_day - datetime.timedelta(days=(7 * (i - 1))) p_value = p_value.strftime("%Y-%m-%d") p_value2 = p_value2.strftime("%Y-%m-%d") partition = '[types: [DATEV2]; keys: [%s]; ..types: [DATEV2]; keys: [%s]; )' % (p_value, p_value2) partition_value_list.append(partition) dynamic_partition_info = {'enable': 'true', 'time_unit': 'WEEK', 'start': -30, 'end': 30, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} create(table_name, 'date', dynamic_partition_info) # check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.clean(database_name) def test_dynamic_partition_week_datetime(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_week_datetime", "describe": "time_unit=WEEK建表, datetype=datetime" "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) partition_name_list = [] today = datetime.datetime.now().weekday() start_day = datetime.datetime.now() - datetime.timedelta(days=today) for i in range(30, -31, -1): p_name = start_day - datetime.timedelta(days=7 * i) week = str("0" + str(int(p_name.strftime("%U")) + 1)) partition_name_list.append(str("p" + p_name.strftime("%Y_") + week[-2:])) partition_value_list = [] for i in range(30, -31, -1): p_value = start_day - datetime.timedelta(days=7 * i) p_value2 = start_day - datetime.timedelta(days=(7 * (i - 1))) p_value = p_value.strftime("%Y-%m-%d 00:00:00") p_value2 = p_value2.strftime("%Y-%m-%d 00:00:00") partition = '[types: [DATETIMEV2]; keys: [%s]; ..types: [DATETIMEV2]; keys: [%s]; )' % (p_value, p_value2) partition_value_list.append(partition) dynamic_partition_info = {'enable': 'true', 'time_unit': 'WEEK', 'start': -30, 'end': 30, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} create(table_name, 'datetime', dynamic_partition_info) # check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.drop_table(table_name, database_name) client.clean(database_name) def test_dynamic_partition_week_int(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_week_int", "describe": "time_unit=WEEK建表, datetype=int" "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) partition_name_list = [] today = datetime.datetime.now().weekday() start_day = datetime.datetime.now() - datetime.timedelta(days=today) for i in range(30, -31, -1): p_name = start_day - datetime.timedelta(days=7 * i) week = str("0" + str(int(p_name.strftime("%U")) + 1)) partition_name_list.append(str("p" + p_name.strftime("%Y_") + week[-2:])) partition_value_list = [] for i in range(30, -31, -1): p_value = start_day - datetime.timedelta(days=7 * i) p_value2 = start_day - datetime.timedelta(days=(7 * (i - 1))) p_value = p_value.strftime("%Y%m%d") p_value2 = p_value2.strftime("%Y%m%d") partition = '[types: [INT]; keys: [%s]; ..types: [INT]; keys: [%s]; )' % (p_value, p_value2) partition_value_list.append(partition) dynamic_partition_info = {'enable': 'true', 'time_unit': 'WEEK', 'start': -30, 'end': 30, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} create(table_name, 'int', dynamic_partition_info) # check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.clean(database_name) def test_dynamic_partition_month_date(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_month_date", "describe": "time_unit=MONTH建表,datetype=date", "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) partition_name_list = [] for i in range(10, -11, -1): p_name = datetime.datetime.now() - relativedelta(months=i) partition_name_list.append(str("p" + p_name.strftime("%Y%m"))) partition_value_list = [] start_day = datetime.datetime.now() for i in range(10, -11, -1): p_value = start_day - relativedelta(months=i) p_value2 = start_day - relativedelta(months=(i - 1)) p_value = p_value.strftime("%Y-%m") + "-01" p_value2 = p_value2.strftime("%Y-%m") + "-01" partition = '[types: [DATEV2]; keys: [%s]; ..types: [DATEV2]; keys: [%s]; )' % (p_value, p_value2) partition_value_list.append(partition) dynamic_partition_info = {'enable': 'true', 'time_unit': 'MONTH', 'start': -10, 'end': 10, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} create(table_name, 'date', dynamic_partition_info) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.clean(database_name) def test_dynamic_partition_month_datetime(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_month_datetime", "describe": "time_unit=MONTH建表,datetype=datetime", "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) partition_name_list = [] for i in range(10, -11, -1): p_name = datetime.datetime.now() - relativedelta(months=i) partition_name_list.append(str("p" + p_name.strftime("%Y%m"))) partition_value_list = [] start_day = datetime.datetime.now() for i in range(10, -11, -1): p_value = start_day - relativedelta(months=i) p_value2 = start_day - relativedelta(months=(i - 1)) p_value = p_value.strftime("%Y-%m") + "-01 00:00:00" p_value2 = p_value2.strftime("%Y-%m") + "-01 00:00:00" partition = '[types: [DATETIMEV2]; keys: [%s]; ..types: [DATETIMEV2]; keys: [%s]; )' % (p_value, p_value2) partition_value_list.append(partition) dynamic_partition_info = {'enable': 'true', 'time_unit': 'MONTH', 'start': -10, 'end': 10, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} create(table_name, 'datetime', dynamic_partition_info) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.clean(database_name) def test_dynamic_partition_month_int(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_month_int", "describe": "time_unit=MONTH建表,datetype=int", "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) partition_name_list = [] for i in range(10, -11, -1): p_name = datetime.datetime.now() - relativedelta(months=i) partition_name_list.append(str("p" + p_name.strftime("%Y%m"))) partition_value_list = [] start_day = datetime.datetime.now() for i in range(10, -11, -1): p_value = start_day - relativedelta(months=i) p_value2 = start_day - relativedelta(months=(i - 1)) p_value = p_value.strftime("%Y%m") + "01" p_value2 = p_value2.strftime("%Y%m") + "01" partition = '[types: [INT]; keys: [%s]; ..types: [INT]; keys: [%s]; )' % (p_value, p_value2) partition_value_list.append(partition) dynamic_partition_info = {'enable': 'true', 'time_unit': 'MONTH', 'start': -10, 'end': 10, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} create(table_name, 'int', dynamic_partition_info) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.clean(database_name) def test_dynamic_partition_time_zone(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_time_zone", "describe": "验证dynamic_partition.time_zone参数功能", "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) partition_name_list = [] for i in range(11, 4, -1): p_name = (datetime.datetime.now() - datetime.timedelta(hours=i)) partition_name_list.append(str("p" + p_name.strftime("%Y%m%d%H"))) partition_value_list = [] for i in range(11, 4, -1): p_value = (datetime.datetime.now() - datetime.timedelta(hours=i)) p_value2 = (datetime.datetime.now() - datetime.timedelta(hours=(i - 1))) p_value = p_value.strftime("%Y-%m-%d %H:00:00") p_value2 = p_value2.strftime("%Y-%m-%d %H:00:00") partition = '[types: [DATETIMEV2]; keys: [%s]; ..types: [DATETIMEV2]; keys: [%s]; )' % (p_value, p_value2) partition_value_list.append(partition) dynamic_partition_info = {'enable': 'true', 'time_unit': 'HOUR', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true', 'time_zone': 'Etc/GMT'} create(table_name, 'datetime', dynamic_partition_info) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.clean(database_name) def test_dynamic_partition_start(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_start", "describe": "验证dynamic_partition.start参数功能", "tag": "p1,function,fuzz" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) start_list = [-5, -3, -10, -1, -100] for start in start_list: dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': start, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} create(table_name, 'date', dynamic_partition_info) partition_name_list = get_partition_name_list(start, 3, 'p') partition_value_list = get_partition_value_list(start, 3) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.drop_table(table_name, database_name) dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': 0, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} util.assert_return(False, 'Dynamic partition start must less than 0', create, table_name, 'date', \ dynamic_partition_info) client.clean(database_name) def test_dynamic_partition_end(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_end", "describe": "验证dynamic_partition.end参数功能", "tag": "p1,function,fuzz" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) end_list = [3, 5, 10, 100, 1] for end in end_list: dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': end, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} create(table_name, 'date', dynamic_partition_info) partition_name_list = get_partition_name_list(-3, end, 'p') partition_value_list = get_partition_value_list(-3, end) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.drop_table(table_name, database_name) dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 0, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} util.assert_return(False, 'Dynamic partition end must greater than 0', create, table_name, 'date', \ dynamic_partition_info) client.clean(database_name) def test_dynamic_partition_prefix(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_prefix", "describe": "验证dynamic_partition.prefix参数功能", "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) prefix_list = ['snfkjds', 'a', 'vhklskhsfdkksdv', 'fds', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'] for prefix in prefix_list: partition_name_list = get_partition_name_list(-3, 3, prefix) partition_value_list = get_partition_value_list(-3, 3) dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': prefix, 'buckets': 10, 'create_history_partition': 'true'} create(table_name, 'date', dynamic_partition_info) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.drop_table(table_name, database_name) client.clean(database_name) def test_dynamic_partition_buckets(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_buckets", "describe": "验证dynamic_partition.buckets参数功能", "tag": "p1,function,fuzz" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) buckets_list = [1, 2, 5, 10, 100] for buckets in buckets_list: partition_name_list = get_partition_name_list(-3, 3, 'p') partition_value_list = get_partition_value_list(-3, 3) dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': buckets, 'create_history_partition': 'true'} create(table_name, 'date', dynamic_partition_info) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) ret = client.get_partition_list(table_name) assert util.get_attr(ret, palo_job.PartitionInfo.Buckets) == [str(buckets) for i in range(7)] client.drop_table(table_name, database_name) dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': -10, 'create_history_partition': 'true'} util.assert_return(False, 'Dynamic partition buckets must greater than 0', create, table_name, 'date', \ dynamic_partition_info) client.clean(database_name) def test_dynamic_partition_replication_num(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_replication_num", "describe": "验证dynamic_partition.replication_num参数功能", "tag": "p1,function,fuzz" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) replication_num_list = [1, 2, 3] for replication_num in replication_num_list: partition_name_list = get_partition_name_list(-3, 3, 'p') partition_value_list = get_partition_value_list(-3, 3) dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true', 'replication_num': replication_num} create(table_name, 'date', dynamic_partition_info) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) ret = client.get_partition_list(table_name) assert util.get_attr(ret, palo_job.PartitionInfo.ReplicationNum) == [str(replication_num) for i in range(7)] client.drop_table(table_name, database_name) dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true', 'replication_num': -3} util.assert_return(False, 'Dynamic partition replication num must greater than 0', create, table_name, 'date', \ dynamic_partition_info) client.clean(database_name) def test_dynamic_partition_start_day_of_week(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_start_day_of_week", "describe": "验证dynamic_partition.start_day_of_week参数功能", "tag": "p1,function,fuzz" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) start_day_of_week_list = [1, 2, 3, 4, 5, 6, 7] for start_day_of_week in start_day_of_week_list: today = datetime.datetime.now().weekday() start_day = datetime.datetime.now() - datetime.timedelta(days=(today - start_day_of_week + 1)) partition_name_list = [] for i in range(3, -4, -1): p_name = start_day - datetime.timedelta(days=7 * i) week = str("0" + str(p_name.strftime("%U"))) partition_name_list.append(str("p" + p_name.strftime("%Y_") + week[-2:])) partition_value_list = [] for i in range(3, -4, -1): p_value = start_day - datetime.timedelta(days=7 * i) p_value2 = start_day - datetime.timedelta(days=(7 * (i - 1))) p_value = p_value.strftime("%Y-%m-%d") p_value2 = p_value2.strftime("%Y-%m-%d") partition = '[types: [DATEV2]; keys: [%s]; ..types: [DATEV2]; keys: [%s]; )' % (p_value, p_value2) partition_value_list.append(partition) dynamic_partition_info = {'enable': 'true', 'time_unit': 'WEEK', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true', 'start_day_of_week': start_day_of_week} create(table_name, 'date', dynamic_partition_info) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.drop_table(table_name, database_name) dynamic_partition_info = {'enable': 'true', 'time_unit': 'WEEK', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true', 'start_day_of_week': 8} util.assert_return(False, 'between 1 and 7', create, table_name, 'date', dynamic_partition_info) client.clean(database_name) def test_dynamic_partition_start_day_of_month(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_start_day_of_month", "describe": "验证dynamic_partition.start_day_of_month参数功能", "tag": "p1,function,fuzz" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) start_day_of_month_list = [1, 2, 5, 10, 28] for start_day_of_month in start_day_of_month_list: partition_name_list = [] today = datetime.datetime.now().strftime("%d") if int(today) - start_day_of_month >= 0: month_count = 0 else: month_count = 1 for i in range(3 + month_count, -4 + month_count, -1): p_name = datetime.datetime.now() - relativedelta(months=i) partition_name_list.append(str("p" + p_name.strftime("%Y%m"))) partition_value_list = [] start_day = datetime.datetime.now() for i in range(3 + month_count, -4 + month_count, -1): p_value = start_day - relativedelta(months=i) p_value2 = start_day - relativedelta(months=(i - 1)) if start_day_of_month >= 10: p_value = p_value.strftime("%Y-%m") + "-" + str(start_day_of_month) p_value2 = p_value2.strftime("%Y-%m") + "-" + str(start_day_of_month) else: p_value = p_value.strftime("%Y-%m") + "-0" + str(start_day_of_month) p_value2 = p_value2.strftime("%Y-%m") + "-0" + str(start_day_of_month) partition = '[types: [DATEV2]; keys: [%s]; ..types: [DATEV2]; keys: [%s]; )' % (p_value, p_value2) partition_value_list.append(partition) dynamic_partition_info = {'enable': 'true', 'time_unit': 'MONTH', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true', 'start_day_of_month': start_day_of_month} create(table_name, 'date', dynamic_partition_info) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.drop_table(table_name, database_name) dynamic_partition_info = {'enable': 'true', 'time_unit': 'MONTH', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true', 'start_day_of_month': 29} util.assert_return(False, 'between 1 and 28', create, table_name, 'date', dynamic_partition_info) client.clean(database_name) def test_dynamic_partition_create_history_partition(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_create_history_partition", "describe": "验证dynamic_partition.create_history_partition参数功能", "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'false'} create(table_name, 'date', dynamic_partition_info) partition_name_list = get_partition_name_list(0, 3, 'p') partition_value_list = get_partition_value_list(0, 3) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.clean(database_name) def test_dynamic_partition_hot_partition_num(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_hot_partition_num", "describe": "验证dynamic_partition.hot_partition_num参数功能", "tag": "p1,function,fuzz" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) partition_name_list = get_partition_name_list(-3, 3, 'p') partition_value_list = get_partition_value_list(-3, 3) hot_partition_num_list = [None, 0, 1, 2, 3, 4] for hot_partition_num in hot_partition_num_list: dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true', 'hot_partition_num': hot_partition_num} create(table_name, 'date', dynamic_partition_info) if hot_partition_num is None or hot_partition_num == 0: storage_medium = ['HDD' for i in range(7)] else: storage_medium = ['HDD' for i in range(4 - hot_partition_num)] + \ ['SSD' for i in range(hot_partition_num + 3)] ret = client.get_partition_list(table_name) assert util.get_attr(ret, palo_job.PartitionInfo.StorageMedium) == storage_medium client.drop_table(table_name, database_name) dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true', 'hot_partition_num': -1} util.assert_return(False, 'larger than 0', create, table_name, 'date', dynamic_partition_info) client.clean(database_name) def test_dynamic_partition_history_partition_num(): """ { "title": "test_sys_dynamic_partition_parameter.test_dynamic_partition_history_partition_num", "describe": "验证dynamic_partition.history_partition_num参数功能", "tag": "p1,function,fuzz" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) history_partition_num_list = [5, 3, -1, 1, 0, None] for num in history_partition_num_list: dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true', 'history_partition_num': num} create(table_name, 'date', dynamic_partition_info) if num is None or num == -1: start = -3 else: start = -min(3, num) partition_name_list = get_partition_name_list(start, 3, 'p') partition_value_list = get_partition_value_list(start, 3) check_partition_list(table_name, partition_name_list) check_partition_range(table_name, partition_value_list) client.drop_table(table_name, database_name) dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true', 'history_partition_num': -2} util.assert_return(False, 'Dynamic history partition num must greater than 0', create, table_name, 'date', \ dynamic_partition_info) client.clean(database_name) def test_composite_partition(): """ { "title": "test_sys_dynamic_partition_parameter.test_composite_partition", "describe": "验证复合分区创建动态分区表,建表失败", "tag": "p1,function,fuzz" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) column = [('k1', 'date'), ('k2', 'date'), ('k3', 'int')] partition_info = palo_client.PartitionInfo(['k1', 'k2'], [], []) dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} util.assert_return(False, 'only support single-column range partition', create, table_name, 'date', dynamic_partition_info, column, partition_info=partition_info) client.clean(database_name) def test_list_partition(): """ { "title": "test_sys_dynamic_partition_parameter.test_list_partition", "describe": "验证list分区创建动态分区表,建表失败", "tag": "p1,function,fuzz" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) partition_info = palo_client.PartitionInfo(['k1'], [], [], partition_type='LIST') dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} util.assert_return(False, 'Only support dynamic partition properties on range partition table', create, table_name, 'date', dynamic_partition_info, partition_info=partition_info) client.clean(database_name) def test_range_partition(): """ { "title": "test_sys_dynamic_partition_parameter.test_range_partition", "describe": "验证range分区创建动态分区表,建表成功", "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) partition_info = palo_client.PartitionInfo(['k1'], [], [], partition_type='RANGE') dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} util.assert_return(True, None, create, table_name, 'date', dynamic_partition_info, partition_info=partition_info) client.clean(database_name) def test_type(): """ { "title": "test_sys_dynamic_partition_parameter.test_type", "describe": "分区数据格式不为date/datetime/int时创建动态分区表失败", "tag": "p1,function,fuzz" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} typelist = ['float', 'double', 'char', 'varchar', 'hll', 'bitmap'] for type in typelist: column = [('k1', type), ('k2', 'date'), ('k3', 'int')] util.assert_return(False, 'errCode', create, table_name, 'date', dynamic_partition_info, column=column) client.clean(database_name) def test_aggregation_aggregate(): """ { "title": "test_sys_dynamic_partition_parameter.test_aggregation_aggregate", "describe": "AGGREGATE聚合方式创建动态分区表", "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) column = [('k1', 'date'), ('k2', 'int', 'sum'), ('k3', 'int', 'max')] keys_desc = 'AGGREGATE KEY(k1)' dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} util.assert_return(True, None, create, table_name, 'date', dynamic_partition_info, column, keys_desc=keys_desc) client.clean(database_name) def test_aggregation_unique(): """ { "title": "test_sys_dynamic_partition_parameter.test_aggregation_unique", "describe": "UNIQUE聚合方式创建动态分区表", "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) column = [('k1', 'date'), ('k2', 'int'), ('k3', 'int')] keys_desc = 'UNIQUE KEY(k1)' dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} util.assert_return(True, None, create, table_name, 'date', dynamic_partition_info, column, keys_desc=keys_desc) client.clean(database_name) def test_aggregation_duplicate(): """ { "title": "test_sys_dynamic_partition_parameter.test_aggregation_duplicate", "describe": "DUPLICATE聚合方式创建动态分区表", "tag": "p1,function" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) column = [('k1', 'date'), ('k2', 'int'), ('k3', 'int')] keys_desc = 'DUPLICATE KEY(k1)' dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'start': -3, 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} util.assert_return(True, None, create, table_name, 'date', dynamic_partition_info, column, keys_desc=keys_desc) client.clean(database_name) def test_create_history_partition_with_no_start(): """ { "title": "test_sys_dynamic_partition_parameter.test_create_history_partition_with_no_start", "describe": "不设置start创建历史分区,issues #5995", "tag": "p1,fuzz" } """ database_name, table_name, index_name = util.gen_num_format_name_list() LOG.info(L('', database_name=database_name, table_name=table_name, index_name=index_name)) client.clean(database_name) client.create_database(database_name) client.use(database_name) dynamic_partition_info = {'enable': 'true', 'time_unit': 'DAY', 'end': 3, 'prefix': 'p', 'buckets': 10, 'create_history_partition': 'true'} util.assert_return(False, 'Provide start or history_partition_num property when creating history partition', \ create, table_name, 'date', dynamic_partition_info) client.clean(database_name) if __name__ == '__main__': setup_module() test_dynamic_partition_enable()