Fix functional index bugs
This commit is contained in:
		| @ -892,6 +892,8 @@ int ObExprCast::is_valid_for_generated_column(const ObRawExpr*expr, const common | ||||
|       } | ||||
|     } else if (ObTimeType == src && ObTimeType != dst && ob_is_temporal_type(dst)) { | ||||
|       is_valid = false; | ||||
|     } else if (ObTimestampType == src && ObTimestampType != dst) { | ||||
|       is_valid = false; | ||||
|     } | ||||
|   } | ||||
|   return ret; | ||||
|  | ||||
| @ -26,7 +26,7 @@ namespace sql | ||||
| { | ||||
|  | ||||
| ObExprDateFormat::ObExprDateFormat(ObIAllocator &alloc) | ||||
|     : ObStringExprOperator(alloc, T_FUN_SYS_DATE_FORMAT, N_DATE_FORMAT, 2, VALID_FOR_GENERATED_COL) | ||||
|     : ObStringExprOperator(alloc, T_FUN_SYS_DATE_FORMAT, N_DATE_FORMAT, 2, NOT_VALID_FOR_GENERATED_COL) | ||||
| { | ||||
| } | ||||
|  | ||||
| @ -143,6 +143,21 @@ int ObExprDateFormat::calc_date_format_invalid(const ObExpr &expr, ObEvalCtx &ct | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
| int ObExprDateFormat::is_valid_for_generated_column(const ObRawExpr*expr, const common::ObIArray<ObRawExpr *> &exprs, bool &is_valid) const { | ||||
|   int ret = OB_SUCCESS; | ||||
|   is_valid = true; | ||||
|   if (exprs.count() < 1) { | ||||
|     ret = OB_ERR_UNEXPECTED; | ||||
|     LOG_WARN("unexpected param num", K(ret), K(exprs.count())); | ||||
|   } else if (OB_ISNULL(exprs.at(0))) { | ||||
|     ret = OB_ERR_UNEXPECTED; | ||||
|     LOG_WARN("invalid param", K(ret), K(exprs.at(0)), K(exprs.at(1))); | ||||
|   } else if (ObTimeType == exprs.at(0)->get_result_type().get_type() || ObTimestampType == exprs.at(0)->get_result_type().get_type()) { | ||||
|     is_valid = false; | ||||
|   } | ||||
|   return ret; | ||||
| } | ||||
|  | ||||
| const char* ObExprGetFormat::FORMAT_STR[FORMAT_MAX] = | ||||
| { | ||||
|   "EUR", | ||||
|  | ||||
| @ -35,6 +35,7 @@ public: | ||||
|                       ObExpr &rt_expr) const override; | ||||
|   static int calc_date_format(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &expr_datum); | ||||
|   static int calc_date_format_invalid(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &expr_datum); | ||||
|   virtual int is_valid_for_generated_column(const ObRawExpr*expr, const common::ObIArray<ObRawExpr *> &exprs, bool &is_valid) const; | ||||
| private: | ||||
|   // disallow copy | ||||
|   DISALLOW_COPY_AND_ASSIGN(ObExprDateFormat); | ||||
|  | ||||
| @ -24,7 +24,7 @@ namespace oceanbase | ||||
| namespace sql | ||||
| { | ||||
| ObExprXmlAttributes::ObExprXmlAttributes(ObIAllocator &alloc) | ||||
|     : ObFuncExprOperator(alloc, T_FUN_SYS_XML_ATTRIBUTES, N_XML_ATTRIBUTES, MORE_THAN_TWO, NOT_VALID_FOR_GENERATED_COL, NOT_ROW_DIMENSION) | ||||
|     : ObFuncExprOperator(alloc, T_FUN_SYS_XML_ATTRIBUTES, N_XML_ATTRIBUTES, MORE_THAN_TWO, VALID_FOR_GENERATED_COL, NOT_ROW_DIMENSION) | ||||
| { | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -23,7 +23,7 @@ namespace oceanbase | ||||
| namespace sql | ||||
| { | ||||
| ObExprXmlElement::ObExprXmlElement(ObIAllocator &alloc) | ||||
|     : ObFuncExprOperator(alloc, T_FUN_SYS_XML_ELEMENT, N_XML_ELEMENT, MORE_THAN_ZERO, NOT_VALID_FOR_GENERATED_COL, NOT_ROW_DIMENSION) | ||||
|     : ObFuncExprOperator(alloc, T_FUN_SYS_XML_ELEMENT, N_XML_ELEMENT, MORE_THAN_ZERO, VALID_FOR_GENERATED_COL, NOT_ROW_DIMENSION) | ||||
| { | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -25,7 +25,7 @@ namespace sql | ||||
| { | ||||
|  | ||||
| ObExprXmlparse :: ObExprXmlparse(common::ObIAllocator &alloc) | ||||
|   : ObFuncExprOperator(alloc, T_FUN_SYS_XMLPARSE, N_XMLPARSE, MORE_THAN_TWO, NOT_VALID_FOR_GENERATED_COL, NOT_ROW_DIMENSION) | ||||
|   : ObFuncExprOperator(alloc, T_FUN_SYS_XMLPARSE, N_XMLPARSE, MORE_THAN_TWO, VALID_FOR_GENERATED_COL, NOT_ROW_DIMENSION) | ||||
| { | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -1974,6 +1974,17 @@ int ObRawExprUtils::build_generated_column_expr(const obrpc::ObCreateIndexArg *a | ||||
|   if (OB_SUCC(ret)) { | ||||
|     if (OB_FAIL(expr->formalize(&session_info))) { | ||||
|       LOG_WARN("formalize expr failed", K(ret), KPC(expr)); | ||||
|     } else if (ObResolverUtils::CHECK_FOR_FUNCTION_INDEX == check_status || | ||||
|                ObResolverUtils::CHECK_FOR_GENERATED_COLUMN == check_status) { | ||||
|       if (OB_FAIL(ObRawExprUtils::check_is_valid_generated_col(expr, expr_factory.get_allocator()))) { | ||||
|         if (OB_ERR_ONLY_PURE_FUNC_CANBE_VIRTUAL_COLUMN_EXPRESSION == ret | ||||
|                  && ObResolverUtils::CHECK_FOR_FUNCTION_INDEX == check_status) { | ||||
|           ret = OB_ERR_ONLY_PURE_FUNC_CANBE_INDEXED; | ||||
|           LOG_WARN("sysfunc in expr is not valid for generated column", K(ret), K(*expr)); | ||||
|         } else { | ||||
|           LOG_WARN("fail to check if the sysfunc exprs are valid in generated columns", K(ret)); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|  | ||||
| @ -4377,6 +4377,21 @@ int ObResolverUtils::resolve_generated_column_expr(ObResolverParams ¶ms, | ||||
|         LOG_WARN("transform udt col expr for generated column failed", K(ret)); | ||||
|       } | ||||
|     } | ||||
|     if (OB_SUCC(ret) && | ||||
|         (ObResolverUtils::CHECK_FOR_FUNCTION_INDEX == check_status || | ||||
|          ObResolverUtils::CHECK_FOR_GENERATED_COLUMN == check_status)) { | ||||
|       if (OB_FAIL(expr->formalize(session_info))) { | ||||
|         LOG_WARN("fail to formalize expr", K(ret)); | ||||
|       } else if (OB_FAIL(ObRawExprUtils::check_is_valid_generated_col(expr, expr_factory->get_allocator()))) { | ||||
|         if (OB_ERR_ONLY_PURE_FUNC_CANBE_VIRTUAL_COLUMN_EXPRESSION == ret | ||||
|                  && ObResolverUtils::CHECK_FOR_FUNCTION_INDEX == check_status) { | ||||
|           ret = OB_ERR_ONLY_PURE_FUNC_CANBE_INDEXED; | ||||
|           LOG_WARN("sysfunc in expr is not valid for generated column", K(ret), K(*expr)); | ||||
|         } else { | ||||
|           LOG_WARN("fail to check if the sysfunc exprs are valid in generated columns", K(ret)); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     const ObObjType expr_datatype = expr->get_result_type().get_type(); | ||||
|     const ObCollationType expr_cs_type = expr->get_result_type().get_collation_type(); | ||||
|     const ObObjType dst_datatype = generated_column.get_data_type(); | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 2149
					2149