#!/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_partition_multi_col.py * @brief Test for partition by multi column * **************************************************************************/ """ import time import pytest from data import schema as DATA from data import load_file as FILE from lib import palo_client from lib import util from lib import common from lib import palo_job from lib import palo_task LOG = palo_client.LOG L = palo_client.L def setup_module(): """ setUp """ pass def teardown_module(): """ tearDown """ pass def test_update_tinyint(): """ { "title": "test_update_tinyint", "describe": "update数据类型tinyint, 数据溢出,Null,数据校验正确", "tag": "function,p0,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 = common.create_workspace(database_name) ret = client.create_table(table_name, DATA.tinyint_column_no_agg_list, keys_desc=DATA.unique_key) assert ret, 'create table failed' sql = 'insert into %s values(1, 2, 3, 4, 5)' % table_name ret = client.execute(sql) assert ret == (), 'insert date failed' # null util.assert_return(False, '', client.update, table_name, ['v1=null'], 'k1=1') # 溢出 msg = 'Number out of range[-129]. type: TINYINT' util.assert_return(False, msg, client.update, table_name, ['v1=-129'], 'k1=1') msg = 'Number out of range[128]. type: TINYINT' util.assert_return(False, msg, client.update, table_name, ['v1=128'], 'k1=1') # 多个数据导入 assert client.truncate(table_name) assert len(client.select_all(table_name)) == 0 ret = client.stream_load(table_name, FILE.test_tinyint_unique_file) assert ret, 'stream load failed' sql = 'select k1, -1, -1, -1, -1 from %s order by k1' % table_name ret1 = client.execute(sql) ret = client.update(table_name, ['v1=-1', 'v2=-1', 'v3=-1', 'v4=-1'], 'k1 is not null') assert ret, 'update table failed' sql = 'select k1, v1, v2, v3, v4 from %s order by k1' % table_name ret2 = client.execute(sql) util.check(ret1, ret2) client.clean(database_name) def test_update_smallint(): """ { "title": "test_update_smallint", "describe": "update数据类型smallint,数据溢出,Null,数据校验正确", "tag": "function,p0,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 = common.create_workspace(database_name) ret = client.create_table(table_name, DATA.smallint_column_no_agg_list, keys_desc=DATA.unique_key, set_null=True) assert ret, 'create table failed' sql = 'insert into %s values(1, 2, 3, 4, 5)' % table_name ret = client.execute(sql) assert ret == (), 'insert date failed' # null ret = client.update(table_name, ['v1=null'], 'k1=1') assert ret, 'update table failed' common.check2(client, sql1='select * from %s' % table_name, sql2='select 1, null, 3, 4, 5') # 溢出 msg = 'Number out of range[-32769]. type: SMALLINT' util.assert_return(False, msg, client.update, table_name, ['v1=-32769'], 'k1=1') msg = 'Number out of range[32768]. type: SMALLINT' util.assert_return(False, msg, client.update, table_name, ['v1=32768'], 'k1=1') # 多个数据导入 assert client.truncate(table_name) assert len(client.select_all(table_name)) == 0 ret = client.stream_load(table_name, FILE.test_smallint_file, max_filter_ratio=0.1) assert ret, 'stream load failed' sql = 'select k1, -1, -1, -1, -1 from %s order by k1' % table_name ret1 = client.execute(sql) ret = client.update(table_name, ['v1=-1, v2=-1, v3=-1, v4=-1'], 'k1 is not null or k1 is null') assert ret, 'update table failed' sql = 'select k1, v1, v2, v3, v4 from %s order by k1' % table_name ret2 = client.execute(sql) util.check(ret1, ret2) client.clean(database_name) def test_update_int(): """ { "title": "test_update_int", "describe": "update数据类型int,数据溢出,Null,数据校验正确", "tag": "function,p0,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 = common.create_workspace(database_name) ret = client.create_table(table_name, DATA.int_column_no_agg_list, keys_desc=DATA.unique_key) assert ret, 'create table failed' sql = 'insert into %s values(1, 2, 3, 4, 5)' % table_name ret = client.execute(sql) assert ret == (), 'insert date failed' # null, not null列 update failed util.assert_return(False, '', client.update, table_name, ['v1=NULL'], 'k1=1') # 溢出 msg = 'Number out of range[-2147483649]. type: INT' util.assert_return(False, msg, client.update, table_name, ['v1=-2147483649'], 'k1=1') msg = 'Number out of range[2147483648]. type: INT' util.assert_return(False, msg, client.update, table_name, ['v1=2147483648'], 'k1=1') # 多个数据导入 assert client.truncate(table_name) assert len(client.select_all(table_name)) == 0 ret = client.stream_load(table_name, FILE.test_int_file, max_filter_ratio=0.01) assert ret, 'stream load failed' sql = 'select k1, -1, -1, -1, -1 from %s order by k1' % table_name ret1 = client.execute(sql) ret = client.update(table_name, ['v1=-1, v2=-1, v3=-1, v4=-1'], 'k1 is not null') assert ret, 'update table failed' sql = 'select k1, v1, v2, v3, v4 from %s order by k1' % table_name ret2 = client.execute(sql) util.check(ret1, ret2) client.clean(database_name) def test_update_bigint(): """ { "title": "test_update_bigint", "describe": "update数据类型bigint,数据溢出,Null,数据校验正确", "tag": "function,p0,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 = common.create_workspace(database_name) ret = client.create_table(table_name, DATA.bigint_column_no_agg_list, keys_desc=DATA.unique_key, set_null=True) assert ret, 'create table failed' sql = 'insert into %s values(1, 2, 3, 4, 5)' % table_name ret = client.execute(sql) assert ret == (), 'insert date failed' # null todo ret = client.update(table_name, ['v1=null'], 'k1=1') assert ret, 'update table failed' common.check2(client, sql1='select * from %s' % table_name, sql2='select 1, null, 3, 4, 5') # 溢出 msg = 'Number out of range[-9223372036854775809]. type: BIGINT' util.assert_return(False, msg, client.update, table_name, ['v1=-9223372036854775809'], 'k1=1') msg = 'Number out of range[9223372036854775808]. type: BIGINT' util.assert_return(False, msg, client.update, table_name, ['v1=9223372036854775808'], 'k1=1') # 多个数据导入 assert client.truncate(table_name) assert len(client.select_all(table_name)) == 0 ret = client.stream_load(table_name, FILE.test_bigint_file, max_filter_ratio=0.01) assert ret, 'stream load failed' sql = 'select k1, -1, -1, -1, -1 from %s order by k1' % table_name ret1 = client.execute(sql) ret = client.update(table_name, ['v1=-1, v2=-1, v3=-1, v4=-1'], 'k1 is not null or k1 is null') assert ret, 'update table failed' sql = 'select k1, v1, v2, v3, v4 from %s order by k1' % table_name ret2 = client.execute(sql) util.check(ret1, ret2) client.clean(database_name) def test_update_largeint(): """ { "title": "test_update_largeint", "describe": "update数据类型largeint,数据溢出,Null,数据校验正确", "tag": "function,p0,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 = common.create_workspace(database_name) ret = client.create_table(table_name, DATA.largeint_column_no_agg_list, keys_desc=DATA.unique_key, set_null=True) assert ret, 'create table failed' sql = 'insert into %s values(1, 2, 3, 4, 5)' % table_name ret = client.execute(sql) assert ret == (), 'insert date failed' # null ret = client.update(table_name, ['v1=null'], 'k1=1') assert ret, 'update table failed' common.check2(client, sql1='select * from %s' % table_name, sql2='select 1, null, 3, 4, 5') # 溢出 msg = 'Numeric overflow' util.assert_return(False, msg, client.update, table_name, ['v1=-170141183460469231731687303715884105729'], 'k1=1') msg = 'Number Overflow. literal: 170141183460469231731687303715884105728' util.assert_return(False, msg, client.update, table_name, ['v1=170141183460469231731687303715884105728'], 'k1=1') # 多个数据导入 assert client.truncate(table_name) assert len(client.select_all(table_name)) == 0 ret = client.stream_load(table_name, FILE.test_largeint_file, max_filter_ratio=0.01) assert ret, 'stream load failed' sql = 'select k1, "-1", "-1", "-1", "-1" from %s order by k1' % table_name ret1 = client.execute(sql) ret = client.update(table_name, ['v1=-1, v2=-1, v3=-1, v4=-1'], 'k1 is not null or k1 is null') assert ret, 'update table failed' sql = 'select k1, v1, v2, v3, v4 from %s order by k1' % table_name ret2 = client.execute(sql) util.check(ret1, ret2) client.clean(database_name) def test_update_char(): """ { "title": "test_update_char", "describe": "update数据类型char,长度溢出,Null,空串,数据校验正确", "tag": "function,p0,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 = common.create_workspace(database_name) ret = client.create_table(table_name, DATA.char_normal_column_no_agg_list, keys_desc=DATA.unique_key) assert ret, 'create table failed' sql = 'insert into %s values("1", "2")' % table_name ret = client.execute(sql) assert ret == (), 'insert date failed' # null util.assert_return(False, '', client.update, table_name, ['v1=null'], 'k1=1') # 溢出 util.assert_return(False, '', client.update, table_name, ['v1="-170141183460469231731687303715884105729"'], 'k1=1') # 空串 ret = client.update(table_name, ['v1=""'], 'k1=1') assert ret, 'update table failed' common.check2(client, sql1='select * from %s' % table_name, sql2='select "1", ""') # 多个数据导入 assert client.truncate(table_name) assert len(client.select_all(table_name)) == 0 ret = client.stream_load(table_name, FILE.test_char_normal_file, max_filter_ratio=0.01) assert ret, 'stream load failed' sql = 'select k1, "-1" from %s order by k1' % table_name ret1 = client.execute(sql) ret = client.update(table_name, ['v1="-1"'], 'k1 is not null') assert ret, 'update table failed' sql = 'select k1, v1 from %s order by k1' % table_name ret2 = client.execute(sql) util.check(ret1, ret2) client.clean(database_name) def test_update_varchar(): """ { "title": "test_update_varchar", "describe": "update数据类型varchar,长度溢出,Null,空串,数据校验正确", "tag": "function,p0,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 = common.create_workspace(database_name) ret = client.create_table(table_name, DATA.varchar_least_column_no_agg_list, keys_desc=DATA.unique_key) assert ret, 'create table failed' sql = 'insert into %s values("1", "2")' % table_name ret = client.execute(sql) assert ret == (), 'insert date failed' # null util.assert_return(False, '', client.update, table_name, ['v1=null'], 'k1=1') # 溢出 util.assert_return(False, '', client.update, table_name, ['v1="-170141183460469231731687303715884105729"'], 'k1=1') # 空串 ret = client.update(table_name, ['v1=""'], 'k1=1') assert ret, 'update table failed' common.check2(client, sql1='select * from %s' % table_name, sql2='select "1", ""') # 多个数据导入 assert client.drop_table(table_name) ret = client.create_table(table_name, DATA.varchar_normal_column_no_agg_list, keys_desc=DATA.unique_key) assert ret, 'create table failed' assert len(client.select_all(table_name)) == 0 ret = client.stream_load(table_name, FILE.test_varchar_normal_file, max_filter_ratio=0.02) assert ret, 'stream load failed' sql = 'select k1, "-1" from %s order by k1' % table_name ret1 = client.execute(sql) ret = client.update(table_name, ['v1="-1"'], 'k1 is not null') assert ret, 'update table failed' sql = 'select k1, v1 from %s order by k1' % table_name ret2 = client.execute(sql) util.check(ret1, ret2) client.clean(database_name) def test_update_date(): """ { "title": "test_update_date", "describe": "update数据类型date,各种日期格式,数据校验正确", "tag": "function,p0,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 = common.create_workspace(database_name) ret = client.create_table(table_name, DATA.date_column_no_agg_list, keys_desc=DATA.unique_key) assert ret, 'create table failed' sql = 'insert into %s values("2000-01-01", "2000-01-02", "2000-01-03", "2000-01-04")' % table_name ret = client.execute(sql) assert ret == (), 'insert date failed' # null util.assert_return(False, '', client.update, table_name, ['v1=null'], 'k1="2000-01-01"') # 正常数据 ret = client.update(table_name, ['v1="2020-01-01"'], 'k1="2000-01-01"') assert ret, 'update table failed' sql1 = 'select * from %s' % table_name sql2 = 'select cast("2000-01-01" as date), cast("2020-01-01" as date), ' \ 'cast("2000-01-03" as date), cast("2000-01-04" as date)' common.check2(client, sql1, sql2=sql2) # int数据 ret = client.update(table_name, ['v1="20200102"'], 'k1="2000-01-01"') assert ret, 'update table failed' sql1 = 'select * from %s' % table_name sql2 = 'select cast("2000-01-01" as date), cast("2020-01-02" as date), ' \ 'cast("2000-01-03" as date), cast("2000-01-04" as date)' common.check2(client, sql1, sql2=sql2) # 00数据 util.assert_return(False, '', client.update, table_name, ['v1="0000-00-00"'], 'k1="2000-01-01"') # 不支持数据 util.assert_return(False, '', client.update, table_name, ['v1="2000-13-01"'], 'k1="2000-01-01"') # 多个数据导入 assert client.truncate(table_name) assert len(client.select_all(table_name)) == 0 ret = client.stream_load(table_name, FILE.test_date_file, max_filter_ratio=0.015) assert ret, 'stream load failed' sql = 'select k1, "2021-01-01", "2021-01-03", "2021-01-02" from %s order by k1' % table_name ret1 = client.execute(sql) ret = client.update(table_name, ['v1="2021-01-01"', 'v2="2021-01-03"', 'v3="2021-01-02"'], 'k1 is not null') assert ret, 'update table failed' sql = 'select k1, v1, v2, v3 from %s order by k1' % table_name ret2 = client.execute(sql) util.check(ret1, ret2) client.clean(database_name) def test_update_datetime(): """ { "title": "test_update_datetime", "describe": "update数据类型datetime,各种日期格式,数据校验正确", "tag": "function,p0,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 = common.create_workspace(database_name) ret = client.create_table(table_name, DATA.datetime_column_no_agg_list, keys_desc=DATA.unique_key) assert ret, 'create table failed' sql = 'insert into %s values("2000-01-01 00:00:00", "2000-01-02 01:00:00", ' \ '"2000-01-03 00:00:00", "2000-01-04 00:00:01")' % table_name ret = client.execute(sql) assert ret == (), 'insert date failed' # null util.assert_return(False, '', client.update, table_name, ['v1=null'], 'k1="2000-01-01 00:00:00"') # 正常 ret = client.update(table_name, ['v1="2020-01-01 00:00:00"'], 'k1="2000-01-01 00:00:00"') assert ret, 'update failed' sql1 = 'select * from %s' % table_name sql2 = 'select cast("2000-01-01 00:00:00" as datetime), cast("2020-01-01 00:00:00" as datetime), ' \ 'cast("2000-01-03 00:00:00" as datetime), cast("2000-01-04 00:00:01" as datetime)' common.check2(client, sql1, sql2=sql2) # 溢出 util.assert_return(False, '', client.update, table_name, ['v1="10020-01-01 00:00:00"'], 'k1="2000-01-01 00:00:00"') # 00数据 util.assert_return(False, '', client.update, table_name, ['v1="2020-01-00 00:00:00"'], 'k1="2000-01-01 00:00:00"') # 不支持datetime util.assert_return(False, '', client.update, table_name, ['v1="2020-13-01 00:00:00"'], 'k1="2000-01-01 00:00:00"') # 多个数据导入 assert client.truncate(table_name) assert len(client.select_all(table_name)) == 0 ret = client.stream_load(table_name, FILE.test_datetime_file, max_filter_ratio=0.015) assert ret, 'stream load failed' sql = 'select k1, "2021-01-01 08:00:00", "2021-01-03 08:00:00", "2021-01-02 08:00:00" ' \ 'from %s order by k1' % table_name ret1 = client.execute(sql) ret = client.update(table_name, ['v1="2021-01-01 08:00:00"', 'v2="2021-01-03 08:00:00"', 'v3="2021-01-02 08:00:00"'], 'k1 is not null') assert ret, 'update table failed' sql = 'select k1, v1, v2, v3 from %s order by k1' % table_name ret2 = client.execute(sql) util.check(ret1, ret2) client.clean(database_name) def test_update_decimal(): """ { "title": "test_update_decimal", "describe": "update数据类型decimal,精度溢出,数据校验正确", "tag": "function,p0,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 = common.create_workspace(database_name) ret = client.create_table(table_name, DATA.decimal_normal_column_no_agg_list, keys_desc=DATA.unique_key, set_null=True) assert ret, 'create table failed' sql = 'insert into %s values(1.001, 2.002, 3.003, 4.004, 5.006)' % table_name ret = client.execute(sql) assert ret == (), 'insert date failed' # null ret = client.update(table_name, ['v1=null'], 'k1 > 0') assert ret, 'update failed' sql1 = 'select * from %s' % table_name sql2 = 'select 1.001, null, 3.003, 4.004, 5.006' common.check2(client, sql1=sql1, sql2=sql2) # 溢出 ret = client.update(table_name, ['v1="0.00000001"'], 'k1 = 1.001') assert ret, 'update failed' sql1 = 'select * from %s' % table_name sql2 = 'select 1.001, 0, 3.003, 4.004, 5.006' common.check2(client, sql1=sql1, sql2=sql2) util.assert_return(False, '', client.update, table_name, ['v1=100000000000.001'], 'k1 = 1.001') # 格式不正确 util.assert_return(False, '', client.update, table_name, ['v1=123456'], 'k1 = 1.001') msg = 'Unexpected exception: Character a is neither a decimal digit number, ' \ 'decimal point, nor "e" notation exponential mark' util.assert_return(False, msg, client.update, table_name, ['v1="aaa"'], 'k1 = 1.001') # 多个数据导入 assert client.truncate(table_name) assert len(client.select_all(table_name)) == 0 ret = client.stream_load(table_name, FILE.test_decimal_normal_file, max_filter_ratio=0.01) assert ret, 'stream load failed' sql = 'select k1, 2.002, 3.003, 4.004, 5.006 from %s order by k1' % table_name ret1 = client.execute(sql) ret = client.update(table_name, ['v1=2.002', 'v2=3.003', 'v3=4.004', 'v4=5.006'], 'k1 is not null') assert ret, 'update table failed' sql = 'select k1, v1, v2, v3, v4 from %s order by k1' % table_name ret2 = client.execute(sql) util.check(ret1, ret2) client.clean(database_name) def test_update_double(): """ { "title": "test_update_double", "describe": "update数据类型double,精度,数据校验正确", "tag": "function,p0,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 = common.create_workspace(database_name) ret = client.create_table(table_name, DATA.double_column_no_agg_list, keys_desc=DATA.unique_key) assert ret, 'create table failed' sql = 'insert into %s values(1, 2.002, 3.003, 4.004, 5.006)' % table_name ret = client.execute(sql) assert ret == (), 'insert date failed' # null util.assert_return(False, '', client.update, table_name, ['v1=null'], 'k1=1') # 溢出 ret = client.update(table_name, ['v2="1.99999999999999999"'], 'k1=1') assert ret, 'update table failed' sql1 = 'select * from %s' % table_name sql2 = 'select 1, 2.002, 2.0, 4.004, 5.006' common.check2(client, sql1, sql2=sql2) # 格式 ret = client.update(table_name, ['v2="1.009e2"'], 'k1=1') assert ret, 'update table failed' sql2 = 'select 1, 2.002, 100.9, 4.004, 5.006' common.check2(client, sql1, sql2=sql2) ret = client.update(table_name, ['v2=2.0003e-2'], 'k1=1') assert ret, 'update table failed' sql2 = 'select 1, 2.002, 0.020003, 4.004, 5.006' common.check2(client, sql1, sql2=sql2) # msg = "'a3' is not a number" msg = 'error totally whack' util.assert_return(False, msg, client.update, table_name, ['v2="a3"'], 'k1=1') print(client.select_all(table_name)) # 多个数据导入 assert client.truncate(table_name) assert len(client.select_all(table_name)) == 0 ret = client.stream_load(table_name, FILE.test_double_int_file, max_filter_ratio=0.01) assert ret, 'stream load failed' sql = 'select k1, 2.002, 3.003, 4.004, 5.006 from %s order by k1' % table_name ret1 = client.execute(sql) ret = client.update(table_name, ['v1=2.002', 'v2=3.003', 'v3=4.004', 'v4=5.006'], 'k1 is not null') assert ret, 'update table failed' sql = 'select k1, v1, v2, v3, v4 from %s order by k1' % table_name ret2 = client.execute(sql) util.check(ret1, ret2) client.clean(database_name) def test_update_float(): """ { "title": "test_update_float", "describe": "update数据类型float,精度,数据校验正确", "tag": "function,p0,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 = common.create_workspace(database_name) ret = client.create_table(table_name, DATA.float_column_no_agg_list, keys_desc=DATA.unique_key) assert ret, 'create table failed' sql = 'insert into %s values(1, 2.002, 3.003, 4.004, 5.006)' % table_name ret = client.execute(sql) assert ret == (), 'insert date failed' # null util.assert_return(False, '', client.update, table_name, ['v1=null'], 'k1 = 1') # 溢出, todo ret = client.update(table_name, ['v2="1.99999999999999999"'], 'k1=1') assert ret, 'update table failed' sql1 = 'select * from %s' % table_name sql2 = 'select 1, 2.002, 2.0, 4.004, 5.006' common.check2(client, sql1, sql2=sql2) # 格式不正确 ret = client.update(table_name, ['v2="1.009e2"'], 'k1=1') assert ret, 'update table failed' sql1 = 'select * from %s' % table_name sql2 = 'select 1, 2.002, 100.9, 4.004, 5.006' common.check2(client, sql1, sql2=sql2) ret = client.update(table_name, ['v2=2.0003e-2'], 'k1=1') assert ret, 'update table failed' sql1 = 'select * from %s' % table_name sql2 = 'select 1, 2.002, 0.020003, 4.004, 5.006' common.check2(client, sql1, sql2=sql2) # msg = "'a3' is not a number" msg = 'error totally whack' util.assert_return(False, msg, client.update, table_name, ['v2="a3"'], 'k1=1') print(client.select_all(table_name)) # 多个数据导入 assert client.truncate(table_name) assert len(client.select_all(table_name)) == 0 ret = client.stream_load(table_name, FILE.test_float_int_file, max_filter_ratio=0.01) assert ret, 'stream load failed' sql = 'select k1, 2.002, 3.003, 4.004, 5.006 from %s order by k1' % table_name ret1 = client.execute(sql) ret = client.update(table_name, ['v1=2.002', 'v2=3.003', 'v3=4.004', 'v4=5.006'], 'k1 is not null') assert ret, 'update table failed' sql = 'select k1, v1, v2, v3, v4 from %s order by k1' % table_name ret2 = client.execute(sql) util.check(ret1, ret2) client.clean(database_name) def test_update_other_table(): """ { "title": "test_update_other_table", "describe": "update只支持unique表,不支持duplicate表和aggregate表", "tag": "function,p0,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 = common.create_workspace(database_name) # 创建不同类型的表,并导入数据 agg_tb = table_name + '_agg' dup_tb = table_name + '_dup' uniq_tb = table_name + '_uniq' ret = client.create_table(agg_tb, DATA.partition_column_list) assert ret, 'create table failed' ret = client.create_table(dup_tb, DATA.partition_column_no_agg_list) assert ret, 'create table failed' ret = client.create_table(uniq_tb, DATA.partition_column_no_agg_list, keys_desc=DATA.unique_key) assert ret, 'create table failed' for tb in [agg_tb, dup_tb, uniq_tb]: ret = client.stream_load(tb, FILE.partition_local_file) assert ret, 'stream load failed' # update不同类型的表 ret = client.update(uniq_tb, ['v2="2"'], 'k1=1') assert ret, 'update failed' msg = 'Only unique table could be updated' util.assert_return(False, msg, client.update, agg_tb, ['v2="2"'], 'k1=1') msg = 'Only unique table could be updated' util.assert_return(False, msg, client.update, dup_tb, ['v2="2"'], 'k1=1') client.clean(database_name) def test_update_key(): """ { "title": "test_update_key", "describe": "update只支持value列,不支持key列,包括分区列,分桶列", "tag": "function,p0,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 = common.create_workspace(database_name) partition_info = palo_client.PartitionInfo("k2", ["p1", "p2", "p3", "p4", "p5"], ["-10", "0", "10", "100", "MAXVALUE"]) distribution_info = palo_client.DistributionInfo('hash(k1)', 10) keys_desc = "UNIQUE KEY(k1, k2, k3, k4, k5)" ret = client.create_table(table_name, DATA.partition_column_no_agg_list, keys_desc=keys_desc, partition_info=partition_info, distribution_info=distribution_info) assert ret, 'create table failed' ret = client.stream_load(table_name, FILE.partition_local_file) assert ret, 'load data failed' # update key列/分桶列/分区列 msg = 'Only value columns of unique table could be updated' util.assert_return(False, msg, client.update, table_name, ['k3=0'], 'k1=1') msg = 'Only value columns of unique table could be updated' util.assert_return(False, msg, client.update, table_name, ['k1=-10'], 'k4=1000') msg = 'Only value columns of unique table could be updated' util.assert_return(False, msg, client.update, table_name, ['k2=-10'], 'k4=1000') client.clean(database_name) def test_update_multi_row(): """ { "title": "test_update_multi_row", "describe": "update多行数据,多个分区的多条数据", "tag": "function,p0,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 = common.create_workspace(database_name) partition_info = palo_client.PartitionInfo("k2", ["p1", "p2", "p3", "p4", "p5"], ["0", "100", "200", "300", "MAXVALUE"]) distribution_info = palo_client.DistributionInfo('hash(k1)', 10) keys_desc = "UNIQUE KEY(k1, k2, k3, k4, k5)" ret = client.create_table(table_name, DATA.partition_column_no_agg_list, keys_desc=keys_desc, partition_info=partition_info, distribution_info=distribution_info) assert ret, 'create table failed' ret = client.stream_load(table_name, FILE.partition_local_file) assert ret, 'load data failed' sql1 = 'select k1, k2, k3, k4, k5, v1, v2, "after update" v3, v4, v5, v6 from %s order by k1' % table_name ret1 = client.execute(sql1) # update多个分区的多个值 ret = client.update(table_name, ['v3="after update"'], 'k1 > 0') assert ret, 'update failed' sql2 = 'select * from %s order by k1' % table_name ret2 = client.execute(sql2) util.check(ret1, ret2) client.clean(database_name) def test_update_multi_col(): """ { "title": "test_update_multi_col", "describe": "update多个列", "tag": "function,p0,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 = common.create_workspace(database_name) partition_info = palo_client.PartitionInfo("k2", ["p1", "p2", "p3", "p4", "p5"], ["0", "100", "200", "300", "MAXVALUE"]) distribution_info = palo_client.DistributionInfo('hash(k1)', 10) keys_desc = "UNIQUE KEY(k1, k2, k3, k4, k5)" ret = client.create_table(table_name, DATA.partition_column_no_agg_list, keys_desc=keys_desc, partition_info=partition_info, distribution_info=distribution_info) assert ret, 'create table failed' ret = client.stream_load(table_name, FILE.partition_local_file) assert ret, 'load data failed' sql1 = 'select k1, k2, k3, k4, k5, "2020-01-20", "-", "after update" v3, 0, 0, 0 from %s order by k1' % table_name ret1 = client.execute(sql1) # update多个分区的多个值 ret = client.update(table_name, ['v3="after update"', 'v2="-"', 'v1="2020-01-20"', 'v4=0', 'v5=0', 'v6=0'], 'k1 > 0') assert ret, 'update failed' sql2 = 'select * from %s order by k1' % table_name ret2 = client.execute(sql2) util.check(ret1, ret2) client.clean(database_name) def test_update_empty(): """ { "title": "test_update_empty", "describe": "update空表", "tag": "function,p0,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 = common.create_workspace(database_name) partition_info = palo_client.PartitionInfo("k2", ["p1", "p2", "p3", "p4", "p5"], ["0", "100", "200", "300", "MAXVALUE"]) distribution_info = palo_client.DistributionInfo('hash(k1)', 10) keys_desc = "UNIQUE KEY(k1, k2, k3, k4, k5)" ret = client.create_table(table_name, DATA.partition_column_no_agg_list, keys_desc=keys_desc, partition_info=partition_info, distribution_info=distribution_info) assert ret, 'create table failed' # update多个分区的多个值 ret = client.update(table_name, ['v3="after update"', 'v2="-"', 'v5=0', 'v6=0'], 'k1 > 0') assert ret, 'update failed' sql2 = 'select * from %s order by k1' % table_name ret2 = client.execute(sql2) assert len(ret2) == 0, 'check data error' ret = client.stream_load(table_name, FILE.partition_local_file) assert ret, 'load data failed' assert client.verify(FILE.partition_local_file, table_name) client.clean(database_name) def test_update_condition(): """ { "title": "test_update_condition", "describe": "update中where条件,in,like,< > =,between...and,not,is null,is not null,函数,子查询,and,or, empty", "tag": "function,p0,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 = common.create_workspace(database_name) partition_info = palo_client.PartitionInfo("k2", ["p1", "p2", "p3", "p4", "p5"], ["0", "100", "200", "300", "MAXVALUE"]) distribution_info = palo_client.DistributionInfo('hash(k1)', 10) keys_desc = "UNIQUE KEY(k1, k2, k3, k4, k5)" ret = client.create_table(table_name, DATA.partition_column_no_agg_list, keys_desc=keys_desc, partition_info=partition_info, distribution_info=distribution_info) assert ret, 'create table failed' ret = client.stream_load(table_name, FILE.partition_local_file, partition_list=["p5"], max_filter_ratio=1) assert ret, 'load data failed' sql1 = 'select * from %s' % table_name sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 2579.668636' common.check2(client, sql1=sql1, sql2=sql2) # in ret = client.update(table_name, ['v6=0'], 'v2 in ("d", "a", "b")') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 0' common.check2(client, sql1=sql1, sql2=sql2) # like ret = client.update(table_name, ['v6=1'], 'v3 like "%%wnrk"') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 0' common.check2(client, sql1=sql1, sql2=sql2) ret = client.update(table_name, ['v6=1'], 'v3 like "%%wnrk%%"') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 1' common.check2(client, sql1=sql1, sql2=sql2) # 比较 ret = client.update(table_name, ['v6=2'], 'k1=30') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 2' common.check2(client, sql1=sql1, sql2=sql2) ret = client.update(table_name, ['v6=3'], 'k1 > 30') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 2' common.check2(client, sql1=sql1, sql2=sql2) ret = client.update(table_name, ['v6=3'], 'k1<=20') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 2' common.check2(client, sql1=sql1, sql2=sql2) # and ret = client.update(table_name, ['v6=3'], 'k1 >= 30 and k2 < 300') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 2' common.check2(client, sql1=sql1, sql2=sql2) ret = client.update(table_name, ['v6=3'], 'k1 in (3, 30) and k5="2040-01-01 00:00:00"') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 3' # or ret = client.update(table_name, ['v6=4'], 'k1 >= 30 or k2 < 300') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 4' common.check2(client, sql1=sql1, sql2=sql2) # is not null ret = client.update(table_name, ['v6=5'], 'v6 is not null') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 5' common.check2(client, sql1=sql1, sql2=sql2) ret = client.update(table_name, ['v6=6'], 'v6 is null') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 5' common.check2(client, sql1=sql1, sql2=sql2) # function ret = client.update(table_name, ['v6=6'], 'abs(v5) > 900') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 6' common.check2(client, sql1=sql1, sql2=sql2) # 常量表达式 ret = client.update(table_name, ['v6=7'], '1=3') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 6' common.check2(client, sql1=sql1, sql2=sql2) ret = client.update(table_name, ['v6=7'], '1=1') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 7' common.check2(client, sql1=sql1, sql2=sql2) ret = client.update(table_name, ['v6=8'], 'true') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 8' common.check2(client, sql1=sql1, sql2=sql2) ret = client.update(table_name, ['v6=9'], 'null is not null') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 8' common.check2(client, sql1=sql1, sql2=sql2) client.clean(database_name) def test_update_set(): """ { "title": "test_update_set", "describe": "update中的set设置,包含自增,函数,表达式等,", "tag": "function,p0,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 = common.create_workspace(database_name) partition_info = palo_client.PartitionInfo("k2", ["p1", "p2", "p3", "p4", "p5"], ["0", "100", "200", "300", "MAXVALUE"]) distribution_info = palo_client.DistributionInfo('hash(k1)', 10) keys_desc = "UNIQUE KEY(k1, k2, k3, k4, k5)" ret = client.create_table(table_name, DATA.partition_column_no_agg_list, keys_desc=keys_desc, partition_info=partition_info, distribution_info=distribution_info) assert ret, 'create table failed' ret = client.stream_load(table_name, FILE.partition_local_file, partition_list=["p5"], max_filter_ratio=1) assert ret, 'load data failed' sql1 = 'select * from %s' % table_name sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 2579.668636' common.check2(client, sql1=sql1, sql2=sql2) common.check2(client, sql1=sql1, sql2=sql2) # set计算表达式 ret = client.update(table_name, 'v6 = v6 + v5', 'k1=30') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 976.26649, 3555.935126' common.check2(client, sql1=sql1, sql2=sql2) # set自增 ret = client.update(table_name, 'v5 = v5 + 1', 'k1=30') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-01-30" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 977.26649, 3555.935126' common.check2(client, sql1=sql1, sql2=sql2) # set自增 & 函数 ret = client.update(table_name, 'v1 = date_add(v1, interval 2 day)', 'k1=30') assert ret, 'update failed' sql2 = 'select 30, 300, 3000, 30000, cast("2040-01-01 00:00:00" as datetime), cast("2010-02-1" as date), "d", ' \ '"tbuvpobzluhbwkljlhwnrkrhowybk", 949.57562, 977.26649, 3555.935126' common.check2(client, sql1=sql1, sql2=sql2) client.clean(database_name) def test_update_multi_table(): """ { "title": "test_update_multi_table", "describe": "同时对不同表执行update操作,update操作均可执行成功", "tag": "function,p0,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 = common.create_workspace(database_name) # init table tb1 = table_name + '_1' tb2 = table_name + '_2' ret = client.create_table(tb1, DATA.double_column_no_agg_list, keys_desc=DATA.unique_key) assert ret, 'create table failed' sql = 'insert into %s values(1, 2, 3, 4, 5)' % tb1 ret = client.execute(sql) assert ret == (), 'insert date failed' ret = client.create_table(tb2, DATA.double_column_no_agg_list, keys_desc=DATA.unique_key) assert ret, 'create table failed' sql = 'insert into %s values(1, 2, 3, 4, 5)' % tb2 ret = client.execute(sql) assert ret == (), 'insert date failed' # update client1 = common.get_client() client2 = common.get_client() update_task_1 = palo_task.SyncTask(client1.update, tb1, ['v1=v1+1'], 'k1=1', database_name) update_thread_1 = palo_task.TaskThread(update_task_1) update_thread_1.start() update_task_2 = palo_task.SyncTask(client2.update, tb2, ['v2=v2+1'], 'k1=1', database_name) update_thread_2 = palo_task.TaskThread(update_task_2) update_thread_2.start() time.sleep(10) update_thread_1.stop() update_thread_1.join() update_thread_2.stop() update_thread_2.join() print(update_task_1.succ_count) print(update_task_2.succ_count) sql1 = 'select * from %s' % tb1 sql2 = 'select 1, 2 + %s, 3, 4, 5' % update_task_1.succ_count common.check2(client, sql1=sql1, sql2=sql2) sql1 = 'select * from %s' % tb2 sql2 = 'select 1, 2, 3 + %s, 4, 5' % update_task_2.succ_count common.check2(client, sql1=sql1, sql2=sql2) client.clean(database_name) def test_concurrent_update_table_1(): """ { "title": "test_update_multi_table_1", "describe": "enable_concurrent_update=false,对同一个表执行update操作,偶发报错:There is an update operation in progress for the current table. Please try again later, or set enable_concurrent_update in fe.conf to true", "tag": "function,p0,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 = common.create_workspace(database_name) if client.user in ('root', 'admin'): ret = client.admin_show_config('enable_concurrent_update') fe_config = palo_job.AdminShowConfig(ret[0]) if fe_config.get_value() == 'true': raise pytest.skip("need to set fe config: enable_concurrent_update=false") # init table ret = client.create_table(table_name, DATA.double_column_no_agg_list, keys_desc=DATA.unique_key) assert ret, 'create table failed' sql = 'insert into %s values(1, 2, 3, 4, 5)' % table_name ret = client.execute(sql) assert ret == (), 'insert date failed' print(client.select_all(table_name)) # update client1 = common.get_client() client2 = common.get_client() update_task_1 = palo_task.SyncTask(client1.update, table_name, ['v1=v1+1'], 'k1=1', database_name) update_thread_1 = palo_task.TaskThread(update_task_1) update_thread_1.start() update_task_2 = palo_task.SyncTask(client2.update, table_name, ['v2=v2+1'], 'k1=1', database_name) update_thread_2 = palo_task.TaskThread(update_task_2) update_thread_2.start() time.sleep(10) update_thread_1.stop() update_thread_1.join() time.sleep(1) update_thread_2.stop() update_thread_2.join() time.sleep(1) LOG.info(L('there are %s update v1=v1+1 succ' % update_task_1.succ_count)) LOG.info(L('there are %s update v2=v2+1 succ' % update_task_2.succ_count)) sql1 = 'select * from %s' % table_name sql2 = 'select 1, 2 + %s, 3 + %s, 4, 5' % (update_task_1.succ_count, update_task_2.succ_count) #common.check2(client, sql1=sql1, sql2=sql2) # msg = 'There is an update operation in progress for the current table. Please try again later, or set enable_concurrent_update in fe.conf to true' def test_concurrent_update_table_2(): """ { "title": "test_update_multi_table_2", "describe": "enable_concurrent_update=fasle,对同一个表执行update操作,update的数据不冲突,偶发报错:There is an update operation in progress for the current table. Please try again later, or set enable_concurrent_update in fe.conf to true", "tag": "function,p0,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 = common.create_workspace(database_name) if client.user in ('root', 'admin'): ret = client.admin_show_config('enable_concurrent_update') fe_config = palo_job.AdminShowConfig(ret[0]) if fe_config.get_value() == 'true': raise pytest.skip("need to set fe config: enable_concurrent_update=false") # init table ret = client.create_table(table_name, DATA.double_column_no_agg_list, keys_desc=DATA.unique_key) assert ret, 'create table failed' sql = 'insert into %s values(1, 2, 3, 4, 5), (2, 3, 4, 5, 6)' % table_name ret = client.execute(sql) assert ret == (), 'insert date failed' # update client1 = common.get_client() client2 = common.get_client() update_task_1 = palo_task.SyncTask(client1.update, table_name, ['v1=v1+1'], 'k1=1', database_name) update_thread_1 = palo_task.TaskThread(update_task_1) update_thread_1.start() update_task_2 = palo_task.SyncTask(client2.update, table_name, ['v2=v2+1'], 'k1=2', database_name) update_thread_2 = palo_task.TaskThread(update_task_2) update_thread_2.start() time.sleep(10) update_thread_1.stop() update_thread_1.join() update_thread_2.stop() update_thread_2.join() LOG.info(L('there are %s update k1=1 succ' % update_task_1.succ_count)) LOG.info(L('there are %s update k1=2 succ' % update_task_2.succ_count)) sql1 = 'select * from %s' % table_name sql2 = 'select 1, 2 + %s, 3, 4, 5 union select 2, 3, 4 + %s, 5, 6' \ % (update_task_1.succ_count, update_task_2.succ_count) common.check2(client, sql1=sql1, sql2=sql2, forced=True) client.clean(database_name) def test_concurrent_update_table_3(): """ { "title": "test_update_multi_table_2", "describe": "enable_concurrent_update=true,对同一个表执行update操作,update的数据不冲突" "tag": "function,p0,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 = common.create_workspace(database_name) if client.user in ('root', 'admin'): ret = client.admin_show_config('enable_concurrent_update') fe_config = palo_job.AdminShowConfig(ret[0]) if fe_config.get_value() == 'false': raise pytest.skip("need to set fe config: enable_concurrent_update=true") # init table ret = client.create_table(table_name, DATA.double_column_no_agg_list, keys_desc=DATA.unique_key) assert ret, 'create table failed' sql = 'insert into %s values(1, 2, 3, 4, 5), (2,3,4,5,6)' % table_name ret = client.execute(sql) assert ret == (), 'insert date failed' # update client1 = common.get_client() client2 = common.get_client() update_task_1 = palo_task.SyncTask(client1.update, table_name, ['v1=v1+1'], 'k1=1', database_name) update_thread_1 = palo_task.TaskThread(update_task_1) update_thread_1.start() update_task_2 = palo_task.SyncTask(client2.update, table_name, ['v2=v2+1'], 'k1=2', database_name) update_thread_2 = palo_task.TaskThread(update_task_2) update_thread_2.start() time.sleep(10) update_thread_1.stop() update_thread_1.join() update_thread_2.stop() update_thread_2.join() LOG.info(L('there are %s update k1=1 succ' % update_task_1.succ_count)) LOG.info(L('there are %s update k1=2 succ' % update_task_2.succ_count)) sql1 = 'select * from %s' % table_name sql2 = 'select 1, 2 + %s, 3, 4, 5 union select 2, 3, 4 + %s, 5, 6' \ % (update_task_1.succ_count, update_task_2.succ_count) common.check2(client, sql1=sql1, sql2=sql2, forced=True) client.clean(database_name) def test_concurrent_update_table_4(): """ { "title": "test_update_multi_table_4", "describe": "enable_concurrent_update=true,对同一个表执行update操作,update的数据冲突" "tag": "function,p0,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 = common.create_workspace(database_name) if client.user in ('root', 'admin'): ret = client.admin_show_config('enable_concurrent_update') fe_config = palo_job.AdminShowConfig(ret[0]) if fe_config.get_value() == 'false': raise pytest.skip("need to set fe config: enable_concurrent_update=true") # init table ret = client.create_table(table_name, DATA.double_column_no_agg_list, keys_desc=DATA.unique_key) assert ret, 'create table failed' sql = 'insert into %s values(1, 2, 3, 4, 5)' % table_name ret = client.execute(sql) assert ret == (), 'insert date failed' print(client.select_all(table_name)) # update client1 = common.get_client() client2 = common.get_client() update_task_1 = palo_task.SyncTask(client1.update, table_name, ['v1=v1+1'], 'k1=1', database_name) update_thread_1 = palo_task.TaskThread(update_task_1) update_thread_1.start() update_task_2 = palo_task.SyncTask(client2.update, table_name, ['v2=v2+1'], 'k1=1', database_name) update_thread_2 = palo_task.TaskThread(update_task_2) update_thread_2.start() time.sleep(10) update_thread_1.stop() update_thread_1.join() time.sleep(1) update_thread_2.stop() update_thread_2.join() time.sleep(1) LOG.info(L('there are %s update v1=v1+1 succ' % update_task_1.succ_count)) LOG.info(L('there are %s update v2=v2+1 succ' % update_task_2.succ_count)) sql1 = 'select * from %s' % table_name sql2 = 'select 1, 2 + %s, 3 + %s, 4, 5' % (update_task_1.succ_count, update_task_2.succ_count) # common.check2(client, sql1=sql1, sql2=sql2, forced=True) client.clean(database_name) def test_update_table_with_idx(): """ { "title": "test_update_multi_table_2", "describe": "update带有索引的表,bloom filter,bitmap Index", "tag": "function,p0,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 = common.create_workspace(database_name) partition_info = palo_client.PartitionInfo("k2", ["p1", "p2", "p3", "p4", "p5"], ["0", "100", "200", "300", "MAXVALUE"]) distribution_info = palo_client.DistributionInfo('hash(k1)', 10) keys_desc = "UNIQUE KEY(k1, k2, k3)" ret = client.create_table(table_name, DATA.partition_column_no_agg_list, keys_desc=keys_desc, partition_info=partition_info, distribution_info=distribution_info) assert ret, 'create table failed' ret = client.stream_load(table_name, FILE.partition_local_file) assert ret, 'load data failed' sql1 = 'select k1, k2, k3, k4, k5, v1, "-", v3, v4, v5, 0.01 from %s order by k1' % table_name ret1 = client.execute(sql1) sql2 = 'select k1, k2, k3, 0, k5, v1, "-", v3, v4, v5, 0.01 from %s order by k1' % table_name ret2 = client.execute(sql2) ret = client.schema_change(table_name, bloom_filter_column_list=['v2', 'v6'], is_wait=True) assert ret, 'alter add bloom filter failed' ret = client.update(table_name, ['v2="-"', 'v6=0.01'], 'k1 > 0') assert ret, 'update failed' ret1_sut = client.select_all(table_name) util.check(ret1, ret1_sut, True) time.sleep(10) ret = client.create_bitmap_index_table(table_name, index_name, 'k4', is_wait=True) assert ret ret = client.update(table_name, 'k4=0', 'k1 > 0') ret2_sut = client.select_all(table_name) util.check(ret2, ret2_sut, True) client.clean(database_name) def test_update_table_with_batch_delete(): """ { "title": "test_update_table_with_batch_delete", "describe": "update开启batch delte的表 update成功", "tag": "function,p0,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 = common.create_workspace(database_name) partition_info = palo_client.PartitionInfo("k2", ["p1", "p2", "p3", "p4", "p5"], ["0", "100", "200", "300", "MAXVALUE"]) distribution_info = palo_client.DistributionInfo('hash(k1)', 10) keys_desc = "UNIQUE KEY(k1, k2, k3)" ret = client.create_table(table_name, DATA.partition_column_no_agg_list, keys_desc=keys_desc, partition_info=partition_info, distribution_info=distribution_info) assert ret, 'create table failed' try: client.enable_feature_batch_delete(table_name) except Exception as e: pass ret = client.stream_load(table_name, FILE.partition_local_file) assert ret, 'stream load failed' sql1 = 'select k1, k2, k3, k4, k5, v1, "-", v3, v4, v5, 0.01 from %s order by k1' % table_name ret1 = client.execute(sql1) ret = client.update(table_name, ['v2="-"', 'v6=0.01'], 'k1 > 0') assert ret, 'update failed' ret1_sut = client.select_all(table_name) util.check(ret1, ret1_sut, True) client.clean(database_name) def test_update_table_while_load(): """ { "title": "test_update_multi_table_2", "describe": "在update的同时,导入数据", "tag": "function,p0,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 = common.create_workspace(database_name) partition_info = palo_client.PartitionInfo("k2", ["p1", "p2", "p3", "p4", "p5"], ["0", "100", "200", "300", "MAXVALUE"]) distribution_info = palo_client.DistributionInfo('hash(k1)', 10) keys_desc = "UNIQUE KEY(k1, k2, k3)" ret = client.create_table(table_name, DATA.partition_column_no_agg_list, keys_desc=keys_desc, partition_info=partition_info, distribution_info=distribution_info) assert ret, 'create table failed' client1 = common.get_client() update_task = palo_task.SyncTask(client1.update, table_name, ['v2="0"'], 'k1 > 0', database_name) update_thread = palo_task.TaskThread(update_task) update_thread.start() time.sleep(1) ret = client.stream_load(table_name, FILE.partition_local_file) assert ret, 'stream load failed' update_thread.stop() update_thread.join() ret = client.select_all(table_name) assert len(ret) == 30, 'check data error' client.clean(database_name) def test_update_table_while_delete(): """ { "title": "test_update_multi_table_2", "describe": "在update的同时,删除数据,偶发:doris-1130", "tag": "function,p0,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 = common.create_workspace(database_name) distribution_info = palo_client.DistributionInfo('hash(k1)', 10) keys_desc = "UNIQUE KEY(k1, k2, k3)" ret = client.create_table(table_name, DATA.partition_column_no_agg_list, keys_desc=keys_desc, distribution_info=distribution_info) assert ret, 'create table failed' ret = client.stream_load(table_name, FILE.partition_local_file) assert ret, 'stream load failed' client1 = common.get_client() update_task = palo_task.SyncTask(client1.update, table_name, ['v2="0"'], 'k1 > 0', database_name) update_task.interval = 0 update_thread = palo_task.TaskThread(update_task) update_thread.start() ret = client.delete(table_name, [("k1", ">", "20")]) assert ret, 'delete failed' time.sleep(1) update_thread.stop() update_thread.join() ret = client.select_all(table_name) print(len(ret)) # assert len(ret) == 20, 'check data error, there are %s rows' % len(ret) client.clean(database_name) def test_update_table_while_add_column(): """ { "title": "test_update_table_while_add_column", "describe": "在update的同时,加列", "tag": "function,p0,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 = common.create_workspace(database_name) partition_info = palo_client.PartitionInfo("k2", ["p1", "p2", "p3", "p4", "p5"], ["0", "100", "200", "300", "MAXVALUE"]) distribution_info = palo_client.DistributionInfo('hash(k1)', 10) keys_desc = "UNIQUE KEY(k1, k2, k3)" ret = client.create_table(table_name, DATA.partition_column_no_agg_list, keys_desc=keys_desc, partition_info=partition_info, distribution_info=distribution_info) assert ret, 'create table failed' ret = client.stream_load(table_name, FILE.partition_local_file) assert ret, 'stream load failed' client1 = common.get_client() update_task = palo_task.SyncTask(client1.update, table_name, ['v2="0"'], 'k1 > 0', database_name) update_thread = palo_task.TaskThread(update_task) update_thread.start() # add column ret = client.schema_change_add_column(table_name, [('v_add', 'INT', '', '0')], is_wait_job=True) assert ret, 'add column failed' update_thread.stop() update_thread.join() ret = client.select_all(table_name) client.clean(database_name) def test_update_table_while_drop_column(): """ { "title": "test_update_table_while_drop_column", "describe": "在update的同时,减列", "tag": "function,p0,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 = common.create_workspace(database_name) partition_info = palo_client.PartitionInfo("k2", ["p1", "p2", "p3", "p4", "p5"], ["0", "100", "200", "300", "MAXVALUE"]) distribution_info = palo_client.DistributionInfo('hash(k1)', 10) keys_desc = "UNIQUE KEY(k1, k2, k3)" ret = client.create_table(table_name, DATA.partition_column_no_agg_list, keys_desc=keys_desc, partition_info=partition_info, distribution_info=distribution_info) assert ret, 'create table failed' ret = client.stream_load(table_name, FILE.partition_local_file) assert ret, 'stream load failed' sql1 = 'select k1, k2, k3, k4, k5, v1, "0", v3, v4, v5 from %s order by k1' % table_name ret1 = client.execute(sql1) client1 = common.get_client() update_task = palo_task.SyncTask(client1.update, table_name, ['v2="0"'], 'k1 > 0', database_name) update_thread = palo_task.TaskThread(update_task) update_thread.start() # add column ret = client.schema_change_drop_column(table_name, ['v6'], is_wait_job=True) assert ret, 'add column failed' update_thread.stop() update_thread.join() ret = client.select_all(table_name) util.check(ret, ret1, True) client.clean(database_name) def test_update_table_while_modify_column(): """ { "title": "test_update_table_while_modify_column", "describe": "在update的同时,修改列", "tag": "function,p0,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 = common.create_workspace(database_name) partition_info = palo_client.PartitionInfo("k2", ["p1", "p2", "p3", "p4", "p5"], ["0", "100", "200", "300", "MAXVALUE"]) distribution_info = palo_client.DistributionInfo('hash(k1)', 10) keys_desc = "UNIQUE KEY(k1, k2, k3)" ret = client.create_table(table_name, DATA.partition_column_no_agg_list, keys_desc=keys_desc, partition_info=partition_info, distribution_info=distribution_info) assert ret, 'create table failed' ret = client.stream_load(table_name, FILE.partition_local_file) assert ret, 'stream load failed' client1 = common.get_client() update_task = palo_task.SyncTask(client1.update, table_name, ['v2="0"'], 'k1 > 0', database_name) update_thread = palo_task.TaskThread(update_task) update_thread.start() # modify column ret = client.schema_change_modify_column(table_name, 'v2', 'char(5)', is_wait_job=True, aggtype='-') assert ret, 'add column failed' update_thread.stop() update_thread.join() ret = client.select_all(table_name) client.clean(database_name) def test_update_table_while_rollup(): """ { "title": "test_update_table_while_rollup", "describe": "在update的同时,创建rollup", "tag": "function,p0,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 = common.create_workspace(database_name) partition_info = palo_client.PartitionInfo("k2", ["p1", "p2", "p3", "p4", "p5"], ["0", "100", "200", "300", "MAXVALUE"]) distribution_info = palo_client.DistributionInfo('hash(k1)', 10) keys_desc = "UNIQUE KEY(k1, k2, k3)" ret = client.create_table(table_name, DATA.partition_column_no_agg_list, keys_desc=keys_desc, partition_info=partition_info, distribution_info=distribution_info) assert ret, 'create table failed' ret = client.stream_load(table_name, FILE.partition_local_file) assert ret, 'stream load failed' client1 = common.get_client() update_task = palo_task.SyncTask(client1.update, table_name, ['v2="0"'], 'k1 > 0', database_name) update_thread = palo_task.TaskThread(update_task) update_thread.start() # create rollup ret = client.create_rollup_table(table_name, index_name, ['k1', 'k3', 'k2', 'v2', 'v6'], is_wait=True) assert ret, 'create rollup failed' update_thread.stop() update_thread.join() ret = client.select_all(table_name) client.clean(database_name) if __name__ == '__main__': setup_module() #test_update_condition() test_update_table_while_add_column()