 0d0b11c0cc
			
		
	
	0d0b11c0cc
	
	
	
		
			
			Co-authored-by: oceanoverflow <oceanoverflow@gmail.com> Co-authored-by: hezuojiao <hezuojiao@gmail.com> Co-authored-by: Monk-Liu <1152761042@qq.com>
		
			
				
	
	
		
			717 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			717 lines
		
	
	
		
			20 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 OCEANBASE_SQL_OB_SQL_DEFINE_H_
 | |
| #define OCEANBASE_SQL_OB_SQL_DEFINE_H_
 | |
| 
 | |
| #include "lib/container/ob_fixed_array.h"
 | |
| #include "share/datum/ob_datum.h"
 | |
| #include "common/object/ob_object.h"
 | |
| #include "share/ob_define.h"
 | |
| #include "deps/oblib/src/lib/container/ob_array.h"
 | |
| #include "src/share/rc/ob_tenant_base.h"
 | |
| #include "deps/oblib/src/lib/container/ob_2d_array.h"
 | |
| 
 | |
| namespace oceanbase
 | |
| {
 | |
| namespace share
 | |
| {
 | |
| namespace schema
 | |
| {
 | |
| struct ObSchemaObjVersion;
 | |
| }
 | |
| }
 | |
| using namespace common;
 | |
| 
 | |
| namespace sql
 | |
| {
 | |
| const int64_t OB_SQL_MAX_CHILD_OPERATOR_NUM = 16;
 | |
| const int64_t OB_MIN_PARALLEL_TASK_COUNT = 13; //期望每一个并行度最低持有的task数量
 | |
| const int64_t OB_MAX_PARALLEL_TASK_COUNT = 100; //期望每一个并行度最大持有task数量
 | |
| const int64_t OB_MIN_MARCO_COUNT_IN_TASK = 1; //每个task最少负责的宏块个数
 | |
| const int64_t OB_INVAILD_PARALLEL_TASK_COUNT = -1;
 | |
| const int64_t OB_EXPECTED_TASK_LOAD = 100; //MB, one task will get 100MB data from disk
 | |
| const int64_t OB_GET_MACROS_COUNT_BY_QUERY_RANGE = 1;
 | |
| const int64_t OB_GET_BLOCK_RANGE = 2;
 | |
| const int64_t OB_BROADCAST_THRESHOLD = 100;
 | |
| const int64_t OB_PARTITION_COUNT_PRE_SQL = 16; //用于开hash表的桶大小或者SEAarry的默认大小,假定一般SQL不会超过16个partition
 | |
| const int64_t OB_MAX_RECURSIVE_SQL_LEVELS = 50; //compatible with oracle
 | |
| 
 | |
| typedef common::ObFixedArray<share::schema::ObSchemaObjVersion, common::ObIAllocator> DependenyTableStore;
 | |
| typedef common::ParamStore ParamStore;
 | |
| 
 | |
| // ob_rowkey_info.h oceanbase::common::ObOrderType also defined
 | |
| enum ObOrderDirection
 | |
| {
 | |
|   NULLS_FIRST_ASC = 0,   //顺序,正向扫描,Forward, NULLs first
 | |
|   NULLS_LAST_ASC, // 顺序,正向扫描,Forward, NULLs last
 | |
|   NULLS_FIRST_DESC, //倒序,反向扫描,Backward, NULLs first
 | |
|   NULLS_LAST_DESC,   //倒序,反向扫描,Backward, NULLs last
 | |
|   UNORDERED, //不排序,保持现状
 | |
|   MAX_DIR, //非法值
 | |
| };
 | |
| 
 | |
| inline bool is_null_first(ObOrderDirection order_direction) {
 | |
|   return NULLS_FIRST_ASC == order_direction || NULLS_FIRST_DESC == order_direction;
 | |
| }
 | |
| 
 | |
| extern ObOrderDirection default_asc_direction();
 | |
| extern ObOrderDirection default_desc_direction();
 | |
| 
 | |
| inline bool is_ascending_direction(const ObOrderDirection direction)
 | |
| {
 | |
|   return (NULLS_FIRST_ASC == direction || NULLS_LAST_ASC == direction);
 | |
| }
 | |
| 
 | |
| inline bool is_descending_direction(const ObOrderDirection direction)
 | |
| {
 | |
|   return (NULLS_FIRST_DESC == direction || NULLS_LAST_DESC == direction);
 | |
| }
 | |
| 
 | |
| enum ObJoinType
 | |
| {
 | |
|   UNKNOWN_JOIN = 0,
 | |
|   INNER_JOIN,
 | |
|   LEFT_OUTER_JOIN,
 | |
|   RIGHT_OUTER_JOIN,
 | |
|   FULL_OUTER_JOIN,
 | |
|   LEFT_SEMI_JOIN,
 | |
|   RIGHT_SEMI_JOIN,
 | |
|   LEFT_ANTI_JOIN,
 | |
|   RIGHT_ANTI_JOIN,
 | |
|   CONNECT_BY_JOIN, //used for hierarchical query
 | |
|   MAX_JOIN_TYPE
 | |
| };
 | |
| 
 | |
| enum SlaveMappingType {
 | |
|   SM_NONE = 0,
 | |
|   SM_PWJ_HASH_HASH,
 | |
|   SM_PPWJ_HASH_HASH,
 | |
|   SM_PPWJ_BCAST_NONE,
 | |
|   SM_PPWJ_NONE_BCAST,
 | |
| };
 | |
| 
 | |
| enum PathType
 | |
| {
 | |
|   INVALID = 0,
 | |
|   ACCESS,
 | |
|   JOIN,
 | |
|   SUBQUERY,
 | |
|   FAKE_CTE_TABLE_ACCESS,
 | |
|   FUNCTION_TABLE_ACCESS,
 | |
|   TEMP_TABLE_ACCESS,
 | |
|   JSON_TABLE_ACCESS,
 | |
|   VALUES_TABLE_ACCESS
 | |
| };
 | |
| 
 | |
| enum JtColType {
 | |
|   INVALID_COL_TYPE = 0,
 | |
|   COL_TYPE_ORDINALITY, // 1
 | |
|   COL_TYPE_EXISTS, // 2
 | |
|   COL_TYPE_QUERY, // 3
 | |
|   COL_TYPE_VALUE, // 4
 | |
|   NESTED_COL_TYPE, // 5
 | |
|   COL_TYPE_QUERY_JSON_COL = 6,
 | |
| };
 | |
| 
 | |
| enum ObNameTypeClass
 | |
| {
 | |
|   OB_TABLE_NAME_CLASS = 0, //table name, database names, table alias names ,affected by system variable lower_case_table_names
 | |
|   OB_COLUMN_NAME_CLASS = 1,// column name,column alias name. index name , stored using lettercase and comparisons are case insensitive
 | |
|   OB_USER_NAME_CLASS = 2,// user names, tenant names and other names, stored using lettercase and comparisons are case sensitive
 | |
| };
 | |
| 
 | |
| enum ObMatchAgainstMode {
 | |
|   NATURAL_LANGUAGE_MODE = 0,
 | |
|   BOOLEAN_MODE = 1
 | |
| };
 | |
| 
 | |
| #define IS_JOIN(type) \
 | |
| (((type) == PHY_MERGE_JOIN) || \
 | |
|  ((type) == PHY_NESTED_LOOP_JOIN) || \
 | |
|  ((type) == PHY_HASH_JOIN) || \
 | |
|  ((type) == PHY_BLOCK_BASED_NESTED_LOOP_JOIN))
 | |
| 
 | |
| #define IS_OUTER_JOIN(join_type) \
 | |
|   ((join_type) == LEFT_OUTER_JOIN || \
 | |
|    (join_type) == RIGHT_OUTER_JOIN || \
 | |
|    (join_type) == FULL_OUTER_JOIN)
 | |
| 
 | |
| #define IS_SEMI_ANTI_JOIN(join_type) \
 | |
|   ((join_type) == LEFT_SEMI_JOIN || \
 | |
|    (join_type) == RIGHT_SEMI_JOIN || \
 | |
|    (join_type) == LEFT_ANTI_JOIN || \
 | |
|    (join_type) == RIGHT_ANTI_JOIN)
 | |
| 
 | |
| #define IS_SEMI_JOIN(join_type) \
 | |
|   ((join_type) == LEFT_SEMI_JOIN || \
 | |
|    (join_type) == RIGHT_SEMI_JOIN)
 | |
| 
 | |
| #define IS_ANTI_JOIN(join_type) \
 | |
|   ((join_type) == LEFT_ANTI_JOIN || \
 | |
|    (join_type) == RIGHT_ANTI_JOIN)
 | |
| 
 | |
| #define IS_LEFT_SEMI_ANTI_JOIN(join_type) \
 | |
|   ((join_type) == LEFT_SEMI_JOIN || \
 | |
|    (join_type) == LEFT_ANTI_JOIN)
 | |
| 
 | |
| #define IS_RIGHT_SEMI_ANTI_JOIN(join_type) \
 | |
|    ((join_type) == RIGHT_SEMI_JOIN || \
 | |
|    (join_type) == RIGHT_ANTI_JOIN)
 | |
| 
 | |
| #define IS_OUTER_OR_CONNECT_BY_JOIN(join_type) (IS_OUTER_JOIN(join_type) || CONNECT_BY_JOIN == join_type)
 | |
| 
 | |
| #define IS_LEFT_STYLE_JOIN(join_type) \
 | |
|   ((join_type) == LEFT_SEMI_JOIN || \
 | |
|    (join_type) == LEFT_ANTI_JOIN || \
 | |
|    (join_type) == LEFT_OUTER_JOIN || \
 | |
|    (join_type) == FULL_OUTER_JOIN)
 | |
| 
 | |
| #define IS_RIGHT_STYLE_JOIN(join_type) \
 | |
|   ((join_type) == RIGHT_SEMI_JOIN || \
 | |
|    (join_type) == RIGHT_ANTI_JOIN || \
 | |
|    (join_type) == RIGHT_OUTER_JOIN || \
 | |
|    (join_type) == FULL_OUTER_JOIN)
 | |
| 
 | |
| #define IS_SET_PHY_OP(type) \
 | |
| (((type) == PHY_MERGE_UNION) || \
 | |
|  ((type) == PHY_HASH_UNION) || \
 | |
|  ((type) == PHY_HASH_INTERSECT) || \
 | |
|  ((type) == PHY_MERGE_INTERSECT) || \
 | |
|  ((type) == PHY_HASH_EXCEPT) || \
 | |
|  ((type) == PHY_MERGE_EXCEPT))
 | |
| 
 | |
| 
 | |
| inline ObJoinType get_opposite_join_type(ObJoinType type)
 | |
| {
 | |
|   ObJoinType oppo_type = UNKNOWN_JOIN;
 | |
|   switch (type) {
 | |
|   case INNER_JOIN:
 | |
|     oppo_type = INNER_JOIN;
 | |
|     break;
 | |
|   case LEFT_OUTER_JOIN:
 | |
|       oppo_type = RIGHT_OUTER_JOIN;
 | |
|       break;
 | |
|   case RIGHT_OUTER_JOIN:
 | |
|       oppo_type = LEFT_OUTER_JOIN;
 | |
|       break;
 | |
|   case FULL_OUTER_JOIN:
 | |
|       oppo_type = FULL_OUTER_JOIN;
 | |
|       break;
 | |
|   case LEFT_SEMI_JOIN:
 | |
|       oppo_type = RIGHT_SEMI_JOIN;
 | |
|       break;
 | |
|   case RIGHT_SEMI_JOIN:
 | |
|       oppo_type = LEFT_SEMI_JOIN;
 | |
|       break;
 | |
|   case LEFT_ANTI_JOIN:
 | |
|       oppo_type = RIGHT_ANTI_JOIN;
 | |
|       break;
 | |
|   case RIGHT_ANTI_JOIN:
 | |
|       oppo_type = LEFT_ANTI_JOIN;
 | |
|       break;
 | |
|   case CONNECT_BY_JOIN:
 | |
|       oppo_type = CONNECT_BY_JOIN;
 | |
|       break;
 | |
|   default:
 | |
|       break;
 | |
|   }
 | |
|   return oppo_type;
 | |
| }
 | |
| 
 | |
| inline const ObString &ob_join_type_str(ObJoinType join_type)
 | |
| {
 | |
|   static const ObString join_type_str_st[] =
 | |
|   {
 | |
|     "UNKNOWN JOIN",
 | |
|     "JOIN",
 | |
|     "OUTER JOIN",
 | |
|     "RIGHT OUTER JOIN",
 | |
|     "FULL OUTER JOIN",
 | |
|     "SEMI JOIN",
 | |
|     "RIGHT SEMI JOIN",
 | |
|     "ANTI JOIN",
 | |
|     "RIGHT ANTI JOIN",
 | |
|     "CONNECT BY"
 | |
|   };
 | |
| 
 | |
|   if (OB_LIKELY(join_type >= UNKNOWN_JOIN) && OB_LIKELY(join_type <= CONNECT_BY_JOIN)) {
 | |
|     return join_type_str_st[join_type];
 | |
|   } else {
 | |
|     return join_type_str_st[0];
 | |
|   }
 | |
| }
 | |
| 
 | |
| enum ObTableLocationType
 | |
| {
 | |
|   OB_TBL_LOCATION_UNINITIALIZED = 0,
 | |
|   OB_TBL_LOCATION_LOCAL,
 | |
|   OB_TBL_LOCATION_REMOTE,
 | |
|   OB_TBL_LOCATION_DISTRIBUTED,
 | |
|   OB_TBL_LOCATION_ALL//like EXPRESSION, match all
 | |
| };
 | |
| 
 | |
| enum ObRepartitionType
 | |
| {
 | |
|   OB_REPARTITION_NO_REPARTITION = 0,//不重分区
 | |
|   OB_REPARTITION_ONE_SIDE_ONE_LEVEL,//只有一边按照一级分区做repartition,不repartition的一边是一级分区
 | |
|   OB_REPARTITION_ONE_SIDE_TWO_LEVEL,//只有一边按照二级分区做repartition, 不repartition的一边是二级分区
 | |
|   OB_REPARTITION_BOTH_SIDE_ONE_LEVEL,//两边都按照一级分区方式做repartition, 分区键是连接键
 | |
|   OB_REPARTITION_ONE_SIDE_ONE_LEVEL_FIRST,//只有一边按照另外一边(二级分区表)的一级分区做repartition
 | |
|   OB_REPARTITION_ONE_SIDE_ONE_LEVEL_SUB,//只有一边按照另外一边(二级分区)的二级分区做repartition
 | |
| };
 | |
| 
 | |
| enum ObRepartitionScope
 | |
| {
 | |
|   OB_REPARTITION_NONE_SIDE = 0,
 | |
|   OB_REPARTITION_LEFT_SIDE,
 | |
|   OB_REPARTITION_RIGHT_SIDE,
 | |
|   OB_REPARTITION_BOTH_SIDE,
 | |
| };
 | |
| 
 | |
| enum ObPhyPlanType
 | |
| {
 | |
|   OB_PHY_PLAN_UNINITIALIZED = 0,
 | |
|   OB_PHY_PLAN_LOCAL,
 | |
|   OB_PHY_PLAN_REMOTE,
 | |
|   OB_PHY_PLAN_DISTRIBUTED,
 | |
|   OB_PHY_PLAN_UNCERTAIN
 | |
| };
 | |
| 
 | |
| inline const ObString &ob_plan_type_str(ObPhyPlanType plan_type)
 | |
| {
 | |
|   static const ObString plan_type_str_st[] =
 | |
|   {
 | |
|     "UNINITIALIZED",
 | |
|     "LOCAL",
 | |
|     "REMOTE",
 | |
|     "DISTRIBUTED",
 | |
|   };
 | |
| 
 | |
|   if (OB_LIKELY(plan_type >= OB_PHY_PLAN_UNINITIALIZED)
 | |
|       && OB_LIKELY(plan_type <= OB_PHY_PLAN_DISTRIBUTED)) {
 | |
|     return plan_type_str_st[plan_type];
 | |
|   } else {
 | |
|     return plan_type_str_st[0];
 | |
|   }
 | |
| }
 | |
| 
 | |
| enum ExplainType
 | |
| {
 | |
|   EXPLAIN_UNINITIALIZED = 0,
 | |
|   EXPLAIN_OUTLINE,
 | |
|   EXPLAIN_EXTENDED,
 | |
|   EXPLAIN_PARTITIONS,
 | |
|   EXPLAIN_TRADITIONAL,
 | |
|   EXPLAIN_FORMAT_JSON,
 | |
|   EXPLAIN_BASIC,
 | |
|   EXPLAIN_PLANREGRESS,
 | |
|   EXPLAIN_EXTENDED_NOADDR,
 | |
|   EXPLAIN_DBLINK_STMT,
 | |
|   EXPLAIN_HINT_FORMAT,
 | |
| };
 | |
| 
 | |
| enum DiagnosticsType
 | |
| {
 | |
|   DIAGNOSTICS_UNINITIALIZED = 0,
 | |
|   GET_CURRENT_COND,
 | |
|   GET_CURRENT_INFO,
 | |
|   GET_STACKED_COND,
 | |
|   GET_STACKED_INFO
 | |
| };
 | |
| 
 | |
| enum OutlineType
 | |
| {
 | |
|   OUTLINE_TYPE_UNINIT = 0,
 | |
|   USED_HINT,
 | |
|   OUTLINE_DATA
 | |
| };
 | |
| 
 | |
| enum ObPlanLocationType
 | |
| {
 | |
|   UNINITIALIZED = 0,
 | |
|   LOCAL,
 | |
|   REMOTE,
 | |
|   DISTRIBUTED
 | |
| };
 | |
| 
 | |
| struct ObPQDistributeMethod
 | |
| {
 | |
| #define PQ_DIST_METHOD_DEF(DEF) \
 | |
|     DEF(NONE,) \
 | |
|     DEF(PARTITION,) \
 | |
|     DEF(RANDOM,) \
 | |
| 	  DEF(RANDOM_LOCAL,) \
 | |
|     DEF(HASH,) \
 | |
|     DEF(BROADCAST,) \
 | |
|     \
 | |
|     /* distribute in two level: SQC && PX worker*/ \
 | |
|     /* BROADCAST for SQC, RANDOM for PX worker */ \
 | |
|     DEF(BC2HOST,) \
 | |
|     DEF(SM_BROADCAST,) \
 | |
|     DEF(PARTITION_HASH,) \
 | |
|     DEF(DROP,) \
 | |
|     /*PARTITION_RANDOM:PDML情况下处理分区表分区内并行;数据按照partition所在的SQC进行划分,*/ \
 | |
|     /*并行度不受partition个数的限制;但是PARTITION对应的pkey分区,分区粒度为partition,*/ \
 | |
|     /*实际并行度受partition的个数限制,无法在PDML场景下充分利用并行*/ \
 | |
|     DEF(PARTITION_RANDOM,) \
 | |
|     DEF(RANGE,)\
 | |
|     DEF(PARTITION_RANGE,)\
 | |
|     DEF(HYBRID_HASH_BROADCAST,) /* aka PX SEND HYBRID HASH */ \
 | |
|     DEF(HYBRID_HASH_RANDOM,) /* aka PX SEND HYBRID HASH */ \
 | |
|     DEF(LOCAL,) /* represents pull to local */
 | |
| 
 | |
| DECLARE_ENUM(Type, type, PQ_DIST_METHOD_DEF, static);
 | |
| 
 | |
|   static ObPQDistributeMethod::Type get_print_dist(ObPQDistributeMethod::Type method) {
 | |
|     ObPQDistributeMethod::Type print_method = ObPQDistributeMethod::LOCAL;
 | |
|     if (ObPQDistributeMethod::Type::SM_BROADCAST == method) {
 | |
|       print_method = ObPQDistributeMethod::Type::BROADCAST;
 | |
|     } else if (ObPQDistributeMethod::Type::PARTITION_HASH == method) {
 | |
|       print_method = ObPQDistributeMethod::Type::PARTITION;
 | |
|     } else {
 | |
|       print_method = method;
 | |
|     }
 | |
|     return print_method;
 | |
|   }
 | |
| };
 | |
| 
 | |
| struct ObNullDistributeMethod
 | |
| {
 | |
| /*
 | |
|  * ObNullDistributeMethod::NONE - neither DROP nor RANDOM, do null distribution as ObSliceCalc said
 | |
|  */
 | |
| #define NULL_DIST_METHOD_DEF(DEF) \
 | |
|   DEF(NONE,) \
 | |
|   DEF(DROP,) \
 | |
|   DEF(RANDOM,)
 | |
| 
 | |
| DECLARE_ENUM(Type, type, NULL_DIST_METHOD_DEF, static);
 | |
|   static ObNullDistributeMethod::Type get_print_dist(ObNullDistributeMethod::Type method) {
 | |
|     return method;
 | |
|   }
 | |
| };
 | |
| 
 | |
| enum PartitionFilterType {
 | |
|   Uninitialized,
 | |
|   Forbidden,
 | |
|   OneLevelPartitionKey,
 | |
|   TwoLevelPartitionKey,
 | |
|   WholePartitionKey,
 | |
|  };
 | |
| 
 | |
| enum DistinctType
 | |
| {
 | |
|   T_DISTINCT_NONE = 0,
 | |
|   T_HASH_DISTINCT = 1,
 | |
|   T_MERGE_DISTINCT = 2
 | |
| };
 | |
| 
 | |
| enum class ObPDMLOption {
 | |
|   NOT_SPECIFIED = -1,
 | |
|   ENABLE,
 | |
|   DISABLE,
 | |
|   MAX_VALUE
 | |
| };
 | |
| 
 | |
| enum OrderingFlag
 | |
| {
 | |
|   NOT_MATCH = 0,
 | |
|   JOIN_MATCH = 1,
 | |
|   GROUP_MATCH = 1 << 1,
 | |
|   WINFUNC_MATCH = 1 << 2,
 | |
|   DISTINCT_MATCH = 1 << 3,
 | |
|   SET_MATCH = 1 << 4,
 | |
|   ORDERBY_MATCH = 1 << 5,
 | |
|   POTENTIAL_MATCH = 1 << 6 // ordering可能在subplan scan后用到
 | |
| };
 | |
| 
 | |
| enum OrderingCheckScope
 | |
| {
 | |
|   NOT_CHECK = 0,
 | |
|   CHECK_GROUP = 1,
 | |
|   CHECK_WINFUNC = 1 << 1,
 | |
|   CHECK_DISTINCT = 1 << 2,
 | |
|   CHECK_SET = 1 << 3,
 | |
|   CHECK_ORDERBY = 1 << 4,
 | |
|   CHECK_ALL = (1 << 5) - 1
 | |
| };
 | |
| 
 | |
| 
 | |
| enum ObExecuteMode
 | |
| {
 | |
|   EXECUTE_INVALID = 0,
 | |
|   EXECUTE_INNER,
 | |
|   EXECUTE_LOCAL,
 | |
|   EXECUTE_REMOTE,
 | |
|   EXECUTE_DIST,
 | |
|   EXECUTE_PS_PREPARE,//prepare statement local server
 | |
|   EXECUTE_PS_EXECUTE,//prepare statement local server
 | |
|   EXECUTE_PS_FETCH,
 | |
|   EXECUTE_PS_SEND_PIECE,
 | |
|   EXECUTE_PS_GET_PIECE,
 | |
|   EXECUTE_PS_SEND_LONG_DATA,
 | |
|   EXECUTE_PL_EXECUTE
 | |
| };
 | |
| 
 | |
| 
 | |
| enum PartitionIdCalcType {
 | |
|   CALC_INVALID = -1,          // invalid calc type
 | |
|   CALC_NORMAL = 0,            // calc both part id and subpart id
 | |
|   CALC_IGNORE_FIRST_PART = 1, // only calc subpart id
 | |
|   CALC_IGNORE_SUB_PART =2     // only calc part id
 | |
| };
 | |
| 
 | |
| enum class ObParamOption {
 | |
|   NOT_SPECIFIED = -1,
 | |
|   FORCE,
 | |
|   EXACT,
 | |
|   MAX_VALUE
 | |
| };
 | |
| 
 | |
| enum DominateRelation
 | |
| {
 | |
|   OBJ_LEFT_DOMINATE = 0,
 | |
|   OBJ_RIGHT_DOMINATE,
 | |
|   OBJ_EQUAL,
 | |
|   OBJ_UNCOMPARABLE
 | |
| };
 | |
| 
 | |
| // for parallel precedence, refer to
 | |
| // https://docs.oracle.com/cd/E11882_01/server.112/e41573/hintsref.htm#PFGRF94937
 | |
| enum PXParallelRule
 | |
| {
 | |
|   USE_PX_DEFAULT = 0, // default disable parallel
 | |
|   MANUAL_HINT, // /*+ parallel(3) */
 | |
|   SESSION_FORCE_PARALLEL, // alter session force parallel query parallel 3;
 | |
|   MANUAL_TABLE_DOP, // create table t1 (...) parallel 3;
 | |
|   AUTO_DOP, // /*+ parallel(auto) */ or alter session set parallel_degree_policy = 'auto';
 | |
|   // force disable parallel below
 | |
|   PL_UDF_DAS_FORCE_SERIALIZE, //stmt has_pl_udf will use das, force serialize;
 | |
|   DBLINK_FORCE_SERIALIZE, //stmt has dblink will use das, force seialize;
 | |
|   MAX_OPTION
 | |
| };
 | |
| 
 | |
| inline const char *ob_px_parallel_rule_str(PXParallelRule px_parallel_ruel)
 | |
| {
 | |
|   const char *ret = "USE_PX_DEFAULT";
 | |
|   static const char *parallel_rule_type_to_str[] =
 | |
|   {
 | |
|     "USE_PX_DEFAULT",
 | |
|     "MANUAL_HINT",
 | |
|     "SESSION_FORCE_PARALLEL",
 | |
|     "MANUAL_TABLE_DOP",
 | |
|     "AUTO_DOP",
 | |
|     "PL_UDF_DAS_FORCE_SERIALIZE",
 | |
|     "DBLINK_FORCE_SERIALIZE",
 | |
|     "MAX_OPTION",
 | |
|   };
 | |
|   if (OB_LIKELY(px_parallel_ruel >= USE_PX_DEFAULT)
 | |
|       && OB_LIKELY(px_parallel_ruel <= MAX_OPTION)) {
 | |
|     ret = parallel_rule_type_to_str[px_parallel_ruel];
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static const int64_t PDML_DOP_LIMIT_PER_PARTITION = 10;
 | |
| static const int64_t ROW_COUNT_THRESHOLD_PER_DOP = 10000;  // zhanyuetodo: need adjust this by test
 | |
| 
 | |
| enum OpParallelRule
 | |
| {
 | |
|   OP_GLOBAL_DOP = 0, /* use DOP from global parallel rule except MANUAL_TABLE_DOP or AUTO_DOP */
 | |
|   OP_DAS_DOP, /*+ DAS use DOP = 1 */
 | |
|   OP_HINT_DOP, /* use parallel hint for table: parallel(t1, 3) */
 | |
|   OP_TABLE_DOP, /*+ use table parallel property: create table t1 (...) parallel 3; */
 | |
|   OP_AUTO_DOP, /*+ DOP is calculated by AUTO_DOP */
 | |
|   OP_INHERIT_DOP, /*+ inherited from other op or determined by other op in the same DFO */
 | |
|   OP_DOP_RULE_MAX
 | |
| };
 | |
| 
 | |
| typedef common::ObDmlEventType ObDmlEventType;
 | |
| 
 | |
| enum MayAddIntervalPart {
 | |
|   NO, // do nothing, just set part id to 0
 | |
|   YES, // add an interval partition, and set err code to force retry
 | |
|   PART_CHANGE_ERR, // set err code, make query stop and report and error msg to client
 | |
| };
 | |
| 
 | |
| enum ObIDPAbortType
 | |
| {
 | |
|   IDP_DEFAULT_ABORT = -1,
 | |
|   IDP_INVALID_HINT_ABORT = 0,
 | |
|   IDP_STOPENUM_EXPDOWN_ABORT = 1,
 | |
|   IDP_STOPENUM_LINEARDOWN_ABORT = 2,
 | |
|   IDP_ENUM_FAILED_ABORT = 3,
 | |
|   IDP_NO_ABORT = 4
 | |
| };
 | |
| 
 | |
| struct ObSqlDatumArray
 | |
| {
 | |
|   ObSqlDatumArray()
 | |
|     : data_(nullptr),
 | |
|       count_(0),
 | |
|       element_()
 | |
|   {
 | |
|   }
 | |
|   typedef common::ObArrayWrap<common::ObDatum> DatumArray;
 | |
|   static ObSqlDatumArray *alloc(common::ObIAllocator &allocator, int64_t count);
 | |
|   TO_STRING_KV("data", DatumArray(data_, count_),
 | |
|                K_(count),
 | |
|                K_(element));
 | |
|   common::ObDatum *data_;
 | |
|   int64_t count_;
 | |
|   common::ObDataType element_;
 | |
| };
 | |
| 
 | |
| OB_INLINE ObSqlDatumArray *ObSqlDatumArray::alloc(common::ObIAllocator &allocator, int64_t count)
 | |
| {
 | |
|   ObSqlDatumArray *array_obj = nullptr;
 | |
|   void *array_buf = nullptr;
 | |
|   void *data_buf = nullptr;
 | |
|   int64_t array_size = sizeof(ObSqlDatumArray) + sizeof(common::ObDatum) * count;
 | |
|   if (OB_NOT_NULL(array_buf = allocator.alloc(array_size))) {
 | |
|     array_obj = new (array_buf) ObSqlDatumArray();
 | |
|     data_buf = static_cast<char*>(array_buf) + sizeof(ObSqlDatumArray);
 | |
|     array_obj->data_ = new (data_buf) common::ObDatum[count];
 | |
|     array_obj->count_ = count;
 | |
|   }
 | |
|   return array_obj;
 | |
| }
 | |
| 
 | |
| // Window function optimization settings. (_windowfunc_optimization_settings sys variable)
 | |
| struct ObWinfuncOptimizationOpt
 | |
| {
 | |
|   ObWinfuncOptimizationOpt() : v_(0) {}
 | |
|   union {
 | |
|     struct {
 | |
|       uint64_t disable_range_distribution_:1;
 | |
|       uint64_t disable_reporting_wf_pushdown_:1;
 | |
|       // add more options here.
 | |
|     };
 | |
|     uint64_t v_;
 | |
|   };
 | |
| };
 | |
| 
 | |
| // class full name: ob tenant memory array.
 | |
| // Used to solve the following problem:
 | |
| // the initial memory allocation of ObSEArray is relatively large, leading to memory inflation issues in some scenarios.
 | |
| // Default to using the MTL_ID() tenant,
 | |
| // and the lifecycle of this class cannot cross tenants.
 | |
| template<typename T, typename BlockAllocatorT = ModulePageAllocator, bool auto_free = false, typename CallBack = ObArrayDefaultCallBack<T>, typename ItemEncode = DefaultItemEncode<T> >
 | |
| class ObTMArray final : public ObArrayImpl<T, BlockAllocatorT, auto_free, CallBack, ItemEncode>
 | |
| {
 | |
| public:
 | |
|   using ObArrayImpl<T, BlockAllocatorT, auto_free, CallBack, ItemEncode>::ObArrayImpl;
 | |
|   ObTMArray(int64_t block_size = std::min(static_cast<int64_t>(4 * sizeof(T)), OB_MALLOC_NORMAL_BLOCK_SIZE),
 | |
|         const BlockAllocatorT &alloc = BlockAllocatorT("TMArray"));
 | |
| };
 | |
| 
 | |
| template<typename T, typename BlockAllocatorT, bool auto_free, typename CallBack, typename ItemEncode>
 | |
| ObTMArray<T, BlockAllocatorT, auto_free, CallBack, ItemEncode>::ObTMArray(int64_t block_size,
 | |
|                                                            const BlockAllocatorT &alloc)
 | |
|     : ObArrayImpl<T, BlockAllocatorT, auto_free, CallBack, ItemEncode>(block_size, alloc)
 | |
| {
 | |
|   this->set_tenant_id(MTL_ID());
 | |
| }
 | |
| 
 | |
| template <typename T, int max_block_size = OB_MALLOC_BIG_BLOCK_SIZE,
 | |
|           typename BlockAllocatorT = ModulePageAllocator,
 | |
|           bool auto_free = false,
 | |
|           typename BlockPointerArrayT = ObSEArray<T *, OB_BLOCK_POINTER_ARRAY_SIZE,
 | |
|                                                   BlockAllocatorT, auto_free> >
 | |
| class ObTMSegmentArray final : public Ob2DArray<T, max_block_size, BlockAllocatorT, auto_free,
 | |
|           BlockPointerArrayT>
 | |
| {
 | |
| public:
 | |
|   ObTMSegmentArray(const BlockAllocatorT &alloc = BlockAllocatorT("TMSegmentArray"));
 | |
|   int assign(const ObTMSegmentArray &other) { return this->inner_assign(other); }
 | |
| };
 | |
| 
 | |
| template <typename T, int max_block_size,
 | |
|           typename BlockAllocatorT, bool auto_free,
 | |
|           typename BlockPointerArrayT>
 | |
| ObTMSegmentArray<T, max_block_size, BlockAllocatorT, auto_free,
 | |
|           BlockPointerArrayT>::ObTMSegmentArray(const BlockAllocatorT &alloc)
 | |
|     : Ob2DArray<T, max_block_size, BlockAllocatorT, auto_free,
 | |
|           BlockPointerArrayT>(alloc)
 | |
| {
 | |
|   this->set_tenant_id(MTL_ID());
 | |
| }
 | |
| 
 | |
| static bool is_fixed_length(ObObjType type) {
 | |
|   bool is_fixed = true;
 | |
|   ObObjTypeClass tc = ob_obj_type_class(type);
 | |
|   OB_ASSERT(tc >= ObNullTC && tc < ObMaxTC);
 | |
|   if (ObNumberTC == tc
 | |
|       || ObExtendTC == tc
 | |
|       || ObTextTC == tc
 | |
|       || ObStringTC == tc
 | |
|       || ObEnumSetInnerTC == tc
 | |
|       || ObRawTC == tc
 | |
|       || ObRowIDTC == tc
 | |
|       || ObLobTC == tc
 | |
|       || ObJsonTC == tc
 | |
|       || ObGeometryTC == tc
 | |
|       || ObUserDefinedSQLTC == tc
 | |
|       || ObDecimalIntTC == tc) {
 | |
|     is_fixed = false;
 | |
|   }
 | |
|   return is_fixed;
 | |
| }
 | |
| 
 | |
| static int16_t get_type_fixed_length(ObObjType type) {
 | |
|   int16_t len = 0;
 | |
|   ObObjTypeClass tc = ob_obj_type_class(type);
 | |
|   OB_ASSERT(tc >= ObNullTC && tc < ObMaxTC);
 | |
|   switch (tc)
 | |
|   {
 | |
|     case ObUIntTC:
 | |
|     case ObIntTC:
 | |
|     case ObDoubleTC:
 | |
|     case ObDateTimeTC:
 | |
|     case ObTimeTC:
 | |
|     case ObBitTC:
 | |
|     case ObEnumSetTC:
 | |
|     {
 | |
|       len = 8;
 | |
|       break;
 | |
|     }
 | |
|     case ObDateTC:
 | |
|     case ObFloatTC:
 | |
|     {
 | |
|       len = 4;
 | |
|       break;
 | |
|     }
 | |
|     case ObYearTC:
 | |
|     {
 | |
|       len = 1;
 | |
|       break;
 | |
|     }
 | |
|     case ObOTimestampTC: {
 | |
|       len = (type == ObTimestampTZType) ? 12 : 10;
 | |
|       break;
 | |
|     }
 | |
|     case ObIntervalTC:
 | |
|     {
 | |
|       len = (type == ObIntervalYMType) ? 8 : 12;
 | |
|       break;
 | |
|     }
 | |
|     default:
 | |
|       break;
 | |
|   }
 | |
|   return len;
 | |
| }
 | |
| 
 | |
| }  // namespace sql
 | |
| }  // namespace oceanbase
 | |
| #endif /* OCEANBASE_SQL_OB_SQL_DEFINE_H_ */
 |