248 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			248 lines
		
	
	
		
			10 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_SRC_SQL_RESOLVER_EXPR_OB_EXPR_INFO_FLAG_H_
 | |
| #define OCEANBASE_SRC_SQL_RESOLVER_EXPR_OB_EXPR_INFO_FLAG_H_
 | |
| #include "lib/utility/ob_print_utils.h"
 | |
| namespace oceanbase
 | |
| {
 | |
| namespace sql
 | |
| {
 | |
| // IS_XXX 和 CNT_XXX 必须一一对应地添加
 | |
| enum ObExprInfoFlag
 | |
| {
 | |
|   IS_CONST = 0x0,   // const expression, e.g. 1.2, 'abc'
 | |
|   IS_COLUMN,        // column expression, e.g. C1, T1.C1
 | |
|   IS_STATIC_PARAM,         // vaiable expression, e.g. ?
 | |
|   IS_AGG,           // aggregate function, e.g. max, avg
 | |
|   IS_FUNC,          // system function
 | |
|   IS_IN,
 | |
|   IS_NOT,
 | |
|   IS_OR,
 | |
|   IS_SUB_QUERY,
 | |
|   IS_ONETIME,
 | |
|   IS_ALIAS,
 | |
|   IS_CUR_TIME,
 | |
|   IS_IS_EXPR,
 | |
|   IS_VALUES,
 | |
|   IS_DEFAULT,
 | |
|   IS_DYNAMIC_USER_VARIABLE, // user variable which is assigned in query or query has udf
 | |
|   IS_STATE_FUNC,
 | |
|   IS_SET_OP,
 | |
|   IS_LAST_INSERT_ID,
 | |
|   IS_WINDOW_FUNC,
 | |
|   IS_PRIOR,
 | |
|   IS_RAND_FUNC,         // rand(const) or rand() is a random function , rand(some column) is not a random function
 | |
|   IS_ROWNUM,
 | |
|   IS_LEVEL,
 | |
|   IS_CONNECT_BY_ISLEAF,
 | |
|   IS_CONNECT_BY_ISCYCLE,
 | |
|   IS_PSEUDO_COLUMN,
 | |
|   IS_CONNECT_BY_ROOT,
 | |
|   IS_SYS_CONNECT_BY_PATH,
 | |
|   IS_OUTER_JOIN_SYMBOL,
 | |
|   IS_SO_UDF_EXPR,   // expression contains user defined function(dll) expression. add prefix 'SO', means different with PL UDF.
 | |
|   IS_PL_UDF,
 | |
|   IS_SEQ_EXPR,
 | |
|   IS_DYNAMIC_PARAM, //for opt to distinguish normal paramaterized const and exec-params
 | |
|   IS_ENUM_OR_SET,
 | |
|   IS_VOLATILE_CONST, // the const expr may be altered by overwrite, non-const in execution.
 | |
|   IS_ORA_ROWSCN_EXPR,
 | |
|   IS_OP_PSEUDO_COLUMN,
 | |
|   IS_ASSIGN_EXPR,
 | |
|   IS_ASSOCIATED_FLAG_END, //add IS_xxx flag before me
 | |
|   //IS_CONST_EXPR and CNT_CONST_EXPR are not in the flag of associated extraction
 | |
|   IS_CONST_EXPR,   // expression contains calculable expression
 | |
|   CNT_CONST_EXPR,    // IS_CONST_EXPR and CNT_CONST_EXPR at most one is true
 | |
| 
 | |
|   CNT_CONST,        // expression contains const
 | |
|   CNT_COLUMN,       // expression contains column
 | |
|   CNT_STATIC_PARAM,        // expression contains variable
 | |
|   CNT_AGG,          // expression contains aggregate function
 | |
|   CNT_FUNC,         // expression contains system function
 | |
|   CNT_IN,           // expression contains In expression
 | |
|   CNT_NOT,          // expression contains NOT expression
 | |
|   CNT_OR,           // expression contains OR expression
 | |
|   CNT_SUB_QUERY,
 | |
|   CNT_ONETIME,
 | |
|   CNT_ALIAS,
 | |
|   CNT_CUR_TIME,
 | |
|   CNT_IS_EXPR,
 | |
|   CNT_VALUES,
 | |
|   CNT_DEFAULT,
 | |
|   CNT_DYNAMIC_USER_VARIABLE,
 | |
|   CNT_STATE_FUNC,
 | |
|   CNT_SET_OP,
 | |
|   CNT_LAST_INSERT_ID,
 | |
|   CNT_WINDOW_FUNC,
 | |
|   CNT_PRIOR,
 | |
|   CNT_RAND_FUNC,
 | |
|   CNT_ROWNUM,
 | |
|   CNT_LEVEL,
 | |
|   CNT_CONNECT_BY_ISLEAF,
 | |
|   CNT_CONNECT_BY_ISCYCLE,
 | |
|   CNT_PSEUDO_COLUMN,
 | |
|   CNT_CONNECT_BY_ROOT,
 | |
|   CNT_SYS_CONNECT_BY_PATH,
 | |
|   CNT_OUTER_JOIN_SYMBOL,
 | |
|   CNT_SO_UDF,      // expression contains user defined function(dll) expression. add prefix 'SO', means different with PL UDF.
 | |
|   CNT_PL_UDF,
 | |
|   CNT_SEQ_EXPR,
 | |
|   CNT_DYNAMIC_PARAM,
 | |
|   CNT_ENUM_OR_SET,
 | |
|   CNT_VOLATILE_CONST,
 | |
|   CNT_ORA_ROWSCN_EXPR,
 | |
|   CNT_OP_PSEUDO_COLUMN,
 | |
|   CNT_ASSIGN_EXPR,
 | |
|   CNT_OBJ_ACCESS_EXPR,
 | |
|   CNT_ASSOCIATED_FLAG_END, //add CNT_xxx flag before me
 | |
| 
 | |
|   BE_USED, // expression has been applied
 | |
|   IS_SIMPLE_COND,   // column = const
 | |
|   IS_RANGE_COND,    // column belongs to a range
 | |
|   IS_JOIN_COND,     // column = column of different tables
 | |
|   IS_COLUMNLIZED,   // for code generator, @see ObExprGenerator
 | |
|   IS_ROOT, //for code generator, @see ObExprGenerator
 | |
|   IS_NEW_AGG_EXPR,
 | |
|   IS_WITH_ALL,
 | |
|   IS_WITH_ANY,
 | |
|   IS_WITH_SUBQUERY,
 | |
|   IS_INNER_ADDED_EXPR,
 | |
|   IS_PL_ACCESS_IDX,
 | |
|   IS_SELECT_REF,     // expr is refer to select item
 | |
|   IS_SHARED_REF,
 | |
|   IS_OP_OPERAND_IMPLICIT_CAST, // is implicit cast added for operand casting (add in type deducing)
 | |
|   IS_UDT_UDF_SELF_PARAM, // this is a udt udf self param mock by pl engine
 | |
|   IS_PL_MOCK_DEFAULT_EXPR,
 | |
|   IS_PROBABLY_LOCAL, // probably executed in local thread, for partial expr serialization
 | |
|   IS_MARKED,
 | |
|   IS_ROWID,
 | |
|   IS_ROWID_SIMPLE_COND, // rowid = const
 | |
|   IS_ROWID_RANGE_COND,   // rowid belongs to a range
 | |
|   IS_TABLE_ASSIGN // update t1 set c1 = const
 | |
| };
 | |
| 
 | |
| #define IS_INFO_MASK_BEGIN  IS_CONST
 | |
| #define IS_INFO_MASK_END IS_ASSOCIATED_FLAG_END
 | |
| #define CNT_INFO_MASK_BEGIN CNT_CONST
 | |
| #define CNT_INFO_MASK_END CNT_ASSOCIATED_FLAG_END
 | |
| #define INHERIT_MASK_BEGIN  CNT_CONST_EXPR
 | |
| #define INHERIT_MASK_END CNT_ASSOCIATED_FLAG_END
 | |
| 
 | |
| inline const char* get_expr_info_flag_str(const ObExprInfoFlag flag)
 | |
| {
 | |
|   const char* ret = "UNKNOWN";
 | |
|   switch(flag) {
 | |
|     case IS_CONST: { ret = "IS_CONST"; break; }
 | |
|     case IS_COLUMN: { ret = "IS_COLUMN"; break; }
 | |
|     case IS_STATIC_PARAM: { ret = "IS_STATIC_PARAM"; break; }
 | |
|     case IS_AGG: { ret = "IS_AGG"; break; }
 | |
|     case IS_FUNC: { ret = "IS_FUNC"; break; }
 | |
|     case IS_IN: { ret = "IS_IN"; break; }
 | |
|     case IS_NOT: { ret = "IS_NOT"; break; }
 | |
|     case IS_OR: { ret = "IS_OR"; break; }
 | |
|     case IS_SUB_QUERY: { ret = "IS_SUB_QUERY"; break; }
 | |
|     case IS_ONETIME: { ret = "IS_ONETIME"; break; }
 | |
|     case IS_ALIAS: { ret = "IS_ALIAS"; break; }
 | |
|     case IS_CUR_TIME: { ret = "IS_CUR_TIME"; break; }
 | |
|     case IS_IS_EXPR: { ret = "IS_IS_EXPR"; break; }
 | |
|     case IS_VALUES: { ret = "IS_VALUES"; break; }
 | |
|     case IS_DEFAULT: { ret = "IS_DEFAULT"; break; }
 | |
|     case IS_DYNAMIC_USER_VARIABLE: { ret = "IS_DYNAMIC_USER_VARIABLE"; break; }
 | |
|     case IS_STATE_FUNC: { ret = "IS_STATE_FUNC"; break; }
 | |
|     case IS_SET_OP: { ret = "IS_SET_OP"; break; }
 | |
|     case IS_LAST_INSERT_ID: { ret = "IS_LAST_INSERT_ID"; break; }
 | |
|     case IS_WINDOW_FUNC: { ret = "IS_WINDOW_FUNC"; break; }
 | |
|     case IS_PRIOR: { ret = "IS_PRIOR"; break;}
 | |
|     case IS_RAND_FUNC: { ret = "IS_RAND_FUNC"; break;}
 | |
|     case IS_ROWNUM: { ret = "IS_ROWNUM"; break;}
 | |
|     case IS_LEVEL: { ret = "IS_LEVEL"; break;}
 | |
|     case IS_CONNECT_BY_ISLEAF: { ret = "IS_CONNECT_BY_ISLEAF"; break;}
 | |
|     case IS_CONNECT_BY_ISCYCLE: { ret = "IS_CONNECT_BY_ISCYCLE"; break;}
 | |
|     case IS_PSEUDO_COLUMN: { ret = "IS_PSEUDO_COLUMN"; break; }
 | |
|     case IS_CONNECT_BY_ROOT: { ret = "IS_CONNECT_BY_ROOT"; break; }
 | |
|     case IS_SYS_CONNECT_BY_PATH: { ret = "IS_SYS_CONNECT_BY_PATH"; break; }
 | |
|     case IS_OUTER_JOIN_SYMBOL: { ret = "IS_OUTER_JOIN_SYMBOL"; break; }
 | |
|     case IS_SO_UDF_EXPR: { ret = "IS_SO_UDF_EXPR"; break; }
 | |
|     case IS_PL_UDF: { ret = "IS_PL_UDF"; break; };
 | |
|     case IS_SEQ_EXPR: { ret = "IS_SEQ_EXPR"; break; }
 | |
|     case IS_ENUM_OR_SET: { ret = "IS_ENUM_OR_SET"; break; }
 | |
|     case IS_ASSIGN_EXPR: { ret = "IS_ASSIGN_EXPR"; break; }
 | |
|     case IS_CONST_EXPR: { ret = "IS_CONST_EXPR"; break; }
 | |
|     case CNT_CONST_EXPR: { ret = "CNT_CONST_EXPR"; break; }
 | |
|     case CNT_CONST: { ret = "CNT_CONST"; break; }
 | |
|     case CNT_COLUMN: { ret = "CNT_COLUMN"; break; }
 | |
|     case CNT_STATIC_PARAM: { ret = "CNT_STATIC_PARAM"; break; }
 | |
|     case CNT_AGG: { ret = "CNT_AGG"; break; }
 | |
|     case CNT_FUNC: { ret = "CNT_FUNC"; break; }
 | |
|     case CNT_IN: { ret = "CNT_IN"; break; }
 | |
|     case CNT_NOT: { ret = "CNT_NOT"; break; }
 | |
|     case CNT_OR: { ret = "CNT_OR"; break; }
 | |
|     case CNT_SUB_QUERY: { ret = "CNT_SUB_QUERY"; break; }
 | |
|     case CNT_ONETIME: { ret = "CNT_ONETIME"; break; }
 | |
|     case CNT_ALIAS: { ret = "CNT_ALIAS"; break; }
 | |
|     case CNT_CUR_TIME: { ret = "CNT_CUR_TIME"; break; }
 | |
|     case CNT_IS_EXPR: { ret = "CNT_IS_EXPR"; break; }
 | |
|     case CNT_VALUES: { ret = "CNT_VALUES"; break; }
 | |
|     case CNT_DEFAULT: { ret = "CNT_DEFAULT"; break; }
 | |
|     case CNT_DYNAMIC_USER_VARIABLE: { ret = "CNT_DYNAMIC_USER_VARIABLE"; break; }
 | |
|     case CNT_STATE_FUNC: { ret = "CNT_STATE_FUNC"; break; }
 | |
|     case CNT_SET_OP: { ret = "CNT_SET_OP"; break; }
 | |
|     case CNT_LAST_INSERT_ID: { ret = "CNT_LAST_INSERT_ID"; break; }
 | |
|     case CNT_WINDOW_FUNC: { ret = "CNT_WINDOW_FUNC"; break; }
 | |
|     case CNT_PRIOR: {ret = "CNT_PRIOR"; break; }
 | |
|     case CNT_RAND_FUNC: {ret = "CNT_RAND_FUNC"; break; }
 | |
|     case CNT_ROWNUM: {ret = "CNT_ROWNUM"; break; }
 | |
|     case CNT_LEVEL: {ret = "CNT_LEVEL"; break; }
 | |
|     case CNT_CONNECT_BY_ISLEAF: {ret = "CNT_CONNECT_BY_ISLEAF"; break; }
 | |
|     case CNT_CONNECT_BY_ISCYCLE: {ret = "CNT_CONNECT_BY_ISCYCLE"; break; }
 | |
|     case CNT_PSEUDO_COLUMN: { ret = "CNT_PSEUDO_COLUMN"; break; }
 | |
|     case CNT_CONNECT_BY_ROOT: { ret = "CNT_CONNECT_BY_ROOT"; break; }
 | |
|     case CNT_SYS_CONNECT_BY_PATH: { ret = "CNT_SYS_CONNECT_BY_PATH"; break; }
 | |
|     case CNT_OUTER_JOIN_SYMBOL: {ret = "CNT_OUTER_JOIN_SYMBOL"; break; }
 | |
|     case CNT_SO_UDF: {ret = "CNT_SO_UDF"; break; }
 | |
|     case CNT_PL_UDF: { ret = "CNT_PL_UDF"; break; }
 | |
|     case CNT_SEQ_EXPR: { ret = "CNT_SEQ_EXPR"; break; }
 | |
|     case CNT_DYNAMIC_PARAM: { ret = "CNT_DYNAMIC_PARAM"; break; }
 | |
|     case CNT_ENUM_OR_SET: { ret = "CNT_ENUM_OR_SET"; break; }
 | |
|     case CNT_ASSIGN_EXPR: { ret = "CNT_ASSIGN_EXPR"; break; }
 | |
|     case BE_USED: { ret = "BE_USED"; break; }
 | |
|     case IS_SIMPLE_COND: { ret = "IS_SIMPLE_COND"; break; }
 | |
|     case IS_RANGE_COND: { ret = "IS_RANGE_COND"; break; }
 | |
|     case IS_JOIN_COND: { ret = "IS_JOIN_COND"; break; }
 | |
|     case IS_COLUMNLIZED: { ret = "IS_COLUMNLIZED"; break; }
 | |
|     case IS_ROOT: { ret = "IS_ROOT"; break; }
 | |
|     case IS_DYNAMIC_PARAM: { ret = "IS_DYNAMIC_PARAM"; break; }
 | |
|     case IS_NEW_AGG_EXPR: { ret = "IS_NEW_AGG_EXPR"; break; }
 | |
|     case IS_WITH_ALL: { ret = "IS_WITH_ALL"; break; }
 | |
|     case IS_WITH_ANY: { ret = "IS_WITH_ANY"; break; }
 | |
|     case IS_WITH_SUBQUERY: { ret = "IS_WITH_SUBQUERY"; break; }
 | |
|     case IS_INNER_ADDED_EXPR: { ret = "IS_INNER_ADDED_EXPR"; break; }
 | |
|     case IS_PL_ACCESS_IDX: { ret = "IS_PL_ACCESS_IDX"; break; }
 | |
|     case IS_SELECT_REF: { ret = "IS_SELECT_REF"; break; }
 | |
|     case IS_SHARED_REF : { ret = "IS_SHARED_REF"; break; }
 | |
|     case IS_OP_OPERAND_IMPLICIT_CAST: { ret = "IS_OP_OPERAND_IMPLICIT_CAST"; break; }
 | |
|     case IS_UDT_UDF_SELF_PARAM: { ret = "IS_UDT_UDF_SELF_PARAM"; break; }
 | |
|     case IS_PL_MOCK_DEFAULT_EXPR : { ret = "IS_PL_MOCK_DEFAULT_EXPR"; break; }
 | |
|     case IS_ROWID: { ret = "IS_ROWID"; break; }
 | |
|     case IS_ROWID_SIMPLE_COND: { ret = "IS_ROWID_SIMPLE_COND"; break; }
 | |
|     case IS_ROWID_RANGE_COND: { ret = "IS_ROWID_RANGE_COND"; break; }
 | |
|     case IS_TABLE_ASSIGN: { ret = "IS_TABLE_ASSIGN"; break; }
 | |
|     default:
 | |
|       break;
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| }  // namespace sql
 | |
| }  // namespace oceabase
 | |
| #endif /* OCEANBASE_SRC_SQL_RESOLVER_EXPR_OB_EXPR_INFO_FLAG_H_ */
 | 
