Files
oceanbase/src/sql/parser/ob_parser_utils.h
2023-09-22 03:10:14 +00:00

160 lines
4.9 KiB
C++

/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
*/
#ifndef _OB_PARSER_UTILS_H
#define _OB_PARSER_UTILS_H 1
#include "lib/utility/ob_print_utils.h"
#include "sql/parser/parse_node.h"
#include "lib/ob_name_def.h"
#include "common/ob_smart_call.h"
#include "lib/utility/ob_hang_fatal_error.h"
#include "share/ob_errno.h"
const char* get_type_name(int type);
namespace oceanbase
{
namespace sql
{
inline void databuff_print_stmt_location(char *buf, int64_t buf_len, int64_t &pos, const ObStmtLoc &obj)
{
if (obj.first_column_ > 0 || obj.last_column_ > 0 || obj.first_line_ > 0 || obj.last_line_ > 0) {
J_COMMA();
int first_line = obj.first_line_;
int last_line = obj.last_line_;
int first_column = obj.first_column_;
int last_column = obj.last_column_;
J_KV(K(first_line),
K(last_line),
K(first_column),
K(last_column));
}
}
inline int databuff_print_obj(char *buf, const int64_t buf_len, int64_t &pos, const ParseNode &obj)
{
int ret = OB_SUCCESS;
J_OBJ_START();
J_KV(N_TYPE, get_type_name(obj.type_),
N_INT_VALUE, obj.value_,
N_STR_VALUE_LEN, obj.str_len_,
N_STR_VALUE, common::ObString(obj.str_len_, obj.str_value_));
databuff_print_stmt_location(buf, buf_len, pos, obj.stmt_loc_);
if (0 < obj.num_child_) {
J_COMMA();
J_NAME(N_CHILDREN);
J_COLON();
J_ARRAY_START();
for (int64_t i = 0; i < obj.num_child_; ++i) {
if (NULL == obj.children_[i]) {
J_EMPTY_OBJ();
} else if (OB_FAIL(SMART_CALL(databuff_print_obj(buf, buf_len, pos, *obj.children_[i])))) {
}
if (i != obj.num_child_ - 1) { common::databuff_printf(buf, buf_len, pos, ", "); }
}
J_ARRAY_END();
}
J_OBJ_END();
return ret;
}
inline void print_indent(char *buf, const int64_t buf_len, int64_t &pos, const int level)
{
for (int i=0; i<level; ++i) {
common::databuff_printf(buf, buf_len, pos, "\t");
}
}
inline void databuff_simple_print_obj(char *buf, const int64_t buf_len, const int64_t index, int64_t &pos, const ParseNode *obj, int level)
{
print_indent(buf, buf_len, pos, level);
if (NULL != obj) {
common::databuff_printf(buf,
buf_len, pos,
"|--[%ld],[%s], str_value_=[%.*s], value=[%ld]\n",
index,
get_type_name(obj->type_),
int32_t(obj->str_len_),
obj->str_value_,
obj->value_);
} else {
common::databuff_printf(buf, buf_len, pos, "|--[%ld]\n", index);
}
for (int64_t i = 0; i < obj->num_child_; ++i) {
if (NULL != obj->children_[i]) {
databuff_simple_print_obj(buf, buf_len, i, pos, obj->children_[i], level + 1);
}
}
}
class ObParserResultTreePrintWrapper
{
public:
explicit ObParserResultTreePrintWrapper(const ParseNode &parse_tree)
:parse_tree_(parse_tree)
{}
int64_t to_string(char* buf, const int64_t buf_len) const
{
int64_t pos = 0;
common::databuff_printf(buf, buf_len, pos, "\n");
databuff_simple_print_obj(buf, buf_len, 0, pos, &parse_tree_, 0);
return pos;
}
private:
DISALLOW_COPY_AND_ASSIGN(ObParserResultTreePrintWrapper);
private:
const ParseNode &parse_tree_;
};
class ObParserResultPrintWrapper
{
public:
explicit ObParserResultPrintWrapper(const ParseNode &parse_tree)
:parse_tree_(parse_tree)
{}
int64_t to_string(char* buf, const int64_t buf_len) const
{
int64_t pos = 0;
int ret = OB_SUCCESS;
if (OB_FAIL(SMART_CALL(databuff_print_obj(buf, buf_len, pos, parse_tree_)))) {
pos = 0;
J_OBJ_START();
J_KV(N_TYPE, get_type_name(parse_tree_.type_),
N_INT_VALUE, parse_tree_.value_,
N_STR_VALUE_LEN, parse_tree_.str_len_,
N_STR_VALUE, common::ObString(parse_tree_.str_len_, parse_tree_.str_value_));
databuff_print_stmt_location(buf, buf_len, pos, parse_tree_.stmt_loc_);
J_OBJ_END();
}
return pos;
}
private:
DISALLOW_COPY_AND_ASSIGN(ObParserResultPrintWrapper);
private:
const ParseNode &parse_tree_;
};
struct ObCharsets4Parser
{
explicit ObCharsets4Parser() :
string_collation_(common::CS_TYPE_UTF8MB4_GENERAL_CI),
nls_collation_(common::CS_TYPE_INVALID)
{}
common::ObCollationType string_collation_; //collation type for the string to parse
common::ObCollationType nls_collation_; //oracle database collation for validating identifiers
};
} // end namespace sql
} // end namespace oceanbase
#endif /* _OB_PARSER_UTILS_H */