This is an automated email from the ASF dual-hosted git repository.
eldenmoon pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new fee3bab76b5 [fix](test) replace removed struct_element with element_at
in regression suites (#64204)
fee3bab76b5 is described below
commit fee3bab76b533abc90fa72cedfad166871761615
Author: Chenyang Sun <[email protected]>
AuthorDate: Mon Jun 8 16:27:33 2026 +0800
[fix](test) replace removed struct_element with element_at in regression
suites (#64204)
PR #64027 removed the struct_element SQL function (merged into
element_at), but PR #63736 (merged just before it) added the
topn_expr_pullup and topn_lazy_nested_column_pruning suites that still
call struct_element(...). Because #64027 was prepared before #63736
landed, its cleanup never touched these new files, leaving regression
suites that call a removed function.
### What problem does this PR solve?
Issue Number: close #xxx
Related PR: #xxx
Problem Summary:
### Release note
None
### Check List (For Author)
- Test <!-- At least one of them must be included. -->
- [ ] Regression test
- [ ] Unit Test
- [ ] Manual test (add detailed scripts or steps below)
- [ ] No need to test or manual test. Explain why:
- [ ] This is a refactor/code format and no logic has been changed.
- [ ] Previous test can cover this change.
- [ ] No code files have been changed.
- [ ] Other reason <!-- Add your reason? -->
- Behavior changed:
- [ ] No.
- [ ] Yes. <!-- Explain the behavior change -->
- Does this need documentation?
- [ ] No.
- [ ] Yes. <!-- Add document PR link here. eg:
https://github.com/apache/doris-website/pull/1214 -->
### Check List (For Reviewer who merge this PR)
- [ ] Confirm the release note
- [ ] Confirm test cases
- [ ] Confirm document
- [ ] Add branch pick label <!-- Add branch pick label that this PR
should merge into -->
Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
---
.../data/doc/sql-manual/StructNullsafe.out | 6 +++---
.../external_table_p0/hive/test_complex_types.out | 8 ++++----
.../struct_functions/test_struct_functions.out | 8 ++++----
.../suites/doc/sql-manual/StructNullsafe.groovy | 8 ++++----
.../hive/test_complex_types.groovy | 4 ++--
.../column_pruning/null_column_pruning.groovy | 16 ++++++++--------
.../string_length_column_pruning.groovy | 2 +-
.../column_pruning/topn_expr_pullup.groovy | 22 +++++++++++-----------
.../topn_lazy_nested_column_pruning.groovy | 16 ++++++++--------
.../struct_functions/test_struct_functions.groovy | 10 +++++-----
10 files changed, 50 insertions(+), 50 deletions(-)
diff --git a/regression-test/data/doc/sql-manual/StructNullsafe.out
b/regression-test/data/doc/sql-manual/StructNullsafe.out
index 397ca313cef..0e316831434 100644
--- a/regression-test/data/doc/sql-manual/StructNullsafe.out
+++ b/regression-test/data/doc/sql-manual/StructNullsafe.out
@@ -1,12 +1,12 @@
-- This file is automatically generated. You should know what you did if you
want to edit this
--- !sql_struct_element_by_index --
+-- !sql_element_at_by_index --
1 Alice
\N Bob
3 \N
\N \N
\N \N
--- !sql_struct_element_by_name --
+-- !sql_element_at_by_name --
1 Alice
\N Bob
3 \N
@@ -16,7 +16,7 @@
-- !sql_literal_named_struct --
{"id":1, "name":null}
--- !sql_literal_struct_element --
+-- !sql_literal_element_at --
\N \N
-- !sql_literal_struct --
diff --git a/regression-test/data/external_table_p0/hive/test_complex_types.out
b/regression-test/data/external_table_p0/hive/test_complex_types.out
index 6ba19bd908f..4a9dbbe835c 100644
--- a/regression-test/data/external_table_p0/hive/test_complex_types.out
+++ b/regression-test/data/external_table_p0/hive/test_complex_types.out
@@ -1,5 +1,5 @@
-- This file is automatically generated. You should know what you did if you
want to edit this
--- !null_struct_element --
+-- !null_element_at --
0
-- !map_key_select --
@@ -17,7 +17,7 @@
-- !array_max --
11028
--- !null_struct_element_orc --
+-- !null_element_at_orc --
0
-- !map_key_select_orc --
@@ -47,7 +47,7 @@
-- !date_dict --
2036-12-28 1898-12-28 2539-12-28
--- !null_struct_element --
+-- !null_element_at --
0
-- !map_key_select --
@@ -65,7 +65,7 @@
-- !array_max --
11028
--- !null_struct_element_orc --
+-- !null_element_at_orc --
0
-- !map_key_select_orc --
diff --git
a/regression-test/data/query_p0/sql_functions/struct_functions/test_struct_functions.out
b/regression-test/data/query_p0/sql_functions/struct_functions/test_struct_functions.out
index 57368931c48..f476524c142 100644
---
a/regression-test/data/query_p0/sql_functions/struct_functions/test_struct_functions.out
+++
b/regression-test/data/query_p0/sql_functions/struct_functions/test_struct_functions.out
@@ -7,7 +7,7 @@
5 \N \N \N {"f1":null, "f2":null, "f3":null}
6 \N \N \N {"f1":"NULL", "f2":"null", "f3":null}
--- !select_struct_element_1 --
+-- !select_element_at_1 --
1 2 3 4 5
1 1000 10000000 100000000000 100000000000
5 4 3 2 1
@@ -15,7 +15,7 @@
\N \N \N \N \N
\N \N \N \N \N
--- !select_struct_element_2 --
+-- !select_element_at_2 --
1.0 3.33 0.001
1.0 2.143 0.001
2.3 23.3 0.333
@@ -23,7 +23,7 @@
\N \N \N
\N \N \N
--- !select_struct_element_3 --
+-- !select_element_at_3 --
2023-04-01 2023-04-01T12:00 2023-04-01 2023-04-01T12:00:01
2023-04-01 2023-04-01T12:00 2023-04-01 2023-04-01T12:00:01
2023-04-01 2023-04-01T12:00 2023-04-01 2023-04-01T12:00:01
@@ -31,7 +31,7 @@
\N \N \N \N
\N \N \N \N
--- !select_struct_element_4 --
+-- !select_element_at_4 --
a abc abc
hi doris hello doris
a abc abc
diff --git a/regression-test/suites/doc/sql-manual/StructNullsafe.groovy
b/regression-test/suites/doc/sql-manual/StructNullsafe.groovy
index 7325be0cd00..fd6144f903c 100644
--- a/regression-test/suites/doc/sql-manual/StructNullsafe.groovy
+++ b/regression-test/suites/doc/sql-manual/StructNullsafe.groovy
@@ -41,13 +41,13 @@ suite("nereids_scalar_fn_StructNullsafe", "p0") {
"""
// test function struct
- qt_sql_struct_element_by_index "SELECT element_at(struct, 1),
element_at(struct, 2) FROM fn_test_nullsafe_struct ORDER BY id"
- qt_sql_struct_element_by_name "SELECT element_at(struct, 'id'),
element_at(struct, 'name') FROM fn_test_nullsafe_struct ORDER BY id"
+ qt_sql_element_at_by_index "SELECT element_at(struct, 1),
element_at(struct, 2) FROM fn_test_nullsafe_struct ORDER BY id"
+ qt_sql_element_at_by_name "SELECT element_at(struct, 'id'),
element_at(struct, 'name') FROM fn_test_nullsafe_struct ORDER BY id"
// test function named_struct
qt_sql_literal_named_struct "SELECT named_struct('id', 1, 'name', NULL)"
- qt_sql_literal_struct_element "SELECT element_at(named_struct('id', NULL,
'name', 'Tom'), 'id'), element_at(named_struct('id', 2, 'name', NULL), 'name')"
+ qt_sql_literal_element_at "SELECT element_at(named_struct('id', NULL,
'name', 'Tom'), 'id'), element_at(named_struct('id', 2, 'name', NULL), 'name')"
- // test function struct_element
+ // test function element_at
qt_sql_literal_struct "SELECT STRUCT(NULL, 'X')"
}
\ No newline at end of file
diff --git
a/regression-test/suites/external_table_p0/hive/test_complex_types.groovy
b/regression-test/suites/external_table_p0/hive/test_complex_types.groovy
index 16f9a05f789..40a815a4688 100644
--- a/regression-test/suites/external_table_p0/hive/test_complex_types.groovy
+++ b/regression-test/suites/external_table_p0/hive/test_complex_types.groovy
@@ -38,7 +38,7 @@ suite("test_complex_types", "p0,external") {
sql """ use multi_catalog """
- qt_null_struct_element """select count(element_at(favor, 'tip')) from
byd where id % 13 = 0"""
+ qt_null_element_at """select count(element_at(favor, 'tip')) from byd
where id % 13 = 0"""
qt_map_key_select """select id, singles["p0X72J-mkMe40O-vOa-opfI"] as
map_key from byd where singles["p0X72J-mkMe40O-vOa-opfI"] is not null"""
@@ -54,7 +54,7 @@ suite("test_complex_types", "p0,external") {
// qt_array_last """select max(array_last(i -> i > 0, capacity)) from
byd where array_last(i -> i > 0, capacity) < 0.99"""
- qt_null_struct_element_orc """select count(element_at(favor, 'tip'))
from byd where id % 13 = 0"""
+ qt_null_element_at_orc """select count(element_at(favor, 'tip')) from
byd where id % 13 = 0"""
qt_map_key_select_orc """select id, singles["p0X72J-mkMe40O-vOa-opfI"]
as map_key from byd where singles["p0X72J-mkMe40O-vOa-opfI"] is not null"""
diff --git
a/regression-test/suites/nereids_rules_p0/column_pruning/null_column_pruning.groovy
b/regression-test/suites/nereids_rules_p0/column_pruning/null_column_pruning.groovy
index 91986f2eb55..5039d3f4b90 100644
---
a/regression-test/suites/nereids_rules_p0/column_pruning/null_column_pruning.groovy
+++
b/regression-test/suites/nereids_rules_p0/column_pruning/null_column_pruning.groovy
@@ -24,7 +24,7 @@
// nested columns: <col>: all access paths: [<col>.NULL]
//
// When the same column is also accessed for data (e.g., projected or used in
-// struct_element), the NULL-only path must be stripped from allAccessPaths and
+// element_at), the NULL-only path must be stripped from allAccessPaths and
// predicateAccessPaths unless the same path is still present in
allAccessPaths.
suite("null_column_pruning") {
@@ -188,7 +188,7 @@ suite("null_column_pruning") {
order_qt_10 "select int_col from ncp_tbl where int_col is null";
// ─── Mixed: struct IS NULL + partial field access
───────────────────────────
- // struct_col IS NULL in WHERE + struct_element in SELECT → child data is
also needed.
+ // struct_col IS NULL in WHERE + element_at in SELECT → child data is also
needed.
// The parent struct_col.NULL path must NOT stay in allAccessPaths with
child paths.
// BE StructFileColumnIterator treats a leading NULL sub-path as
NULL_MAP_ONLY; if
// allAccessPaths were [struct_col.NULL, struct_col.city], BE would skip
the city
@@ -246,7 +246,7 @@ suite("null_column_pruning") {
//
=========================================================================
// IS NULL on nested-type extraction functions (map_keys, map_values,
- // element_at, struct_element, and nested combinations)
+ // element_at, and nested combinations)
//
=========================================================================
// ─── map_keys(map_col) IS NULL
─────────────────────────────────────────────
@@ -383,7 +383,7 @@ suite("null_column_pruning") {
order_qt_23 "select count(1) from ncp_tbl where element_at(struct_col,
'zip') is null";
- // ─── struct_element IS NOT NULL
─────────────────────────────────────────────
+ // ─── element_at IS NOT NULL ─────────────────────────────────────────────
explain {
sql "select count(1) from ncp_tbl where element_at(struct_col, 'city')
is not null"
contains "nested columns"
@@ -438,7 +438,7 @@ suite("null_column_pruning") {
map('k', array(1, 2))
"""
- // ─── struct_element → map field IS NULL
─────────────────────────────────────
+ // ─── element_at → map field IS NULL ─────────────────────────────────────
explain {
sql "select count(1) from ncp_nested_tbl where
element_at(nested_struct, 'inner_map') is null"
contains "nested columns"
@@ -447,7 +447,7 @@ suite("null_column_pruning") {
order_qt_27 "select count(1) from ncp_nested_tbl where
element_at(nested_struct, 'inner_map') is null";
- // ─── struct_element → array field IS NULL
───────────────────────────────────
+ // ─── element_at → array field IS NULL ───────────────────────────────────
explain {
sql "select count(1) from ncp_nested_tbl where
element_at(nested_struct, 'inner_arr') is null"
contains "nested columns"
@@ -456,7 +456,7 @@ suite("null_column_pruning") {
order_qt_28 "select count(1) from ncp_nested_tbl where
element_at(nested_struct, 'inner_arr') is null";
- // ─── map_keys through struct_element IS NULL
────────────────────────────────
+ // ─── map_keys through element_at IS NULL ────────────────────────────────
explain {
sql "select count(1) from ncp_nested_tbl where
map_keys(element_at(nested_struct, 'inner_map')) is null"
contains "nested columns"
@@ -466,7 +466,7 @@ suite("null_column_pruning") {
order_qt_29 "select count(1) from ncp_nested_tbl where
map_keys(element_at(nested_struct, 'inner_map')) is null";
- // ─── map_values through struct_element IS NULL
──────────────────────────────
+ // ─── map_values through element_at IS NULL ──────────────────────────────
explain {
sql "select count(1) from ncp_nested_tbl where
map_values(element_at(nested_struct, 'inner_map')) is null"
contains "nested columns"
diff --git
a/regression-test/suites/nereids_rules_p0/column_pruning/string_length_column_pruning.groovy
b/regression-test/suites/nereids_rules_p0/column_pruning/string_length_column_pruning.groovy
index 33062189b92..48c0cb37a49 100644
---
a/regression-test/suites/nereids_rules_p0/column_pruning/string_length_column_pruning.groovy
+++
b/regression-test/suites/nereids_rules_p0/column_pruning/string_length_column_pruning.groovy
@@ -82,7 +82,7 @@ suite("string_length_column_pruning") {
}
sql "select if(length(str_col) >= 5, true, false) a from slcp_str_tbl
order by id"
- // Struct string field: length(struct_element) is the only use
+ // Struct string field: length(element_at) is the only use
explain {
sql "select length(element_at(struct_col, 'f3')) from slcp_str_tbl"
contains "nested columns"
diff --git
a/regression-test/suites/nereids_rules_p0/column_pruning/topn_expr_pullup.groovy
b/regression-test/suites/nereids_rules_p0/column_pruning/topn_expr_pullup.groovy
index a9d72879ffc..13dab4443a0 100644
---
a/regression-test/suites/nereids_rules_p0/column_pruning/topn_expr_pullup.groovy
+++
b/regression-test/suites/nereids_rules_p0/column_pruning/topn_expr_pullup.groovy
@@ -41,18 +41,18 @@ suite("topn_expr_pullup") {
// Test 1: STRUCT PPD — expression pulled above TopN + lazy mat
// =============================================
explain {
- sql """ select id, struct_element(struct_col, 'city') as city
+ sql """ select id, element_at(struct_col, 'city') as city
from tep_tbl order by id limit 3 """
contains("VMaterializeNode")
contains("row_ids: [__DORIS_GLOBAL_ROWID_COL__tep_tbl]")
}
- qt_struct_ppd """ select id, struct_element(struct_col, 'city') as city
+ qt_struct_ppd """ select id, element_at(struct_col, 'city') as city
from tep_tbl order by id limit 3 """
// =============================================
// Test 2: STRUCT PPD — column order preserved (expr before id)
// =============================================
- qt_struct_col_order """ select struct_element(struct_col, 'city') as city,
id
+ qt_struct_col_order """ select element_at(struct_col, 'city') as city, id
from tep_tbl order by id limit 3 """
// =============================================
@@ -98,38 +98,38 @@ suite("topn_expr_pullup") {
// =============================================
// Test 8: Simple alias NOT pulled up (child is Slot)
// =============================================
- qt_simple_alias """ select id as a, struct_element(struct_col, 'city') as
city
+ qt_simple_alias """ select id as a, element_at(struct_col, 'city') as city
from tep_tbl order by a limit 3 """
// =============================================
// Test 9: Negative — order by depends on expression, stays below TopN
// =============================================
- qt_order_by_expr """ select id, struct_element(struct_col, 'city') as city
+ qt_order_by_expr """ select id, element_at(struct_col, 'city') as city
from tep_tbl order by city limit 3 """
// =============================================
// Test 10: select * with expression pulled up
// =============================================
explain {
- sql """ select *, struct_element(struct_col, 'city') as city
+ sql """ select *, element_at(struct_col, 'city') as city
from tep_tbl order by id limit 3 """
contains("VMaterializeNode")
}
- qt_select_star """ select *, struct_element(struct_col, 'city') as city
+ qt_select_star """ select *, element_at(struct_col, 'city') as city
from tep_tbl order by id limit 3 """
// =============================================
// Test 11: Switch disabled — same results
// =============================================
sql """ set enable_topn_expr_pullup = false; """
- qt_switch_off """ select id, struct_element(struct_col, 'city') as city
+ qt_switch_off """ select id, element_at(struct_col, 'city') as city
from tep_tbl order by id limit 3 """
sql """ set enable_topn_expr_pullup = true; """
// =============================================
// Test 12: Join — PPD on left table
// =============================================
- qt_join_ppd """ select t1.id, struct_element(t1.struct_col, 'city') as
city, t2.int_col
+ qt_join_ppd """ select t1.id, element_at(t1.struct_col, 'city') as city,
t2.int_col
from tep_tbl t1 join tep_tbl t2 on t1.id = t2.id
order by t1.id limit 3 """
@@ -143,14 +143,14 @@ suite("topn_expr_pullup") {
// =============================================
// Test 14: Join — both sides have pull-up expressions
// =============================================
- qt_join_both """ select t1.id, struct_element(t1.struct_col, 'city') as
c1, upper(t2.str_col) as c2
+ qt_join_both """ select t1.id, element_at(t1.struct_col, 'city') as c1,
upper(t2.str_col) as c2
from tep_tbl t1 join tep_tbl t2 on t1.id = t2.id
order by t1.id limit 3 """
// =============================================
// Test 15: Join — condition references baseSlot (should still pull up)
// =============================================
- qt_join_base_slot """ select t1.id, struct_element(t1.struct_col, 'city')
as c1
+ qt_join_base_slot """ select t1.id, element_at(t1.struct_col, 'city') as c1
from tep_tbl t1 join tep_tbl t2 on t1.id = t2.id and t1.str_col =
t2.str_col
order by t1.id limit 3 """
diff --git
a/regression-test/suites/nereids_rules_p0/column_pruning/topn_lazy_nested_column_pruning.groovy
b/regression-test/suites/nereids_rules_p0/column_pruning/topn_lazy_nested_column_pruning.groovy
index be11f79ccab..e41921273de 100644
---
a/regression-test/suites/nereids_rules_p0/column_pruning/topn_lazy_nested_column_pruning.groovy
+++
b/regression-test/suites/nereids_rules_p0/column_pruning/topn_lazy_nested_column_pruning.groovy
@@ -67,7 +67,7 @@ suite("topn_lazy_nested_column_pruning") {
// =============================================
explain {
sql """
- select id, substring(struct_element(struct_col, 'city'), 1) as city
+ select id, substring(element_at(struct_col, 'city'), 1) as city
from tlncp_tbl
order by id
limit 3
@@ -86,7 +86,7 @@ suite("topn_lazy_nested_column_pruning") {
// =============================================
explain {
sql """
- select *, substring(struct_element(struct_col, 'city'), 1) as city
+ select *, substring(element_at(struct_col, 'city'), 1) as city
from tlncp_tbl
order by id
limit 3
@@ -118,7 +118,7 @@ suite("topn_lazy_nested_column_pruning") {
// Test 4: STRUCT - verify actual query results
// =============================================
qt_struct_result """
- select id, substring(struct_element(struct_col, 'city'), 1) as city
+ select id, substring(element_at(struct_col, 'city'), 1) as city
from tlncp_tbl
order by id
limit 3
@@ -285,7 +285,7 @@ suite("topn_lazy_nested_column_pruning") {
// =============================================
explain {
sql """
- select substring(struct_element(struct_col, 'city'), 1) as city, id
+ select substring(element_at(struct_col, 'city'), 1) as city, id
from tlncp_tbl
order by id
limit 3
@@ -294,7 +294,7 @@ suite("topn_lazy_nested_column_pruning") {
contains("row_ids: [__DORIS_GLOBAL_ROWID_COL__tlncp_tbl]")
}
qt_struct_col_order_result """
- select substring(struct_element(struct_col, 'city'), 1) as city, id
+ select substring(element_at(struct_col, 'city'), 1) as city, id
from tlncp_tbl
order by id
limit 3
@@ -346,17 +346,17 @@ suite("topn_lazy_nested_column_pruning") {
sql """ set enable_topn_expr_pullup = false; """
explain {
sql """
- select *, substring(struct_element(struct_col, 'city'), 1) as city
+ select *, substring(element_at(struct_col, 'city'), 1) as city
from tlncp_tbl
order by id
limit 3
"""
contains("VMaterializeNode")
- contains("final projections: id[#0], struct_col[#2],
substring(struct_element(struct_col[#2]")
+ contains("final projections: id[#0], struct_col[#2],
substring(element_at(struct_col[#2]")
contains("row_ids: [__DORIS_GLOBAL_ROWID_COL__tlncp_tbl]")
}
qt_project_under_topn_consumed_slot """
- select *, substring(struct_element(struct_col, 'city'), 1) as city
+ select *, substring(element_at(struct_col, 'city'), 1) as city
from tlncp_tbl
order by id
limit 3
diff --git
a/regression-test/suites/query_p0/sql_functions/struct_functions/test_struct_functions.groovy
b/regression-test/suites/query_p0/sql_functions/struct_functions/test_struct_functions.groovy
index b60915ab892..a652d97c3fb 100644
---
a/regression-test/suites/query_p0/sql_functions/struct_functions/test_struct_functions.groovy
+++
b/regression-test/suites/query_p0/sql_functions/struct_functions/test_struct_functions.groovy
@@ -43,13 +43,13 @@ suite("test_struct_functions") {
qt_select_all "SELECT * FROM ${tableName} ORDER BY k1"
- qt_select_struct_element_1 "SELECT
element_at(k2,'f1'),element_at(k2,'f2'),element_at(k2,'f3'),element_at(k2,'f4'),element_at(k2,'f5')
FROM ${tableName} ORDER BY k1"
- qt_select_struct_element_2 "SELECT
element_at(k3,'f1'),element_at(k3,'f2'),element_at(k3,'f3') FROM ${tableName}
ORDER BY k1"
- qt_select_struct_element_3 "SELECT
element_at(k4,1),element_at(k4,2),element_at(k4,3),element_at(k4,4) FROM
${tableName} ORDER BY k1"
- qt_select_struct_element_4 "SELECT
element_at(k5,1),element_at(k5,2),element_at(k5,3) FROM ${tableName} ORDER BY
k1"
+ qt_select_element_at_1 "SELECT
element_at(k2,'f1'),element_at(k2,'f2'),element_at(k2,'f3'),element_at(k2,'f4'),element_at(k2,'f5')
FROM ${tableName} ORDER BY k1"
+ qt_select_element_at_2 "SELECT
element_at(k3,'f1'),element_at(k3,'f2'),element_at(k3,'f3') FROM ${tableName}
ORDER BY k1"
+ qt_select_element_at_3 "SELECT
element_at(k4,1),element_at(k4,2),element_at(k4,3),element_at(k4,4) FROM
${tableName} ORDER BY k1"
+ qt_select_element_at_4 "SELECT
element_at(k5,1),element_at(k5,2),element_at(k5,3) FROM ${tableName} ORDER BY
k1"
// DORIS-26105: subscript syntax `s['field']` / `s[index]` on STRUCT
should work the same as
- // element_at / struct_element and must not crash the BE (especially for
NULL struct rows).
+ // element_at and must not crash the BE (especially for NULL struct rows).
qt_select_struct_subscript_1 "SELECT
k2['f1'],k2['f2'],k2['f3'],k2['f4'],k2['f5'] FROM ${tableName} ORDER BY k1"
qt_select_struct_subscript_2 "SELECT k3['f1'],k3['f2'],k3['f3'] FROM
${tableName} ORDER BY k1"
qt_select_struct_subscript_3 "SELECT k4[1],k4[2],k4[3],k4[4] FROM
${tableName} ORDER BY k1"
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]