[CP] [ctas]: ctas support parallel hint.

This commit is contained in:
Monk-Liu
2024-05-21 05:43:59 +00:00
committed by ob-robot
parent 8ad8629476
commit b25f2bcf3e
5 changed files with 55 additions and 45 deletions

View File

@ -109,8 +109,9 @@ int ObCreateTableExecutor::ObInsSQLPrinter::inner_print(char *buf, int64_t buf_l
LOG_WARN("null stmt", K(ret)); LOG_WARN("null stmt", K(ret));
} else if (OB_FAIL(databuff_printf(buf, buf_len, pos1, } else if (OB_FAIL(databuff_printf(buf, buf_len, pos1,
do_osg_ do_osg_
? "insert /*+GATHER_OPTIMIZER_STATISTICS*/ into %c%.*s%c.%c%.*s%c" ? "insert /*+ ENABLE_PARALLEL_DML PARALLEL(%lu) GATHER_OPTIMIZER_STATISTICS*/ into %c%.*s%c.%c%.*s%c"
: "insert /*+NO_GATHER_OPTIMIZER_STATISTICS*/ into %c%.*s%c.%c%.*s%c", : "insert /*+ ENABLE_PARALLEL_DML PARALLEL(%lu) NO_GATHER_OPTIMIZER_STATISTICS*/ into %c%.*s%c.%c%.*s%c",
stmt_->get_parallelism(),
sep_char, sep_char,
stmt_->get_database_name().length(), stmt_->get_database_name().length(),
stmt_->get_database_name().ptr(), stmt_->get_database_name().ptr(),

View File

@ -4880,12 +4880,12 @@ opt_table_option_list opt_partition_option with_column_group
| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor '(' table_element_list ')' | create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor '(' table_element_list ')'
opt_table_option_list opt_partition_option select_stmt opt_table_option_list opt_partition_option select_stmt
{ {
(void)($1); (void)($10);
ParseNode *table_elements = NULL; ParseNode *table_elements = NULL;
ParseNode *table_options = NULL; ParseNode *table_options = NULL;
merge_nodes(table_elements, result, T_TABLE_ELEMENT_LIST, $7); merge_nodes(table_elements, result, T_TABLE_ELEMENT_LIST, $7);
merge_nodes(table_options, result, T_TABLE_OPTION_LIST, $9); merge_nodes(table_options, result, T_TABLE_OPTION_LIST, $9);
malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 9, malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 10,
$2, /* temporary option */ $2, /* temporary option */
$4, /* if not exists */ $4, /* if not exists */
$5, /* table name */ $5, /* table name */
@ -4894,19 +4894,19 @@ opt_table_option_list opt_partition_option with_column_group
$10, /* partition optition */ $10, /* partition optition */
NULL, /* column group */ NULL, /* column group */
NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */ NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */
$11); /* select_stmt */ $11, /* select_stmt */
$1); /* hints */
$$->reserved_ = 0; $$->reserved_ = 0;
} }
| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor '(' table_element_list ')' | create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor '(' table_element_list ')'
opt_table_option_list opt_partition_option AS select_stmt opt_table_option_list opt_partition_option AS select_stmt
{ {
(void)($1);
(void)$11; (void)$11;
ParseNode *table_elements = NULL; ParseNode *table_elements = NULL;
ParseNode *table_options = NULL; ParseNode *table_options = NULL;
merge_nodes(table_elements, result, T_TABLE_ELEMENT_LIST, $7); merge_nodes(table_elements, result, T_TABLE_ELEMENT_LIST, $7);
merge_nodes(table_options, result, T_TABLE_OPTION_LIST, $9); merge_nodes(table_options, result, T_TABLE_OPTION_LIST, $9);
malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 9, malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 10,
$2, /* temporary option */ $2, /* temporary option */
$4, /* if not exists */ $4, /* if not exists */
$5, /* table name */ $5, /* table name */
@ -4915,19 +4915,19 @@ opt_table_option_list opt_partition_option with_column_group
$10, /* partition optition */ $10, /* partition optition */
NULL, /* column group */ NULL, /* column group */
NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */ NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */
$12); /* select_stmt */ $12, /* select_stmt */
$1); /* hints */
$$->reserved_ = 0; $$->reserved_ = 0;
} }
| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor '(' table_element_list ')' | create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor '(' table_element_list ')'
opt_table_option_list opt_partition_option with_column_group opt_as select_stmt opt_table_option_list opt_partition_option with_column_group opt_as select_stmt
{ {
(void)($1);
(void)$12; (void)$12;
ParseNode *table_elements = NULL; ParseNode *table_elements = NULL;
ParseNode *table_options = NULL; ParseNode *table_options = NULL;
merge_nodes(table_elements, result, T_TABLE_ELEMENT_LIST, $7); merge_nodes(table_elements, result, T_TABLE_ELEMENT_LIST, $7);
merge_nodes(table_options, result, T_TABLE_OPTION_LIST, $9); merge_nodes(table_options, result, T_TABLE_OPTION_LIST, $9);
malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 9, malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 10,
$2, /* temporary option */ $2, /* temporary option */
$4, /* if not exists */ $4, /* if not exists */
$5, /* table name */ $5, /* table name */
@ -4936,15 +4936,15 @@ opt_table_option_list opt_partition_option with_column_group
$10, /* partition optition */ $10, /* partition optition */
$11, /* column group */ $11, /* column group */
NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */ NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */
$13); /* select_stmt */ $13, /* select_stmt */
$1); /* hints */
$$->reserved_ = 0; $$->reserved_ = 0;
} }
| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor table_option_list opt_partition_option select_stmt | create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor table_option_list opt_partition_option select_stmt
{ {
(void)($1);
ParseNode *table_options = NULL; ParseNode *table_options = NULL;
merge_nodes(table_options, result, T_TABLE_OPTION_LIST, $6); merge_nodes(table_options, result, T_TABLE_OPTION_LIST, $6);
malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 9, malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 10,
$2, /* temporary option */ $2, /* temporary option */
$4, /* if not exists */ $4, /* if not exists */
$5, /* table name */ $5, /* table name */
@ -4953,16 +4953,16 @@ opt_table_option_list opt_partition_option with_column_group
$7, /* partition optition */ $7, /* partition optition */
NULL, /* column group */ NULL, /* column group */
NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */ NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */
$8); /* select_stmt */ $8, /* select_stmt */
$1);
$$->reserved_ = 0; $$->reserved_ = 0;
} }
| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor table_option_list opt_partition_option AS select_stmt | create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor table_option_list opt_partition_option AS select_stmt
{ {
(void)($1);
(void)$8; (void)$8;
ParseNode *table_options = NULL; ParseNode *table_options = NULL;
merge_nodes(table_options, result, T_TABLE_OPTION_LIST, $6); merge_nodes(table_options, result, T_TABLE_OPTION_LIST, $6);
malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 9, malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 10,
$2, /* temporary option */ $2, /* temporary option */
$4, /* if not exists */ $4, /* if not exists */
$5, /* table name */ $5, /* table name */
@ -4971,16 +4971,16 @@ opt_table_option_list opt_partition_option with_column_group
$7, /* partition optition */ $7, /* partition optition */
NULL, /* column group */ NULL, /* column group */
NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */ NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */
$9); /* select_stmt */ $9, /* select_stmt */
$1);
$$->reserved_ = 0; $$->reserved_ = 0;
} }
| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor table_option_list opt_partition_option with_column_group opt_as select_stmt | create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor table_option_list opt_partition_option with_column_group opt_as select_stmt
{ {
(void)($1);
(void)$9; (void)$9;
ParseNode *table_options = NULL; ParseNode *table_options = NULL;
merge_nodes(table_options, result, T_TABLE_OPTION_LIST, $6); merge_nodes(table_options, result, T_TABLE_OPTION_LIST, $6);
malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 9, malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 10,
$2, /* temporary option */ $2, /* temporary option */
$4, /* if not exists */ $4, /* if not exists */
$5, /* table name */ $5, /* table name */
@ -4989,13 +4989,14 @@ opt_table_option_list opt_partition_option with_column_group
$7, /* partition optition */ $7, /* partition optition */
$8, /* column group */ $8, /* column group */
NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */ NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */
$10); /* select_stmt */ $10, /* select_stmt */
$1);
$$->reserved_ = 0; $$->reserved_ = 0;
} }
| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor partition_option select_stmt | create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor partition_option select_stmt
{ {
(void)($1); (void)($1);
malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 9, malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 10,
$2, /* temporary option */ $2, /* temporary option */
$4, /* if not exists */ $4, /* if not exists */
$5, /* table name */ $5, /* table name */
@ -5004,14 +5005,14 @@ opt_table_option_list opt_partition_option with_column_group
$6, /* partition optition */ $6, /* partition optition */
NULL, /* column group */ NULL, /* column group */
NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */ NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */
$7); /* select_stmt */ $7, /* select_stmt */
$1);
$$->reserved_ = 1; /* mean partition optition is partition_option, not opt_partition_option*/ $$->reserved_ = 1; /* mean partition optition is partition_option, not opt_partition_option*/
} }
| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor partition_option AS select_stmt | create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor partition_option AS select_stmt
{ {
(void)($1);
(void)$7; (void)$7;
malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 9, malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 10,
$2, /* temporary option */ $2, /* temporary option */
$4, /* if not exists */ $4, /* if not exists */
$5, /* table name */ $5, /* table name */
@ -5020,14 +5021,14 @@ opt_table_option_list opt_partition_option with_column_group
$6, /* partition optition */ $6, /* partition optition */
NULL, /* column group */ NULL, /* column group */
NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */ NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */
$8); /* select_stmt */ $8, /* select_stmt */
$1);
$$->reserved_ = 1; /* mean partition optition is partition_option, not opt_partition_option*/ $$->reserved_ = 1; /* mean partition optition is partition_option, not opt_partition_option*/
} }
| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor partition_option with_column_group opt_as select_stmt | create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor partition_option with_column_group opt_as select_stmt
{ {
(void)($1);
(void)$8; (void)$8;
malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 9, malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 10,
$2, /* temporary option */ $2, /* temporary option */
$4, /* if not exists */ $4, /* if not exists */
$5, /* table name */ $5, /* table name */
@ -5036,13 +5037,13 @@ opt_table_option_list opt_partition_option with_column_group
$6, /* partition optition */ $6, /* partition optition */
$7, /* column group */ $7, /* column group */
NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */ NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */
$9); /* select_stmt */ $9, /* select_stmt */
$1);
$$->reserved_ = 1; /* mean partition optition is partition_option, not opt_partition_option*/ $$->reserved_ = 1; /* mean partition optition is partition_option, not opt_partition_option*/
} }
| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor select_stmt | create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor select_stmt
{ {
(void)($1); malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 10,
malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 9,
$2, /* temporary option */ $2, /* temporary option */
$4, /* if not exists */ $4, /* if not exists */
$5, /* table name */ $5, /* table name */
@ -5051,13 +5052,13 @@ opt_table_option_list opt_partition_option with_column_group
NULL, /* partition optition */ NULL, /* partition optition */
NULL, /* column group */ NULL, /* column group */
NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */ NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */
$6); /* select_stmt */ $6, /* select_stmt */
$1); /* hints */
$$->reserved_ = 0; $$->reserved_ = 0;
} }
| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor with_column_group select_stmt | create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor with_column_group select_stmt
{ {
(void)($1); malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 10,
malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 9,
$2, /* temporary option */ $2, /* temporary option */
$4, /* if not exists */ $4, /* if not exists */
$5, /* table name */ $5, /* table name */
@ -5066,13 +5067,13 @@ opt_table_option_list opt_partition_option with_column_group
NULL, /* partition optition */ NULL, /* partition optition */
$6, /* column group */ $6, /* column group */
NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */ NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */
$7); /* select_stmt */ $7, /* select_stmt */
$1);
$$->reserved_ = 0; $$->reserved_ = 0;
} }
| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor AS select_stmt | create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor AS select_stmt
{ {
(void)($1); malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 10,
malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 9,
$2, /* temporary option */ $2, /* temporary option */
$4, /* if not exists */ $4, /* if not exists */
$5, /* table name */ $5, /* table name */
@ -5081,13 +5082,13 @@ opt_table_option_list opt_partition_option with_column_group
NULL, /* partition optition */ NULL, /* partition optition */
NULL, /* column group */ NULL, /* column group */
NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */ NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */
$7); /* select_stmt */ $7, /* select_stmt */
$1); /* hints */
$$->reserved_ = 0; $$->reserved_ = 0;
} }
| create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor with_column_group AS select_stmt | create_with_opt_hint special_table_type TABLE opt_if_not_exists relation_factor with_column_group AS select_stmt
{ {
(void)($1); malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 10,
malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_TABLE, 9,
$2, /* temporary option */ $2, /* temporary option */
$4, /* if not exists */ $4, /* if not exists */
$5, /* table name */ $5, /* table name */
@ -5096,7 +5097,8 @@ opt_table_option_list opt_partition_option with_column_group
NULL, /* partition optition */ NULL, /* partition optition */
$6, /* column group */ $6, /* column group */
NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */ NULL, /* oracle兼容模式下存放临时表的 on commit 选项 */
$8); /* select_stmt */ $8, /* select_stmt */
$1);
$$->reserved_ = 0; $$->reserved_ = 0;
} }
; ;

