patch 4.0
This commit is contained in:
@ -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 ¶ms)
|
||||
: 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 name和table 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 ¶ms_;
|
||||
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 */
|
||||
|
||||
Reference in New Issue
Block a user