patch 4.0

This commit is contained in:
wangzelin.wzl
2022-10-24 10:34:53 +08:00
parent 4ad6e00ec3
commit 93a1074b0c
10533 changed files with 2588271 additions and 2299373 deletions

View File

@ -20,101 +20,99 @@
#include "sql/resolver/ob_schema_checker.h"
#include "sql/session/ob_basic_session_info.h"
namespace oceanbase {
namespace common {
namespace oceanbase
{
namespace common
{
class ObMySQLProxy;
}
namespace share {}
namespace sql {
namespace share
{
}
namespace sql
{
class ObSynonymChecker;
/// base class of all statement resolver
class ObStmtResolver {
class ObStmtResolver
{
public:
explicit ObStmtResolver(ObResolverParams& params)
explicit ObStmtResolver(ObResolverParams &params)
: allocator_(params.allocator_),
schema_checker_(params.schema_checker_),
session_info_(params.session_info_),
params_(params),
stmt_(NULL)
{}
virtual ~ObStmtResolver()
{}
virtual int resolve(const ParseNode& parse_tree) = 0;
inline ObStmt* get_basic_stmt()
{
return stmt_;
}
int resolve_table_relation_factor(const ParseNode* node, uint64_t tenant_id, uint64_t& database_id,
common::ObString& table_name, common::ObString& synonym_name, common::ObString& db_name);
int resolve_table_relation_factor(const ParseNode* node, uint64_t& database_id, common::ObString& table_name,
common::ObString& synonym_name, common::ObString& db_name);
virtual ~ObStmtResolver() {}
virtual int resolve(const ParseNode &parse_tree) = 0;
inline ObStmt *get_basic_stmt() { return stmt_; }
int resolve_table_relation_factor(const ParseNode *node, uint64_t tenant_id, uint64_t &database_id,
common::ObString &table_name, common::ObString &synonym_name, common::ObString &db_name);
int resolve_table_relation_factor(const ParseNode *node, uint64_t &database_id,
common::ObString &table_name, common::ObString &synonym_name, common::ObString &db_name);
/// @param org If org is true, means get original db name.
/// Else, when db node is NULL, get session db name.
int resolve_table_relation_node_v2(const ParseNode* node, common::ObString& table_name, common::ObString& db_name,
bool& is_db_explicit, bool org = false, bool is_oracle_sys_view = false);
int resolve_table_relation_node_v2(const ParseNode *node,
common::ObString &table_name,
common::ObString &db_name,
bool &is_db_explicit,
bool org = false,
bool is_oracle_sys_view = false,
char **dblink_name_ptr = NULL,
int32_t *dblink_name_len = NULL);
int resolve_table_relation_node(const ParseNode* node, common::ObString& table_name, common::ObString& db_name,
bool org = false, bool is_oracle_sys_view = false);
int resolve_table_relation_node(const ParseNode *node,
common::ObString &table_name,
common::ObString &db_name,
bool org = false,
bool is_oracle_sys_view = false,
char **dblink_name_ptr = NULL,
int32_t *dblink_name_len = NULL);
/**
* @brief resolve a T_REF_FACTOR node, get database name and table name
* @param [in] node - parser node
* @param [in] session_info - session info
* @param [out] table_name - table name
* @param [out] db_name - database name
* @brief 解析一个T_REF_FACTOR节点,得到database nametable name
* @param [in] node - 语法节点
* @param [in] session_info - session信息
* @param [out] table_name - 表名
* @param [out] db_name - 库名
* @param [in] dblink_name_ptr - dblink名, 用于判别某些ddl是否引用了dblink,如果引用,该ddl应该报错ORA-02021
* @param [in] dblink_name_len - dblink名长度, 用于分区 "drop table t1@;" 和 "drop table t1@q;",应该报不同的错误
* @retval OB_SUCCESS execute success
* @retval OB_SOME_ERROR special errno need to handle
*
*/
static int resolve_ref_factor(
const ParseNode* node, ObSQLSessionInfo* session_info, common::ObString& table_name, common::ObString& db_name);
int resolve_database_factor(
const ParseNode* node, uint64_t tenant_id, uint64_t& database_id, common::ObString& db_name);
static int resolve_ref_factor(const ParseNode *node, ObSQLSessionInfo *session_info, common::ObString &table_name, common::ObString &db_name);
int resolve_database_factor(const ParseNode *node,
uint64_t tenant_id,
uint64_t &database_id,
common::ObString &db_name);
virtual bool is_select_resolver() const
{
return false;
}
inline uint64_t generate_query_id()
{
return params_.new_gen_qid_++;
}
inline uint64_t generate_column_id()
{
return params_.new_gen_cid_--;
}
virtual bool is_select_resolver() const { return false; }
inline uint64_t generate_query_id() { return params_.new_gen_qid_++; }
inline uint64_t generate_column_id() { return params_.new_gen_cid_--; }
uint64_t generate_table_id();
uint64_t generate_link_table_id();
inline int64_t generate_when_number()
{
return params_.new_gen_wid_++;
}
inline uint64_t generate_database_id()
{
return params_.new_gen_did_--;
}
inline int64_t generate_when_number() { return params_.new_gen_wid_++; }
inline uint64_t generate_database_id() { return params_.new_gen_did_--; }
inline uint64_t generate_range_column_id()
{
uint64_t ret_cid = params_.new_gen_cid_;
params_.new_gen_cid_ -= 10;
return ret_cid;
}
inline uint64_t generate_cte_table_id()
{
return params_.new_cte_tid_++;
}
inline uint64_t generate_cte_column_base_id()
{
return common::OB_MIN_CTE_COLUMN_ID;
}
template <class T>
T* create_stmt()
inline uint64_t generate_cte_table_id() { return params_.new_cte_tid_++;}
inline uint64_t generate_cte_column_base_id() { return common::OB_MIN_CTE_COLUMN_ID;}
template<class T>
T *create_stmt()
{
int ret = common::OB_SUCCESS;
T* stmt = NULL;
T *stmt = NULL;
if (OB_ISNULL(params_.stmt_factory_)) {
SQL_RESV_LOG(ERROR, "stmt_factory_ is null, not be init");
} else if (OB_ISNULL(params_.stmt_factory_->get_query_ctx())) {
SQL_RESV_LOG(WARN, "query ctx is null", K(ret));
} else if (OB_FAIL(params_.stmt_factory_->create_stmt(stmt))) {
SQL_RESV_LOG(WARN, "create stmt failed", K(ret));
} else if (OB_ISNULL(stmt)) {
@ -122,12 +120,13 @@ public:
} else {
stmt_ = stmt;
stmt_->set_query_ctx(params_.query_ctx_);
stmt_->set_stmt_id();
// mark prepare stmt
stmt_->set_is_prepare_stmt(params_.is_prepare_protocol_);
stmt_->tz_info_ = get_timezone_info(params_.session_info_);
stmt_->sql_stmt_coll_type_ = get_obj_print_params(params_.session_info_).cs_type_;
if (OB_FAIL(init_stmt())) {
//mark prepare stmt
stmt_->get_query_ctx()->set_is_prepare_stmt(params_.is_prepare_protocol_ && params_.is_prepare_stage_);
stmt_->get_query_ctx()->set_timezone_info(get_timezone_info(params_.session_info_));
stmt_->get_query_ctx()->set_sql_stmt_coll_type(get_obj_print_params(params_.session_info_).cs_type_);
if (OB_FAIL(stmt_->set_stmt_id())) {
SQL_RESV_LOG(WARN, "fail to set stmt id", K(ret));
} else if (OB_FAIL(init_stmt())) {
stmt = NULL;
SQL_RESV_LOG(ERROR, "init stmt failed", K(ret));
}
@ -136,61 +135,57 @@ public:
}
// wrap ObSchemaChecker::get_column_schema with inner sql get hidden column logic.
int get_column_schema(const uint64_t table_id, const common::ObString& column_name,
const share::schema::ObColumnSchemaV2*& column_schema, const bool get_hidden = false);
int get_column_schema(const uint64_t table_id,
const common::ObString &column_name,
const share::schema::ObColumnSchemaV2 *&column_schema,
const bool get_hidden = false,
bool is_link = false);
// wrap ObSchemaChecker::get_column_schema with inner sql get hidden column logic.
int get_column_schema(const uint64_t table_id, const uint64_t column_id,
const share::schema::ObColumnSchemaV2*& column_schema, const bool get_hidden = false);
int get_column_schema(const uint64_t table_id,
const uint64_t column_id,
const share::schema::ObColumnSchemaV2 *&column_schema,
const bool get_hidden = false,
bool is_link = false);
int check_table_id_exists(uint64_t table_id, bool &is_exist);
protected:
int normalize_table_or_database_names(common::ObString& name);
virtual int init_stmt()
{
return common::OB_SUCCESS;
}
int normalize_table_or_database_names(common::ObString &name);
virtual int init_stmt() { return common::OB_SUCCESS; }
private:
// disallow copy
DISALLOW_COPY_AND_ASSIGN(ObStmtResolver);
public:
// data members
common::ObIAllocator* allocator_;
ObSchemaChecker* schema_checker_;
ObSQLSessionInfo* session_info_;
ObResolverParams& params_;
common::ObIAllocator *allocator_;
ObSchemaChecker *schema_checker_;
ObSQLSessionInfo *session_info_;
ObResolverParams &params_;
protected:
ObStmt* stmt_;
ObStmt *stmt_;
};
class ObSynonymChecker {
class ObSynonymChecker
{
public:
ObSynonymChecker() : has_synonym_(false), synonym_ids_()
{}
ObSynonymChecker():has_synonym_(false), synonym_ids_()
{
}
~ObSynonymChecker()
{}
{
}
int add_synonym_id(uint64_t synonym_id);
const common::ObIArray<uint64_t>& get_synonym_ids() const
{
return synonym_ids_;
}
void set_synonym(bool has_synonym)
{
has_synonym_ = has_synonym;
}
bool has_synonym() const
{
return has_synonym_;
}
const common::ObIArray<uint64_t> &get_synonym_ids() const { return synonym_ids_; }
void set_synonym(bool has_synonym) { has_synonym_ = has_synonym; }
bool has_synonym() const { return has_synonym_; }
private:
bool has_synonym_;
common::ObSEArray<uint64_t, 2> synonym_ids_;
DISALLOW_COPY_AND_ASSIGN(ObSynonymChecker);
};
} // end namespace sql
} // end namespace oceanbase
} // end namespace sql
} // end namespace oceanbase
#endif /* _OB_STMT_RESOLVER_H */