Files
doris/pytest/sys/test_sys_update_basic.py
T

1480 lines
67 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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()