View File

@ -820,6 +820,13 @@ int ObCreateTableResolver::resolve(const ParseNode &parse_tree)
LOG_WARN("failed to deep copy string in part expr"); LOG_WARN("failed to deep copy string in part expr");
} }
} }
if (OB_SUCC(ret) && is_create_as_sel) {
if (OB_FAIL(resolve_hints(create_table_node->children_[CREATE_TABLE_AS_SEL_NUM_CHILD - 1],
*create_table_stmt,
create_table_stmt->get_create_table_arg().schema_))) {
LOG_WARN("fail to resolve hint", K(ret));
}
}
} }
return ret; return ret;
} }
@ -1851,7 +1858,7 @@ int ObCreateTableResolver::resolve_table_elements_from_select(const ParseNode &p
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
ObCreateTableStmt *create_table_stmt = static_cast<ObCreateTableStmt *>(stmt_); ObCreateTableStmt *create_table_stmt = static_cast<ObCreateTableStmt *>(stmt_);
const ObTableSchema *base_table_schema = NULL; const ObTableSchema *base_table_schema = NULL;
ParseNode *sub_sel_node = parse_tree.children_[CREATE_TABLE_AS_SEL_NUM_CHILD - 1]; ParseNode *sub_sel_node = parse_tree.children_[CREATE_TABLE_AS_SEL_NUM_CHILD - 2];
ObSelectStmt *select_stmt = NULL; ObSelectStmt *select_stmt = NULL;
ObSelectResolver select_resolver(params_); ObSelectResolver select_resolver(params_);
select_resolver.params_.is_from_create_table_ = true; select_resolver.params_.is_from_create_table_ = true;

View File

@ -97,7 +97,7 @@ private:
// } // }
// //
// create table xxx as already_exist_table, pay attention to whether data are need // create table xxx as already_exist_table, pay attention to whether data are need
protected: protected:
ObSelectStmt *sub_select_stmt_; //create table ... as select... ObSelectStmt *sub_select_stmt_; //create table ... as select...
ObSelectStmt *view_define_; ObSelectStmt *view_define_;
}; };

View File

@ -50,7 +50,7 @@ struct PartitionInfo
enum NUMCHILD { enum NUMCHILD {
CREATE_TABLE_NUM_CHILD = 8, CREATE_TABLE_NUM_CHILD = 8,
CREATE_TABLE_AS_SEL_NUM_CHILD = 9, CREATE_TABLE_AS_SEL_NUM_CHILD = 10,
COLUMN_DEFINITION_NUM_CHILD = 4, COLUMN_DEFINITION_NUM_CHILD = 4,
COLUMN_DEF_NUM_CHILD = 3, COLUMN_DEF_NUM_CHILD = 3,
INDEX_NUM_CHILD = 5, INDEX_NUM_CHILD = 5,