Skip to content

Commit

Permalink
fix(query): fix read small parquet files in cluster mode (#17063)
Browse files Browse the repository at this point in the history
* fix(query): fix read small parquet files in cluster mode

* fix tests

* fix tests

* fix tests

* fix tests

* fix tests
  • Loading branch information
sundy-li authored Dec 18, 2024
1 parent 89b78fb commit 41e51e5
Show file tree
Hide file tree
Showing 60 changed files with 385 additions and 109 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -71,12 +71,11 @@ pub struct ParquetTableInfo {
pub files_to_read: Option<Vec<StageFileInfo>>,
pub schema_from: String,
pub compression_ratio: f64,
pub leaf_fields: Arc<Vec<TableField>>,

// These fields are only used in coordinator node of the cluster,
// so we don't need to serialize them.
#[serde(skip)]
pub leaf_fields: Arc<Vec<TableField>>,
#[serde(skip)]
pub parquet_metas: Arc<Mutex<Vec<Arc<FullParquetMeta>>>>,
#[serde(skip)]
pub need_stats_provider: bool,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ fn create_writer(
.set_max_row_group_size(MAX_ROW_GROUP_SIZE)
.set_encoding(Encoding::PLAIN)
.set_dictionary_enabled(false)
.set_statistics_enabled(EnabledStatistics::None)
.set_statistics_enabled(EnabledStatistics::Chunk)
.set_bloom_filter_enabled(false)
.set_created_by(format!("Databend {}", *DATABEND_SEMVER))
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ echo "checking that 3 snapshots exist"
echo "select count(*) from fuse_snapshot('default', 'fuse_test_flashback')" | $BENDSQL_CLIENT_CONNECT

# write down 2 new rows using current version
echo "insert into fuse_test_flashback values (4)" | $BENDSQL_CLIENT_CONNECT
echo "insert into fuse_test_flashback values (5)" | $BENDSQL_CLIENT_CONNECT
echo "insert into fuse_test_flashback values (4)" | $BENDSQL_CLIENT_OUTPUT_NULL
echo "insert into fuse_test_flashback values (5)" | $BENDSQL_CLIENT_OUTPUT_NULL

# the table now contains five rows {1,2,3,4,5}, and 5 snapshots:
# s1 {1}, s2 {1,2}, s3 {1,2,3}, s4 {1,2,3,4}, s5 {1,2,3,4,5}
Expand Down Expand Up @@ -121,7 +121,7 @@ echo "suite: mixed versioned segment compaction test"
# creation of s5:
#---------------
# insert another row, which will produce a new snapshot s5 {1,2,3,4}, of version 3
echo "insert into t2 values (4)" | $BENDSQL_CLIENT_CONNECT
echo "insert into t2 values (4)" | $BENDSQL_CLIENT_OUTPUT_NULL

# s5 now contains 3 segments, 2 of version 2, and 1 of version 3
# - v2 segment_1: {1,2}, v2 segment_2: {3}, v3 segment_3: {4}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ echo "checking that 3 snapshots exist"
echo "select count(*) from fuse_snapshot('default', 'fuse_test_flashback')" | $BENDSQL_CLIENT_CONNECT

# write down 2 new rows using current version
echo "insert into fuse_test_flashback values (4)" | $BENDSQL_CLIENT_CONNECT
echo "insert into fuse_test_flashback values (5)" | $BENDSQL_CLIENT_CONNECT
echo "insert into fuse_test_flashback values (4)" | $BENDSQL_CLIENT_OUTPUT_NULL
echo "insert into fuse_test_flashback values (5)" | $BENDSQL_CLIENT_OUTPUT_NULL

# the table now contains five rows {1,2,3,4,5}, and 5 snapshots:
# s1 {1}, s2 {1,2}, s3 {1,2,3}, s4 {1,2,3,4}, s5 {1,2,3,4,5}
Expand Down Expand Up @@ -121,7 +121,7 @@ echo "suite: mixed versioned segment compaction test"
# creation of s5:
#---------------
# insert another row, which will produce a new snapshot s5 {1,2,3,4}, of version 3
echo "insert into t2 values (4)" | $BENDSQL_CLIENT_CONNECT
echo "insert into t2 values (4)" | $BENDSQL_CLIENT_OUTPUT_NULL

# s5 now contains 3 segments, 2 of version 3, and 1 of version 4
# - v2 segment_1: {1,2}, v2 segment_2: {3}, v3 segment_3: {4}
Expand Down
15 changes: 14 additions & 1 deletion tests/databend-test
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@ def run_tests_array(all_tests_with_params):
result_is_different = subprocess.call(
['diff', '-q', result_file, stdout_file],
stdout=PIPE)
if result_is_different:
if not args.complete and result_is_different:
diff = Popen(
[
'diff', '-U',
Expand All @@ -369,6 +369,15 @@ def run_tests_array(all_tests_with_params):
status += " - result differs with:\n{}\n"\
.format(diff)
else:
if args.complete:
o = Popen(
[
'cp',
stdout_file,
result_file
],
stdout=PIPE,
universal_newlines=True).communicate()[0]
passed_total += 1
failures_chain = 0
status += MSG_OK
Expand Down Expand Up @@ -694,6 +703,10 @@ if __name__ == '__main__':
parser.add_argument('--run-dir',
nargs='+',
help="Only run these tests in the dir")
parser.add_argument('--complete',
action='store_true',
default=False,
help="complete results")
parser.add_argument('--stop',
action='store_true',
default=None,
Expand Down
2 changes: 2 additions & 0 deletions tests/shell_env.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ export QUERY_CLICKHOUSE_HTTP_HANDLER_PORT=${QUERY_CLICKHOUSE_HTTP_HANDLER_PORT:=


export BENDSQL_CLIENT_CONNECT="bendsql -uroot --host ${QUERY_MYSQL_HANDLER_HOST} --port ${QUERY_HTTP_HANDLER_PORT} --quote-style=never"
export BENDSQL_CLIENT_OUTPUT_NULL="bendsql -uroot --host ${QUERY_MYSQL_HANDLER_HOST} --port ${QUERY_HTTP_HANDLER_PORT} --quote-style=never --output null"


# share client
export QUERY_MYSQL_HANDLER_SHARE_PROVIDER_PORT="18000"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ remove @data/unload/parquet/null_if/
query
copy into @data/unload/parquet/null_if from string
----
3 56 365
3 56 387

statement ok
drop file format if exists parquet_null_if
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ remove @data/parquet/unload/uuid
query
copy into @data/parquet/unload/uuid/ from (select 1 as a) file_format = (type = parquet)
----
1 1 356
1 1 374

query error column id doesn't exist
copy into t_uuid from @data/parquet/unload/uuid file_format = (type = parquet) RETURN_FAILED_ONLY=TRUE
Expand All @@ -22,7 +22,7 @@ select * from t_uuid
query
copy into @data/parquet/unload/uuid/ from (select 1 as a) file_format = (type = parquet)
----
1 1 356
1 1 374

statement ok
truncate table t_uuid
Expand Down
4 changes: 2 additions & 2 deletions tests/suites/0_stateless/03_dml/03_0016_update_with_lock.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ echo "set global enable_table_lock = 1" | $BENDSQL_CLIENT_CONNECT
for i in $(seq 1 10);do
(
j=$(($i+1))
echo "insert into test_update.t values($i, $j)" | $BENDSQL_CLIENT_CONNECT
echo "insert into test_update.t values($i, $j)" | $BENDSQL_CLIENT_OUTPUT_NULL
)&
done
wait
Expand All @@ -23,7 +23,7 @@ echo "select count() from test_update.t where a + 1 = b" | $BENDSQL_CLIENT_CONNE
echo "Test table lock for update"
for i in $(seq 1 10);do
(
echo "update test_update.t set b = $i where a = $i" | $BENDSQL_CLIENT_CONNECT
echo "update test_update.t set b = $i where a = $i" | $BENDSQL_CLIENT_OUTPUT_NULL
)&
done
wait
Expand Down
3 changes: 2 additions & 1 deletion tests/suites/0_stateless/05_hints/05_0001_set_var.result
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ storage_read_buffer_size 1048576
4
America/Toronto
America/Toronto
1
2022-02-02 03:00:00
2022-02-02 03:00:00
1 13 387
1 13 427
Asia/Shanghai
14 changes: 6 additions & 8 deletions tests/suites/0_stateless/05_hints/05_0001_set_var.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,21 @@ echo "select /*+ SET_VAR(storage_read_buffer_size=200) SET_VAR(timezone=x) */ na
echo "drop database if exists set_var;" | $BENDSQL_CLIENT_CONNECT
echo "create database set_var;" | $BENDSQL_CLIENT_CONNECT
echo "create table set_var.test(id int);" | $BENDSQL_CLIENT_CONNECT
echo "insert /*+SET_VAR(timezone='Asia/Shanghai') SET_VAR(storage_read_buffer_size=200)*/ into set_var.test values(1)" | $BENDSQL_CLIENT_CONNECT
echo "insert /*+SET_VAR(timezone='Asia/Shanghai') (storage_read_buffer_size=200)*/ into set_var.test values(3)" | $BENDSQL_CLIENT_CONNECT
echo "insert /*+SET_VAR(timezone='Asia/Shanghai') SET_VAR(storage_read_buffer_size=200)*/ into set_var.test values(1)" | $BENDSQL_CLIENT_OUTPUT_NULL
echo "insert /*+SET_VAR(timezone='Asia/Shanghai') (storage_read_buffer_size=200)*/ into set_var.test values(3)" | $BENDSQL_CLIENT_OUTPUT_NULL
echo "select /*+SET_VAR(timezone='Asia/Shanghai') SET_VAR(storage_read_buffer_size=200)*/ * from set_var.test order by id" | $BENDSQL_CLIENT_CONNECT
echo "select /*+SET_VAR(timezone='Asia/Shanghai') (storage_read_buffer_size=200)*/ id from set_var.test order by id" | $BENDSQL_CLIENT_CONNECT
echo "update /*+SET_VAR(timezone='Asia/Shanghai') SET_VAR(storage_read_buffer_size=200)*/ set_var.test set id=2 where id=1" | $BENDSQL_CLIENT_CONNECT
echo "update /*+SET_VAR(timezone='Asia/Shanghai') (storage_read_buffer_size=200)*/ set_var.test set id=4 where id=3" | $BENDSQL_CLIENT_CONNECT
echo "update /*+SET_VAR(timezone='Asia/Shanghai') SET_VAR(storage_read_buffer_size=200)*/ set_var.test set id=2 where id=1" | $BENDSQL_CLIENT_OUTPUT_NULL
echo "update /*+SET_VAR(timezone='Asia/Shanghai') (storage_read_buffer_size=200)*/ set_var.test set id=4 where id=3" | $BENDSQL_CLIENT_OUTPUT_NULL
echo "select * from set_var.test order by id" | $BENDSQL_CLIENT_CONNECT
echo "delete /*+SET_VAR(timezone='Asia/Shanghai') SET_VAR(storage_read_buffer_size=200)*/ from set_var.test where id=2" | $BENDSQL_CLIENT_CONNECT
echo "delete /*+SET_VAR(timezone='Asia/Shanghai') (storage_read_buffer_size=200)*/ from set_var.test where id=4" | $BENDSQL_CLIENT_CONNECT
echo "delete /*+SET_VAR(timezone='Asia/Shanghai') SET_VAR(storage_read_buffer_size=200)*/ from set_var.test where id=2" | $BENDSQL_CLIENT_OUTPUT_NULL
echo "delete /*+SET_VAR(timezone='Asia/Shanghai') (storage_read_buffer_size=200)*/ from set_var.test where id=4" | $BENDSQL_CLIENT_OUTPUT_NULL
echo "select * from set_var.test" | $BENDSQL_CLIENT_CONNECT

echo "set timezone='America/Toronto'; select /*+SET_VAR(timezone='Asia/Shanghai') */ timezone(); select timezone();" | $BENDSQL_CLIENT_CONNECT
echo "create table set_var.t(c1 timestamp)" | $BENDSQL_CLIENT_CONNECT
# Toronto and Shanghai time diff is 13 hours.
echo "set timezone='America/Toronto'; insert /*+SET_VAR(timezone='Asia/Shanghai') */ into set_var.t values('2022-02-02 03:00:00'); select /*+SET_VAR(timezone='Asia/Shanghai') */ * from set_var.t; select * from set_var.t;" | $BENDSQL_CLIENT_CONNECT
echo "drop database set_var;" | $BENDSQL_CLIENT_CONNECT

echo "drop stage if exists s2" | $BENDSQL_CLIENT_CONNECT
echo "create stage s2" | $BENDSQL_CLIENT_CONNECT
echo "copy /*+SET_VAR(timezone='Asia/Shanghai') */ into @s2 from (select timezone()); " | $BENDSQL_CLIENT_CONNECT
Expand Down
12 changes: 6 additions & 6 deletions tests/suites/0_stateless/05_hints/05_0002_deduplicate_label.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ echo "drop stage if exists s5_1;" | $BENDSQL_CLIENT_CONNECT

echo "CREATE TABLE t5(a Int, b bool) Engine = Fuse;" | $BENDSQL_CLIENT_CONNECT

echo "INSERT /*+ SET_VAR(deduplicate_label='insert-test') */ INTO t5 (a, b) VALUES(1, false)" | $BENDSQL_CLIENT_CONNECT
echo "INSERT /*+ SET_VAR(deduplicate_label='insert-test') */ INTO t5 (a, b) VALUES(1, false)" | $BENDSQL_CLIENT_CONNECT
echo "INSERT /*+ SET_VAR(deduplicate_label='insert-test') */ INTO t5 (a, b) VALUES(1, false)" | $BENDSQL_CLIENT_OUTPUT_NULL
echo "INSERT /*+ SET_VAR(deduplicate_label='insert-test') */ INTO t5 (a, b) VALUES(1, false)" | $BENDSQL_CLIENT_OUTPUT_NULL
echo "select * from t5" | $BENDSQL_CLIENT_CONNECT

echo "CREATE STAGE s5_1;" | $BENDSQL_CLIENT_CONNECT
Expand All @@ -23,12 +23,12 @@ echo "CREATE STAGE s5;" | $MYSQL_CLINEENRT_CONNECT
echo "copy /*+SET_VAR(deduplicate_label='copy-test')*/ into @s5 from (select * from t5);" | $MYSQL_CLINEENRT_CONNECT
echo "select * from @s5;" | $MYSQL_CLINEENRT_CONNECT

echo "UPDATE /*+ SET_VAR(deduplicate_label='update-test') */ t5 SET a = 20 WHERE b = false;" | $BENDSQL_CLIENT_CONNECT
echo "UPDATE /*+ SET_VAR(deduplicate_label='update-test') */ t5 SET a = 30 WHERE b = false;" | $BENDSQL_CLIENT_CONNECT
echo "UPDATE /*+ SET_VAR(deduplicate_label='update-test') */ t5 SET a = 20 WHERE b = false;" | $BENDSQL_CLIENT_OUTPUT_NULL
echo "UPDATE /*+ SET_VAR(deduplicate_label='update-test') */ t5 SET a = 30 WHERE b = false;" | $BENDSQL_CLIENT_OUTPUT_NULL
echo "select * from t5" | $BENDSQL_CLIENT_CONNECT

echo "replace /*+ SET_VAR(deduplicate_label='replace-test') */ into t5 on(a,b) values(40,false);" | $BENDSQL_CLIENT_CONNECT
echo "replace /*+ SET_VAR(deduplicate_label='replace-test') */ into t5 on(a,b) values(50,false);" | $BENDSQL_CLIENT_CONNECT
echo "replace /*+ SET_VAR(deduplicate_label='replace-test') */ into t5 on(a,b) values(40,false);" | $BENDSQL_CLIENT_OUTPUT_NULL
echo "replace /*+ SET_VAR(deduplicate_label='replace-test') */ into t5 on(a,b) values(50,false);" | $BENDSQL_CLIENT_OUTPUT_NULL
echo "select * from t5 order by a" | $BENDSQL_CLIENT_CONNECT

echo "drop table if exists t5;" | $BENDSQL_CLIENT_CONNECT
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
## Create table t12_0004
echo "create table t12_0004(c int)" | $BENDSQL_CLIENT_CONNECT
echo "two insertions"
echo "insert into t12_0004 values(1),(2)" | $BENDSQL_CLIENT_CONNECT
echo "insert into t12_0004 values(1),(2)" | $BENDSQL_CLIENT_OUTPUT_NULL

# for at offset.
sleep 2

echo "insert into t12_0004 values(3)" | $BENDSQL_CLIENT_CONNECT
echo "insert into t12_0004 values(3)" | $BENDSQL_CLIENT_OUTPUT_NULL
echo "latest snapshot should contain 3 rows"
echo "select count(*) from t12_0004" | $BENDSQL_CLIENT_CONNECT

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
. "$CURDIR"/../../../shell_env.sh


## Create table t12_0005
echo "create table t12_0005(a int, b int) change_tracking=true" | $BENDSQL_CLIENT_CONNECT
echo "insert into t12_0005 values(1, 1),(2, 1)" | $BENDSQL_CLIENT_CONNECT
## Create or replace table t12_0005
echo "create or replace table t12_0005(a int, b int) change_tracking=true" | $BENDSQL_CLIENT_CONNECT
echo "insert into t12_0005 values(1, 1),(2, 1)" | $BENDSQL_CLIENT_OUTPUT_NULL

echo "update t12_0005 set b = 2 where a = 2" | $BENDSQL_CLIENT_CONNECT
echo "delete from t12_0005 where a = 1" | $BENDSQL_CLIENT_CONNECT
echo "insert into t12_0005 values(3, 3)" | $BENDSQL_CLIENT_CONNECT
echo "update t12_0005 set b = 2 where a = 2" | $BENDSQL_CLIENT_OUTPUT_NULL
echo "delete from t12_0005 where a = 1" | $BENDSQL_CLIENT_OUTPUT_NULL
echo "insert into t12_0005 values(3, 3)" | $BENDSQL_CLIENT_OUTPUT_NULL

echo "latest snapshot should contain 2 rows"
echo "select count(*) from t12_0005" | $BENDSQL_CLIENT_CONNECT
Expand Down
4 changes: 2 additions & 2 deletions tests/suites/0_stateless/16_flashback/16_0001_flashback.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)

echo "create table t16(c int not null)" | $BENDSQL_CLIENT_CONNECT
# the first snapshot contains 2 rows
echo "insert into t16 values(1),(2)" | $BENDSQL_CLIENT_CONNECT
echo "insert into t16 values(1),(2)" | $BENDSQL_CLIENT_OUTPUT_NULL

# the second(last) snapshot should contain 3 rows
echo "insert into t16 values(3)" | $BENDSQL_CLIENT_CONNECT
echo "insert into t16 values(3)" | $BENDSQL_CLIENT_OUTPUT_NULL

# flash back to the second(last) snapshot should be ok, and have no effects
SNAPSHOT_ID=$(echo "select snapshot_id from fuse_snapshot('default','t16') where row_count=3" | $BENDSQL_CLIENT_CONNECT)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
two insertions
2
1
latest snapshot should contain 3 rows
3
alter table add a column
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
2
1
1
checking that there should are 3 snapshots before purge
true
alter table add a column
Expand All @@ -10,6 +13,10 @@ checking that after purge (by snapshot id) there should be 4 snapshots left
true
checking that after purge (by snapshot id) there should be 4 rows left
true
2
1
1
1
checking that there should are 4 snapshots before purge
true
alter table add a column
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
1
alter table add a column
1
update table column
1
alter table drop a column
update table column
0
1
alter table add a column
1
update table column
1
alter table drop a column
update table column
0
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
1
Error: APIError: QueryFailed: [1301]table option snapshot_location is invalid for alter table statement
Error: APIError: QueryFailed: [1301]table option snapshot_loc is invalid for alter table statement
Error: APIError: QueryFailed: [1301]table option extrenal_location is invalid for alter table statement
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
. "$CURDIR"/../../../shell_env.sh

echo "create table t(a int not null)" | $BENDSQL_CLIENT_CONNECT
echo "create or replace table t(a int not null)" | $BENDSQL_CLIENT_CONNECT
echo "insert into t values(1)" | $BENDSQL_CLIENT_CONNECT

# get snapshot location
SNAPSHOT_LOCATION=$(echo "select _snapshot_name from t;" | $BENDSQL_CLIENT_CONNECT)

echo "create table t2(a int not null)" | $BENDSQL_CLIENT_CONNECT
echo "create or replace table t2(a int not null)" | $BENDSQL_CLIENT_CONNECT
echo "alter table t2 set options(snapshot_location = '$SNAPSHOT_LOCATION',block_per_segment = 500)" | $BENDSQL_CLIENT_CONNECT
echo "alter table t2 set options(snapshot_loc = '$SNAPSHOT_LOCATION',block_per_segment = 500)" | $BENDSQL_CLIENT_CONNECT
echo "alter table t2 set options(extrenal_location = '$SNAPSHOT_LOCATION',block_per_segment = 500)" | $BENDSQL_CLIENT_CONNECT
Expand All @@ -22,7 +22,7 @@ echo "alter table t2 set options(storage_format = 'memory')" | $BENDSQL_CLIENT_C
echo "alter table t2 set options(bloom_index_columns = 'b')" | $BENDSQL_CLIENT_CONNECT

# valid bloom index column data type.
echo "create table t3(a decimal(4,2) not null)" | $BENDSQL_CLIENT_CONNECT
echo "create or replace table t3(a decimal(4,2) not null)" | $BENDSQL_CLIENT_CONNECT
echo "alter table t3 set options(bloom_index_columns = 'a')" | $BENDSQL_CLIENT_CONNECT

#drop table
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
1
1 2 3
a VARCHAR NO ''
b INT NO 0
Expand All @@ -6,27 +7,36 @@ c INT NO 0
a FLOAT NO 0
b VARCHAR NO ''
c INT NO 0
1
Error: APIError: QueryFailed: [1006]fail to auto cast column a (String) to column a (Float32)
invalid float literal while evaluating function `to_float32('a')` in expr `to_float32(a)`
Error: APIError: QueryFailed: [1058]Cannot find column b
Error: APIError: QueryFailed: [1006]null value in column `a` of table `c` violates not-null constraint
1
0 1
Error: APIError: QueryFailed: [1006]invalid float literal while evaluating function `to_float32('a')` in expr `to_float32('a')`
0 1
1
0 1
1.2 2
1
1 10
1 10
1 10 1.01
1
1 10 1.01
10 2 2.2
begin test default column
1
1 1
1
1 1
not 2
begin test not NULL column
1
1 1
Error: APIError: QueryFailed: [1006]null value in column `a` of table `f` violates not-null constraint
1
1 1
2
a VARCHAR NO ''
Expand Down
Loading

0 comments on commit 41e51e5

Please sign in to comment.