[FEAT MERGE]4_2_sql_feature

Co-authored-by: yinyj17 <yinyijun92@gmail.com>
Co-authored-by: xianyu-w <707512433@qq.com>
Co-authored-by: jingtaoye35 <1255153887@qq.com>
This commit is contained in:
zzg19950727
2023-04-28 11:12:11 +00:00
committed by ob-robot
parent 3bf92459f1
commit 3cada22bdc
161 changed files with 16883 additions and 4730 deletions

View File

@ -48,7 +48,12 @@ int ObSelectStmtPrinter::do_print()
LOG_WARN("column_list size should be equal select_item size", K(ret),
K(column_list_->count()), K(select_stmt->get_select_item_size()));
} else {
expr_printer_.init(buf_, buf_len_, pos_, schema_guard_, print_params_, param_store_);
expr_printer_.init(buf_,
buf_len_,
pos_,
schema_guard_,
print_params_,
param_store_);
if (stmt_->is_unpivot_select()) {
if (OB_FAIL(print_unpivot())) {
LOG_WARN("fail to print_unpivot",
@ -276,6 +281,7 @@ int ObSelectStmtPrinter::print_set_op_stmt()
child_stmts.at(0),
schema_guard_,
print_params_,
param_store_,
/*force_col_alias*/true);
stmt_printer.set_column_list(column_list_);
ObString set_op_str = ObString::make_string(
@ -605,12 +611,14 @@ int ObSelectStmtPrinter::print_group_by()
const ObIArray<ObRawExpr*> &group_exprs = select_stmt->get_group_exprs();
const ObIArray<ObRawExpr*> &rollup_exprs = select_stmt->get_rollup_exprs();
const ObIArray<ObGroupingSetsItem> &groupingsets_items = select_stmt->get_grouping_sets_items();
const ObIArray<ObMultiRollupItem> &multi_rollup_items = select_stmt->get_multi_rollup_items();
const ObIArray<ObRollupItem> &rollup_items = select_stmt->get_rollup_items();
const ObIArray<ObCubeItem> &cube_items = select_stmt->get_cube_items();
int64_t group_exprs_size = group_exprs.count();
int64_t rollup_exprs_size = rollup_exprs.count();
int64_t grouping_sets_size = groupingsets_items.count();
int64_t multi_rollup_size = multi_rollup_items.count();
if (group_exprs_size + rollup_exprs_size + grouping_sets_size + multi_rollup_size > 0) {
int64_t rollup_size = rollup_items.count();
int64_t cube_size = cube_items.count();
if (group_exprs_size + rollup_exprs_size + grouping_sets_size + rollup_size + cube_size > 0) {
DATA_PRINTF(" group by ");
if (OB_SUCC(ret) && grouping_sets_size > 0) {
for (int64_t i = 0; OB_SUCC(ret) && i < grouping_sets_size; ++i) {
@ -630,8 +638,13 @@ int ObSelectStmtPrinter::print_group_by()
DATA_PRINTF("),");
}
if (OB_SUCC(ret)) {
if (OB_FAIL(print_multi_rollup_items(groupingsets_items.at(i).multi_rollup_items_))) {
LOG_WARN("failed to print multi rollup items", K(ret));
if (OB_FAIL(print_rollup_items(groupingsets_items.at(i).rollup_items_))) {
LOG_WARN("failed to print rollup items", K(ret));
}
}
if (OB_SUCC(ret)) {
if (OB_FAIL(print_cube_items(groupingsets_items.at(i).cube_items_))) {
LOG_WARN("failed to print cube items", K(ret));
}
}
if (OB_SUCC(ret)) {
@ -640,46 +653,61 @@ int ObSelectStmtPrinter::print_group_by()
DATA_PRINTF("),");
}
}
// print cube
if (OB_SUCC(ret) && cube_size > 0) {
if (OB_FAIL(print_cube_items(cube_items))) {
LOG_WARN("failed to print cube items", K(ret));
}
}
// print exprs
for (int64_t i = 0; OB_SUCC(ret) && i < group_exprs_size; ++i) {
if (OB_FAIL(print_expr_except_const_number(group_exprs.at(i), T_GROUP_SCOPE))) {
LOG_WARN("fail to print group expr", K(ret));
}
DATA_PRINTF(",");
}
// print rollup
if (OB_SUCC(ret)) {
if (rollup_exprs_size > 0) {
if (lib::is_oracle_mode()) {
DATA_PRINTF(" rollup( ");
} else { /* do nothing. */ }
if (lib::is_mysql_mode() && rollup_exprs_size > 0) {
for (int64_t i = 0; OB_SUCC(ret) && i < rollup_exprs_size; ++i) {
if (OB_FAIL(print_expr_except_const_number(rollup_exprs.at(i), T_GROUP_SCOPE))) {
LOG_WARN("fail to print group expr", K(ret));
}
DATA_PRINTF(",");
}
} else if (multi_rollup_size > 0) {
if (OB_FAIL(print_multi_rollup_items(multi_rollup_items))) {
LOG_WARN("failed to print multi rollup items", K(ret));
if (OB_SUCC(ret)) {
--*pos_;
}
DATA_PRINTF(" with rollup ");
} else if (lib::is_oracle_mode() && (rollup_size > 0 || rollup_exprs_size > 0)) {
if (OB_FAIL(print_rollup_items(rollup_items))) {
LOG_WARN("failed to print rollup items", K(ret));
} else if (rollup_exprs_size > 0) {
DATA_PRINTF(" rollup( ");
for (int64_t i = 0; OB_SUCC(ret) && i < rollup_exprs_size; ++i) {
if (OB_FAIL(print_expr_except_const_number(rollup_exprs.at(i), T_GROUP_SCOPE))) {
LOG_WARN("fail to print group expr", K(ret));
}
DATA_PRINTF(",");
}
if (OB_SUCC(ret)) {
--*pos_;
}
DATA_PRINTF("),");
}
}
if (OB_SUCC(ret)) {
--*pos_;
}
if (rollup_exprs_size > 0) {
if (lib::is_oracle_mode()) {
DATA_PRINTF(" ) ");
} else {
DATA_PRINTF(" with rollup ");
}
} else { /* do nothing. */ }
}
} else { /* do nothing. */ }
// remove ","
if (OB_SUCC(ret)) {
--*pos_;
}
}
}
return ret;
}
int ObSelectStmtPrinter::print_multi_rollup_items(const ObIArray<ObMultiRollupItem> &rollup_items)
int ObSelectStmtPrinter::print_rollup_items(const ObIArray<ObRollupItem> &rollup_items)
{
int ret = OB_SUCCESS;
for (int64_t i = 0; OB_SUCC(ret) && i < rollup_items.count(); ++i) {
@ -706,6 +734,33 @@ int ObSelectStmtPrinter::print_multi_rollup_items(const ObIArray<ObMultiRollupIt
return ret;
}
int ObSelectStmtPrinter::print_cube_items(const ObIArray<ObCubeItem> &cube_items)
{
int ret = OB_SUCCESS;
for (int64_t i = 0; OB_SUCC(ret) && i < cube_items.count(); ++i) {
const ObIArray<ObGroupbyExpr> &cube_list_exprs = cube_items.at(i).cube_list_exprs_;
DATA_PRINTF(" cube (");
for (int64_t j = 0; OB_SUCC(ret) && j < cube_list_exprs.count(); ++j) {
const ObIArray<ObRawExpr*> &groupby_exprs = cube_list_exprs.at(j).groupby_exprs_;
DATA_PRINTF("(");
for (int64_t k = 0; OB_SUCC(ret) && k < groupby_exprs.count(); ++k) {
if (OB_FAIL(expr_printer_.do_print(groupby_exprs.at(k), T_GROUP_SCOPE))) {
LOG_WARN("fail to print group expr", K(ret));
} else if (k < groupby_exprs.count() - 1) {
DATA_PRINTF(",");
}
}
if (j < cube_list_exprs.count() - 1) {
DATA_PRINTF("),");
} else {
DATA_PRINTF(")");
}
}
DATA_PRINTF("),");
}
return ret;
}
int ObSelectStmtPrinter::print_having()
{
int ret = OB_SUCCESS;