mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-23 16:12:01 +00:00
Try to make variant tests a bit faster
This commit is contained in:
parent
a51aa7b668
commit
18578c7b1b
@ -12,52 +12,52 @@ CH_CLIENT="$CLICKHOUSE_CLIENT --allow_experimental_variant_type=1"
|
||||
function test1_insert()
|
||||
{
|
||||
echo "test1 insert"
|
||||
$CH_CLIENT -q "insert into test select number, NULL from numbers(3);"
|
||||
$CH_CLIENT -q "insert into test select number + 3, number from numbers(3);"
|
||||
$CH_CLIENT -q "insert into test select number + 6, 'str_' || toString(number) from numbers(3);"
|
||||
$CH_CLIENT -q "insert into test select number + 9, ('lc_str_' || toString(number))::LowCardinality(String) from numbers(3);"
|
||||
$CH_CLIENT -q "insert into test select number + 12, tuple(number, number + 1)::Tuple(a UInt32, b UInt32) from numbers(3);"
|
||||
$CH_CLIENT -q "insert into test select number + 15, range(number + 1)::Array(UInt64) from numbers(3);"
|
||||
$CH_CLIENT -nmq "insert into test select number, NULL from numbers(3);
|
||||
insert into test select number + 3, number from numbers(3);
|
||||
insert into test select number + 6, 'str_' || toString(number) from numbers(3);
|
||||
insert into test select number + 9, ('lc_str_' || toString(number))::LowCardinality(String) from numbers(3);
|
||||
insert into test select number + 12, tuple(number, number + 1)::Tuple(a UInt32, b UInt32) from numbers(3);
|
||||
insert into test select number + 15, range(number + 1)::Array(UInt64) from numbers(3);"
|
||||
}
|
||||
|
||||
function test1_select()
|
||||
{
|
||||
echo "test1 select"
|
||||
$CH_CLIENT -q "select v from test order by id;"
|
||||
$CH_CLIENT -q "select v.String from test order by id;"
|
||||
$CH_CLIENT -q "select v.UInt64 from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`LowCardinality(String)\` from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\` from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\`.a from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\`.b from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`Array(UInt64)\` from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`Array(UInt64)\`.size0 from test order by id;"
|
||||
$CH_CLIENT -nmq "select v from test order by id;
|
||||
select v.String from test order by id;
|
||||
select v.UInt64 from test order by id;
|
||||
select v.\`LowCardinality(String)\` from test order by id;
|
||||
select v.\`Tuple(a UInt32, b UInt32)\` from test order by id;
|
||||
select v.\`Tuple(a UInt32, b UInt32)\`.a from test order by id;
|
||||
select v.\`Tuple(a UInt32, b UInt32)\`.b from test order by id;
|
||||
select v.\`Array(UInt64)\` from test order by id;
|
||||
select v.\`Array(UInt64)\`.size0 from test order by id;"
|
||||
echo "-----------------------------------------------------------------------------------------------------------"
|
||||
}
|
||||
|
||||
function test2_insert()
|
||||
{
|
||||
echo "test2 insert"
|
||||
$CH_CLIENT -q "insert into test select number, NULL from numbers(3);"
|
||||
$CH_CLIENT -q "insert into test select number + 3, number % 2 ? NULL : number from numbers(3);"
|
||||
$CH_CLIENT -q "insert into test select number + 6, number % 2 ? NULL : 'str_' || toString(number) from numbers(3);"
|
||||
$CH_CLIENT -q "insert into test select number + 9, number % 2 ? CAST(NULL, 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') : CAST(('lc_str_' || toString(number))::LowCardinality(String), 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') from numbers(3);"
|
||||
$CH_CLIENT -q "insert into test select number + 12, number % 2 ? CAST(NULL, 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') : CAST(tuple(number, number + 1)::Tuple(a UInt32, b UInt32), 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') from numbers(3);"
|
||||
$CH_CLIENT -q "insert into test select number + 15, number % 2 ? CAST(NULL, 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') : CAST(range(number + 1)::Array(UInt64), 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') from numbers(3);"
|
||||
$CH_CLIENT -nmq "insert into test select number, NULL from numbers(3);
|
||||
insert into test select number + 3, number % 2 ? NULL : number from numbers(3);
|
||||
insert into test select number + 6, number % 2 ? NULL : 'str_' || toString(number) from numbers(3);
|
||||
insert into test select number + 9, number % 2 ? CAST(NULL, 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') : CAST(('lc_str_' || toString(number))::LowCardinality(String), 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') from numbers(3);
|
||||
insert into test select number + 12, number % 2 ? CAST(NULL, 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') : CAST(tuple(number, number + 1)::Tuple(a UInt32, b UInt32), 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') from numbers(3);
|
||||
insert into test select number + 15, number % 2 ? CAST(NULL, 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') : CAST(range(number + 1)::Array(UInt64), 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') from numbers(3);"
|
||||
}
|
||||
|
||||
function test2_select()
|
||||
{
|
||||
echo "test2 select"
|
||||
$CH_CLIENT -q "select v from test order by id;"
|
||||
$CH_CLIENT -q "select v.String from test order by id;"
|
||||
$CH_CLIENT -q "select v.UInt64 from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`LowCardinality(String)\` from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\` from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\`.a from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\`.b from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`Array(UInt64)\` from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`Array(UInt64)\`.size0 from test order by id;"
|
||||
$CH_CLIENT -nmq "select v from test order by id;
|
||||
select v.String from test order by id;
|
||||
select v.UInt64 from test order by id;
|
||||
select v.\`LowCardinality(String)\` from test order by id;
|
||||
select v.\`Tuple(a UInt32, b UInt32)\` from test order by id;
|
||||
select v.\`Tuple(a UInt32, b UInt32)\`.a from test order by id;
|
||||
select v.\`Tuple(a UInt32, b UInt32)\`.b from test order by id;
|
||||
select v.\`Array(UInt64)\` from test order by id;
|
||||
select v.\`Array(UInt64)\`.size0 from test order by id;"
|
||||
echo "-----------------------------------------------------------------------------------------------------------"
|
||||
}
|
||||
|
||||
@ -70,15 +70,15 @@ function test3_insert()
|
||||
function test3_select()
|
||||
{
|
||||
echo "test3 select"
|
||||
$CH_CLIENT -q "select v from test order by id;"
|
||||
$CH_CLIENT -q "select v.String from test order by id;"
|
||||
$CH_CLIENT -q "select v.UInt64 from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`LowCardinality(String)\` from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\` from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\`.a from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\`.b from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`Array(UInt64)\` from test order by id;"
|
||||
$CH_CLIENT -q "select v.\`Array(UInt64)\`.size0 from test order by id;"
|
||||
$CH_CLIENT -nmq "select v from test order by id;
|
||||
select v.String from test order by id;
|
||||
select v.UInt64 from test order by id;
|
||||
select v.\`LowCardinality(String)\` from test order by id;
|
||||
select v.\`Tuple(a UInt32, b UInt32)\` from test order by id;
|
||||
select v.\`Tuple(a UInt32, b UInt32)\`.a from test order by id;
|
||||
select v.\`Tuple(a UInt32, b UInt32)\`.b from test order by id;
|
||||
select v.\`Array(UInt64)\` from test order by id;
|
||||
select v.\`Array(UInt64)\`.size0 from test order by id;"
|
||||
echo "-----------------------------------------------------------------------------------------------------------"
|
||||
}
|
||||
|
||||
|
@ -12,34 +12,34 @@ CH_CLIENT="$CLICKHOUSE_CLIENT --allow_experimental_variant_type=1"
|
||||
function test4_insert()
|
||||
{
|
||||
echo "test4 insert"
|
||||
$CH_CLIENT -q "insert into test select number, NULL from numbers(200000);"
|
||||
$CH_CLIENT -q "insert into test select number + 200000, number from numbers(200000);"
|
||||
$CH_CLIENT -q "insert into test select number + 400000, 'str_' || toString(number) from numbers(200000);"
|
||||
$CH_CLIENT -q "insert into test select number + 600000, ('lc_str_' || toString(number))::LowCardinality(String) from numbers(200000);"
|
||||
$CH_CLIENT -q "insert into test select number + 800000, tuple(number, number + 1)::Tuple(a UInt32, b UInt32) from numbers(200000);"
|
||||
$CH_CLIENT -q "insert into test select number + 1000000, range(number % 20 + 1)::Array(UInt64) from numbers(200000);"
|
||||
$CH_CLIENT -nmq "insert into test select number, NULL from numbers(200000);
|
||||
insert into test select number + 200000, number from numbers(200000);
|
||||
insert into test select number + 400000, 'str_' || toString(number) from numbers(200000);
|
||||
insert into test select number + 600000, ('lc_str_' || toString(number))::LowCardinality(String) from numbers(200000);
|
||||
insert into test select number + 800000, tuple(number, number + 1)::Tuple(a UInt32, b UInt32) from numbers(200000);
|
||||
insert into test select number + 1000000, range(number % 20 + 1)::Array(UInt64) from numbers(200000);"
|
||||
}
|
||||
|
||||
function test4_select
|
||||
{
|
||||
echo "test4 select"
|
||||
$CH_CLIENT -q "select v from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v);"
|
||||
$CH_CLIENT -q "select v.String from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.String);"
|
||||
$CH_CLIENT -q "select v.UInt64 from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.UInt64);"
|
||||
$CH_CLIENT -q "select v.\`LowCardinality(String)\` from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.\`LowCardinality(String)\`);"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\` from test format Null;"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\`.a from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.\`Tuple(a UInt32, b UInt32)\`.a);"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\`.b from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.\`Tuple(a UInt32, b UInt32)\`.b);"
|
||||
$CH_CLIENT -q "select v.\`Array(UInt64)\` from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where not empty(v.\`Array(UInt64)\`);"
|
||||
$CH_CLIENT -q "select v.\`Array(UInt64)\`.size0 from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.\`Array(UInt64)\`.size0);"
|
||||
$CH_CLIENT -nmq "select v from test format Null;
|
||||
select count() from test where isNotNull(v);
|
||||
select v.String from test format Null;
|
||||
select count() from test where isNotNull(v.String);
|
||||
select v.UInt64 from test format Null;
|
||||
select count() from test where isNotNull(v.UInt64);
|
||||
select v.\`LowCardinality(String)\` from test format Null;
|
||||
select count() from test where isNotNull(v.\`LowCardinality(String)\`);
|
||||
select v.\`Tuple(a UInt32, b UInt32)\` from test format Null;
|
||||
select v.\`Tuple(a UInt32, b UInt32)\`.a from test format Null;
|
||||
select count() from test where isNotNull(v.\`Tuple(a UInt32, b UInt32)\`.a);
|
||||
select v.\`Tuple(a UInt32, b UInt32)\`.b from test format Null;
|
||||
select count() from test where isNotNull(v.\`Tuple(a UInt32, b UInt32)\`.b);
|
||||
select v.\`Array(UInt64)\` from test format Null;
|
||||
select count() from test where not empty(v.\`Array(UInt64)\`);
|
||||
select v.\`Array(UInt64)\`.size0 from test format Null;
|
||||
select count() from test where isNotNull(v.\`Array(UInt64)\`.size0);"
|
||||
}
|
||||
|
||||
function run()
|
||||
|
@ -12,34 +12,36 @@ CH_CLIENT="$CLICKHOUSE_CLIENT --allow_experimental_variant_type=1"
|
||||
function test5_insert()
|
||||
{
|
||||
echo "test5 insert"
|
||||
$CH_CLIENT -q "insert into test select number, NULL from numbers(200000);"
|
||||
$CH_CLIENT -q "insert into test select number + 200000, number % 2 ? NULL : number from numbers(200000);"
|
||||
$CH_CLIENT -q "insert into test select number + 400000, number % 2 ? NULL : 'str_' || toString(number) from numbers(200000);"
|
||||
$CH_CLIENT -q "insert into test select number + 600000, number % 2 ? CAST(NULL, 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') : CAST(('lc_str_' || toString(number))::LowCardinality(String), 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') from numbers(200000);"
|
||||
$CH_CLIENT -q "insert into test select number + 800000, number % 2 ? CAST(NULL, 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') : CAST(tuple(number, number + 1)::Tuple(a UInt32, b UInt32), 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') from numbers(200000);"
|
||||
$CH_CLIENT -q "insert into test select number + 1000000, number % 2 ? CAST(NULL, 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') : CAST(range(number % 20 + 1)::Array(UInt64), 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') from numbers(200000);"
|
||||
$CH_CLIENT -nmq "
|
||||
insert into test select number, NULL from numbers(200000);
|
||||
insert into test select number + 200000, number % 2 ? NULL : number from numbers(200000);
|
||||
insert into test select number + 400000, number % 2 ? NULL : 'str_' || toString(number) from numbers(200000);
|
||||
insert into test select number + 600000, number % 2 ? CAST(NULL, 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') : CAST(('lc_str_' || toString(number))::LowCardinality(String), 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') from numbers(200000);
|
||||
insert into test select number + 800000, number % 2 ? CAST(NULL, 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') : CAST(tuple(number, number + 1)::Tuple(a UInt32, b UInt32), 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') from numbers(200000);
|
||||
insert into test select number + 1000000, number % 2 ? CAST(NULL, 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') : CAST(range(number % 20 + 1)::Array(UInt64), 'Variant(String, UInt64, LowCardinality(String), Tuple(a UInt32, b UInt32), Array(UInt64))') from numbers(200000);"
|
||||
}
|
||||
|
||||
function test5_select()
|
||||
{
|
||||
echo "test5 select"
|
||||
$CH_CLIENT -q "select v from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v);"
|
||||
$CH_CLIENT -q "select v.String from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.String);"
|
||||
$CH_CLIENT -q "select v.UInt64 from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.UInt64);"
|
||||
$CH_CLIENT -q "select v.\`LowCardinality(String)\` from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.\`LowCardinality(String)\`);"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\` from test format Null;"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\`.a from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.\`Tuple(a UInt32, b UInt32)\`.a);"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\`.b from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.\`Tuple(a UInt32, b UInt32)\`.b);"
|
||||
$CH_CLIENT -q "select v.\`Array(UInt64)\` from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where not empty(v.\`Array(UInt64)\`);"
|
||||
$CH_CLIENT -q "select v.\`Array(UInt64)\`.size0 from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.\`Array(UInt64)\`.size0);"
|
||||
$CH_CLIENT -nmq "
|
||||
select v from test format Null;
|
||||
select count() from test where isNotNull(v);
|
||||
select v.String from test format Null;
|
||||
select count() from test where isNotNull(v.String);
|
||||
select v.UInt64 from test format Null;
|
||||
select count() from test where isNotNull(v.UInt64);
|
||||
select v.\`LowCardinality(String)\` from test format Null;
|
||||
select count() from test where isNotNull(v.\`LowCardinality(String)\`);
|
||||
select v.\`Tuple(a UInt32, b UInt32)\` from test format Null;
|
||||
select v.\`Tuple(a UInt32, b UInt32)\`.a from test format Null;
|
||||
select count() from test where isNotNull(v.\`Tuple(a UInt32, b UInt32)\`.a);
|
||||
select v.\`Tuple(a UInt32, b UInt32)\`.b from test format Null;
|
||||
select count() from test where isNotNull(v.\`Tuple(a UInt32, b UInt32)\`.b);
|
||||
select v.\`Array(UInt64)\` from test format Null;
|
||||
select count() from test where not empty(v.\`Array(UInt64)\`);
|
||||
select v.\`Array(UInt64)\`.size0 from test format Null;
|
||||
select count() from test where isNotNull(v.\`Array(UInt64)\`.size0);"
|
||||
}
|
||||
|
||||
function run()
|
||||
|
@ -18,23 +18,23 @@ function test6_insert()
|
||||
function test6_select()
|
||||
{
|
||||
echo "test6 select"
|
||||
$CH_CLIENT -q "select v from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v);"
|
||||
$CH_CLIENT -q "select v.String from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.String);"
|
||||
$CH_CLIENT -q "select v.UInt64 from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.UInt64);"
|
||||
$CH_CLIENT -q "select v.\`LowCardinality(String)\` from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.\`LowCardinality(String)\`);"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\` from test format Null;"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\`.a from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.\`Tuple(a UInt32, b UInt32)\`.a);"
|
||||
$CH_CLIENT -q "select v.\`Tuple(a UInt32, b UInt32)\`.b from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.\`Tuple(a UInt32, b UInt32)\`.b);"
|
||||
$CH_CLIENT -q "select v.\`Array(UInt64)\` from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where not empty(v.\`Array(UInt64)\`);"
|
||||
$CH_CLIENT -q "select v.\`Array(UInt64)\`.size0 from test format Null;"
|
||||
$CH_CLIENT -q "select count() from test where isNotNull(v.\`Array(UInt64)\`.size0);"
|
||||
$CH_CLIENT -nmq "select v from test format Null;
|
||||
select count() from test where isNotNull(v);
|
||||
select v.String from test format Null;
|
||||
select count() from test where isNotNull(v.String);
|
||||
select v.UInt64 from test format Null;
|
||||
select count() from test where isNotNull(v.UInt64);
|
||||
select v.\`LowCardinality(String)\` from test format Null;
|
||||
select count() from test where isNotNull(v.\`LowCardinality(String)\`);
|
||||
select v.\`Tuple(a UInt32, b UInt32)\` from test format Null;
|
||||
select v.\`Tuple(a UInt32, b UInt32)\`.a from test format Null;
|
||||
select count() from test where isNotNull(v.\`Tuple(a UInt32, b UInt32)\`.a);
|
||||
select v.\`Tuple(a UInt32, b UInt32)\`.b from test format Null;
|
||||
select count() from test where isNotNull(v.\`Tuple(a UInt32, b UInt32)\`.b);
|
||||
select v.\`Array(UInt64)\` from test format Null;
|
||||
select count() from test where not empty(v.\`Array(UInt64)\`);
|
||||
select v.\`Array(UInt64)\`.size0 from test format Null;
|
||||
select count() from test where isNotNull(v.\`Array(UInt64)\`.size0);"
|
||||
echo "-----------------------------------------------------------------------------------------------------------"
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user