fix charset (#736)
This commit is contained in:
@ -4380,6 +4380,15 @@ BINARY opt_string_length_i_v2
|
|||||||
$$->int32_values_[OB_NODE_CAST_C_LEN_IDX] = $2[0]; /* length */
|
$$->int32_values_[OB_NODE_CAST_C_LEN_IDX] = $2[0]; /* length */
|
||||||
$$->param_num_ = $2[1];
|
$$->param_num_ = $2[1];
|
||||||
}
|
}
|
||||||
|
| CHARACTER opt_string_length_i_v2 CHARACTER SET charset_name
|
||||||
|
{
|
||||||
|
malloc_terminal_node($$, result->malloc_pool_, T_CAST_ARGUMENT);
|
||||||
|
$$->value_ = 0;
|
||||||
|
$$->int16_values_[OB_NODE_CAST_TYPE_IDX] = T_CHAR; /* data type */
|
||||||
|
$$->param_num_ = $2[1];
|
||||||
|
$$->str_value_ = $5->str_value_;
|
||||||
|
$$->str_len_ = $5->str_len_;
|
||||||
|
}
|
||||||
| cast_datetime_type_i opt_datetime_fsp_i
|
| cast_datetime_type_i opt_datetime_fsp_i
|
||||||
{
|
{
|
||||||
malloc_terminal_node($$, result->malloc_pool_, T_CAST_ARGUMENT);
|
malloc_terminal_node($$, result->malloc_pool_, T_CAST_ARGUMENT);
|
||||||
@ -14577,4 +14586,4 @@ int obsql_mysql_fast_parse(ParseResult *p)
|
|||||||
p->no_param_sql_[len] = '\0';
|
p->no_param_sql_[len] = '\0';
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -318,8 +318,23 @@ int ObRawExprResolverImpl::do_recursive_resolve(const ParseNode* node, ObRawExpr
|
|||||||
} else if (ob_is_extend(data_type)) {
|
} else if (ob_is_extend(data_type)) {
|
||||||
ret = OB_NOT_SUPPORTED;
|
ret = OB_NOT_SUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OB_SUCC(ret)) {
|
if (OB_SUCC(ret)) {
|
||||||
val.set_int(node->value_);
|
if (node->str_value_) {
|
||||||
|
ObString cs_name = ObString(node->str_value_);
|
||||||
|
ObCharsetType charset_type = CHARSET_INVALID;
|
||||||
|
if (CHARSET_INVALID == (charset_type = ObCharset::charset_type(cs_name.trim()))) {
|
||||||
|
ret = OB_ERR_UNKNOWN_CHARSET;
|
||||||
|
LOG_WARN("unknown charset", K(ret), K(cs_name));
|
||||||
|
} else {
|
||||||
|
ParseNode tmp_node;
|
||||||
|
tmp_node.value_ = node->value_;
|
||||||
|
tmp_node.int16_values_[OB_NODE_CAST_COLL_IDX] = ObCharset::get_default_collation(charset_type);
|
||||||
|
val.set_int(tmp_node.value_);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
val.set_int(node->value_);
|
||||||
|
}
|
||||||
c_expr->set_value(val);
|
c_expr->set_value(val);
|
||||||
c_expr->set_param(val);
|
c_expr->set_param(val);
|
||||||
expr = c_expr;
|
expr = c_expr;
|
||||||
|
@ -501,4 +501,10 @@ utf8mb4_bin
|
|||||||
select collation(cast('A' as char)), cast('A' as char) < 'a';
|
select collation(cast('A' as char)), cast('A' as char) < 'a';
|
||||||
collation(cast('A' as char)) cast('A' as char) < 'a'
|
collation(cast('A' as char)) cast('A' as char) < 'a'
|
||||||
utf8mb4_bin 1
|
utf8mb4_bin 1
|
||||||
|
SELECT collation(CAST('A' AS char CHAR SET utf8mb4));
|
||||||
|
collation(CAST('A' AS char CHAR SET utf8mb4))
|
||||||
|
utf8mb4_general_ci
|
||||||
|
SELECT collation(CAST('A' AS char CHAR SET binary));
|
||||||
|
collation(CAST('A' AS char CHAR SET binary))
|
||||||
|
binary
|
||||||
drop table coll_test;
|
drop table coll_test;
|
||||||
|
@ -247,6 +247,10 @@ select collation(cast(1 as char));
|
|||||||
SELECT collation(DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y'));
|
SELECT collation(DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y'));
|
||||||
select collation(cast('A' as char)), cast('A' as char) < 'a';
|
select collation(cast('A' as char)), cast('A' as char) < 'a';
|
||||||
|
|
||||||
|
#set utf8 binary collation set
|
||||||
|
SELECT collation(CAST('A' AS char CHAR SET utf8mb4));
|
||||||
|
SELECT collation(CAST('A' AS char CHAR SET binary));
|
||||||
|
|
||||||
################################################################
|
################################################################
|
||||||
# tear-down
|
# tear-down
|
||||||
drop table coll_test;
|
drop table coll_test;
|
||||||
|
Reference in New Issue
Block a user