[FEAT MERGE] GIS
This commit is contained in:
		@ -17,6 +17,7 @@
 | 
			
		||||
#include "sql/engine/expr/ob_expr_cast.h"
 | 
			
		||||
#include "sql/engine/expr/ob_datum_cast.h"
 | 
			
		||||
#include "sql/resolver/expr/ob_raw_expr_util.h"
 | 
			
		||||
#include "lib/geo/ob_geometry_cast.h"
 | 
			
		||||
 | 
			
		||||
// from sql_parser_base.h
 | 
			
		||||
#define DEFAULT_STR_LENGTH -1
 | 
			
		||||
@ -159,7 +160,8 @@ int ObExprCast::get_cast_string_len(ObExprResType &type1,
 | 
			
		||||
    case ObEnumInnerType:
 | 
			
		||||
    case ObSetInnerType:
 | 
			
		||||
    case ObLobType:
 | 
			
		||||
    case ObJsonType: {
 | 
			
		||||
    case ObJsonType:
 | 
			
		||||
    case ObGeometryType: {
 | 
			
		||||
      res_len = type1.get_length();
 | 
			
		||||
      length_semantics = type1.get_length_semantics();
 | 
			
		||||
      break;
 | 
			
		||||
@ -308,7 +310,7 @@ int ObExprCast::calc_result_type2(ObExprResType &type,
 | 
			
		||||
                                        dst_type.get_type(), dst_type.get_collation_type()))) {
 | 
			
		||||
    ret = OB_ERR_INVALID_TYPE_FOR_OP;
 | 
			
		||||
    LOG_WARN("transition does not support", "src", ob_obj_type_str(type1.get_type()),
 | 
			
		||||
             "dst", ob_obj_type_str(dst_type.get_type()));
 | 
			
		||||
               "dst", ob_obj_type_str(dst_type.get_type()));
 | 
			
		||||
  } else if (FALSE_IT(is_explicit_cast = CM_IS_EXPLICIT_CAST(cast_raw_expr->get_extra()))) {
 | 
			
		||||
  // check cast supported in cast_map but not support here.
 | 
			
		||||
  } else if (FALSE_IT(is_to_column_cs_level = CM_IS_TO_COLUMN_CS_LEVEL(cast_raw_expr->get_extra()))) {
 | 
			
		||||
@ -356,7 +358,8 @@ int ObExprCast::calc_result_type2(ObExprResType &type,
 | 
			
		||||
      ObCollationType collation_nation = session->get_nls_collation_nation();
 | 
			
		||||
      type1.set_calc_type(get_calc_cast_type(type1.get_type(), dst_type.get_type()));
 | 
			
		||||
      int32_t length = 0;
 | 
			
		||||
      if (ob_is_string_or_lob_type(dst_type.get_type()) || ob_is_raw(dst_type.get_type()) || ob_is_json(dst_type.get_type())) {
 | 
			
		||||
      if (ob_is_string_or_lob_type(dst_type.get_type()) || ob_is_raw(dst_type.get_type()) || ob_is_json(dst_type.get_type())
 | 
			
		||||
          || ob_is_geometry(dst_type.get_type())) {
 | 
			
		||||
        type.set_collation_level((is_explicit_cast || is_to_column_cs_level)
 | 
			
		||||
                                 ? CS_LEVEL_IMPLICIT
 | 
			
		||||
                                 : type1.get_collation_level());
 | 
			
		||||
@ -460,8 +463,23 @@ int ObExprCast::calc_result_type2(ObExprResType &type,
 | 
			
		||||
          // need_warp is true, no-op and keep type1's calc_type is dst_type. It will be wrapped
 | 
			
		||||
          // to string in ObRawExprWrapEnumSet::visit(ObSysFunRawExpr &expr) later.
 | 
			
		||||
        } else {
 | 
			
		||||
          // need_warp is false, set calc_type to type1 itself.
 | 
			
		||||
          type1.set_calc_meta(type1.get_obj_meta());
 | 
			
		||||
          if (ob_is_geometry_tc(dst_type.get_type())) {
 | 
			
		||||
            ObCastMode cast_mode = cast_raw_expr->get_extra();
 | 
			
		||||
            const ObObj ¶m = type2.get_param();
 | 
			
		||||
            ParseNode parse_node;
 | 
			
		||||
            parse_node.value_ = param.get_int();
 | 
			
		||||
            ObGeoType geo_type = static_cast<ObGeoType>(parse_node.int16_values_[OB_NODE_CAST_GEO_TYPE_IDX]);
 | 
			
		||||
            if (OB_FAIL(ObGeoCastUtils::set_geo_type_to_cast_mode(geo_type, cast_mode))) {
 | 
			
		||||
              LOG_WARN("fail to set geometry type to cast mode", K(ret), K(geo_type));
 | 
			
		||||
            } else {
 | 
			
		||||
              cast_raw_expr->set_extra(cast_mode);
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          if (OB_SUCC(ret)) {
 | 
			
		||||
            // need_warp is false, set calc_type to type1 itself.
 | 
			
		||||
            type1.set_calc_meta(type1.get_obj_meta());
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
@ -502,6 +520,14 @@ int ObExprCast::get_cast_type(const ObExprResType param_type2,
 | 
			
		||||
      dst_type.set_udt_id(param_type2.get_udt_id());
 | 
			
		||||
    } else if (lib::is_mysql_mode() && ob_is_json(obj_type)) {
 | 
			
		||||
      dst_type.set_collation_type(CS_TYPE_UTF8MB4_BIN);
 | 
			
		||||
    } else if (ob_is_geometry(obj_type)) {
 | 
			
		||||
      if (lib::is_mysql_mode()) {
 | 
			
		||||
        dst_type.set_collation_type(CS_TYPE_BINARY);
 | 
			
		||||
        dst_type.set_collation_level(CS_LEVEL_IMPLICIT);
 | 
			
		||||
      } else {
 | 
			
		||||
        ret = OB_NOT_SUPPORTED;
 | 
			
		||||
        LOG_WARN("not support cast to geometry in oracle mode", K(ret));
 | 
			
		||||
      }
 | 
			
		||||
    } else if (ob_is_interval_tc(obj_type)) {
 | 
			
		||||
      if (CM_IS_EXPLICIT_CAST(cast_mode) &&
 | 
			
		||||
          ((ObIntervalYMType != obj_type && !ObIntervalScaleUtil::scale_check(parse_node.int16_values_[OB_NODE_CAST_N_PREC_IDX])) ||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user