[FEAT MERGE] implement values statement
Co-authored-by: wangt1xiuyi <13547954130@163.com>
This commit is contained in:
@ -1135,4 +1135,55 @@ do {\
|
||||
} \
|
||||
} while(0); \
|
||||
|
||||
#define malloc_select_values_stmt(node, result, values_node, order_by_node, limit_node)\
|
||||
do {\
|
||||
/*gen select list*/\
|
||||
ParseNode *star_node = NULL;\
|
||||
malloc_terminal_node(star_node, result->malloc_pool_, T_STAR);\
|
||||
dup_string_to_node(star_node, result->malloc_pool_, "*");\
|
||||
ParseNode *project_node = NULL;\
|
||||
malloc_non_terminal_node(project_node, result->malloc_pool_, T_PROJECT_STRING, 1, star_node);\
|
||||
ParseNode *project_list_node = NULL;\
|
||||
merge_nodes(project_list_node, result, T_PROJECT_LIST, project_node);\
|
||||
/*gen from list*/\
|
||||
ParseNode *alias_node = NULL;\
|
||||
malloc_non_terminal_node(alias_node, result->malloc_pool_, T_ALIAS, 2, values_node, NULL);\
|
||||
ParseNode *from_list = NULL;\
|
||||
merge_nodes(from_list, result, T_FROM_LIST, alias_node);\
|
||||
/*malloc select node*/\
|
||||
malloc_select_node(node, result->malloc_pool_);\
|
||||
node->children_[PARSE_SELECT_SELECT] = project_list_node;\
|
||||
node->children_[PARSE_SELECT_FROM] = from_list;\
|
||||
node->children_[PARSE_SELECT_ORDER] = order_by_node;\
|
||||
node->children_[PARSE_SELECT_LIMIT] = limit_node;\
|
||||
} while(0);\
|
||||
|
||||
#define refine_insert_values_table(node)\
|
||||
do {\
|
||||
if (node != NULL && node->type_ == T_SELECT && node->children_[PARSE_SELECT_FROM] != NULL &&\
|
||||
node->children_[PARSE_SELECT_FROM]->type_ == T_FROM_LIST &&\
|
||||
node->children_[PARSE_SELECT_FROM]->num_child_ == 1 &&\
|
||||
node->children_[PARSE_SELECT_FROM]->children_ != NULL &&\
|
||||
node->children_[PARSE_SELECT_FROM]->children_[0] != NULL &&\
|
||||
node->children_[PARSE_SELECT_FROM]->children_[0]->type_ == T_ALIAS) {\
|
||||
ParseNode *alias_node = node->children_[PARSE_SELECT_FROM]->children_[0];\
|
||||
if (alias_node->children_ != NULL &&\
|
||||
alias_node->num_child_ == 2 && \
|
||||
alias_node->children_[0] != NULL &&\
|
||||
alias_node->children_[0]->type_ == T_VALUES_TABLE_EXPRESSION) {\
|
||||
ParseNode *values_table_node = alias_node->children_[0];\
|
||||
if (values_table_node->children_ != NULL &&\
|
||||
values_table_node->num_child_ == 1 && \
|
||||
values_table_node->children_[0] != NULL &&\
|
||||
values_table_node->children_[0]->type_ == T_VALUES_ROW_LIST) {\
|
||||
values_table_node->children_[0]->type_ = T_VALUE_LIST;\
|
||||
if (node->children_[PARSE_SELECT_ORDER] == NULL &&\
|
||||
node->children_[PARSE_SELECT_LIMIT] == NULL) {\
|
||||
node = values_table_node->children_[0]; \
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
} while(0);\
|
||||
|
||||
#endif /* OCEANBASE_SRC_SQL_PARSER_SQL_PARSER_BASE_H_ */
|
||||
|
||||
Reference in New Issue
Block a user