Support hex string for load data formats
This commit is contained in:
@ -3080,10 +3080,12 @@ int ObLoadDataSPImpl::ToolBox::init(ObExecContext &ctx, ObLoadDataStmt &load_stm
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OB_SUCC(ret)) {
|
int64_t buf_len = DEFAULT_BUF_LENGTH;
|
||||||
|
bool need_extend = true;
|
||||||
|
while (OB_SUCC(ret) && need_extend) {
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
int64_t buf_len = DEFAULT_BUF_LENGTH;
|
|
||||||
int64_t pos = 0;
|
int64_t pos = 0;
|
||||||
|
buf_len *= 2;
|
||||||
if (OB_ISNULL(buf = static_cast<char*>(ctx.get_allocator().alloc(buf_len)))) {
|
if (OB_ISNULL(buf = static_cast<char*>(ctx.get_allocator().alloc(buf_len)))) {
|
||||||
ret = OB_ALLOCATE_MEMORY_FAILED;
|
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||||
LOG_WARN("no memory", K(ret), K(buf_len));
|
LOG_WARN("no memory", K(ret), K(buf_len));
|
||||||
@ -3114,6 +3116,14 @@ int ObLoadDataSPImpl::ToolBox::init(ObExecContext &ctx, ObLoadDataStmt &load_stm
|
|||||||
cur_query_str.length(), cur_query_str.ptr()));
|
cur_query_str.length(), cur_query_str.ptr()));
|
||||||
OX (load_info.assign_ptr(buf, pos));
|
OX (load_info.assign_ptr(buf, pos));
|
||||||
}
|
}
|
||||||
|
if (OB_SUCC(ret)) {
|
||||||
|
need_extend = false;
|
||||||
|
} else {
|
||||||
|
if (OB_SIZE_OVERFLOW == ret) {
|
||||||
|
ret = OB_SUCCESS;
|
||||||
|
need_extend = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OB_SUCC(ret)) {
|
if (OB_SUCC(ret)) {
|
||||||
|
|||||||
@ -10202,19 +10202,19 @@ field_term_list field_term
|
|||||||
;
|
;
|
||||||
|
|
||||||
field_term:
|
field_term:
|
||||||
TERMINATED BY STRING_VALUE
|
TERMINATED BY text_string
|
||||||
{
|
{
|
||||||
malloc_non_terminal_node($$, result->malloc_pool_, T_FIELD_TERMINATED_STR, 1, $3);
|
malloc_non_terminal_node($$, result->malloc_pool_, T_FIELD_TERMINATED_STR, 1, $3);
|
||||||
}
|
}
|
||||||
| OPTIONALLY ENCLOSED BY STRING_VALUE
|
| OPTIONALLY ENCLOSED BY text_string
|
||||||
{
|
{
|
||||||
malloc_non_terminal_node($$, result->malloc_pool_, T_OPTIONALLY_CLOSED_STR, 1, $4);
|
malloc_non_terminal_node($$, result->malloc_pool_, T_OPTIONALLY_CLOSED_STR, 1, $4);
|
||||||
}
|
}
|
||||||
| ENCLOSED BY STRING_VALUE
|
| ENCLOSED BY text_string
|
||||||
{
|
{
|
||||||
malloc_non_terminal_node($$, result->malloc_pool_, T_CLOSED_STR, 1, $3);
|
malloc_non_terminal_node($$, result->malloc_pool_, T_CLOSED_STR, 1, $3);
|
||||||
}
|
}
|
||||||
| ESCAPED BY STRING_VALUE
|
| ESCAPED BY text_string
|
||||||
{
|
{
|
||||||
malloc_non_terminal_node($$, result->malloc_pool_, T_ESCAPED_STR, 1, $3);
|
malloc_non_terminal_node($$, result->malloc_pool_, T_ESCAPED_STR, 1, $3);
|
||||||
}
|
}
|
||||||
@ -10290,11 +10290,11 @@ line_term_list line_term
|
|||||||
;
|
;
|
||||||
|
|
||||||
line_term:
|
line_term:
|
||||||
TERMINATED BY STRING_VALUE
|
TERMINATED BY text_string
|
||||||
{
|
{
|
||||||
malloc_non_terminal_node($$, result->malloc_pool_, T_LINE_TERMINATED_STR, 1, $3);
|
malloc_non_terminal_node($$, result->malloc_pool_, T_LINE_TERMINATED_STR, 1, $3);
|
||||||
}
|
}
|
||||||
| STARTING BY STRING_VALUE
|
| STARTING BY text_string
|
||||||
{
|
{
|
||||||
malloc_non_terminal_node($$, result->malloc_pool_, T_LINE_START_STR, 1, $3);
|
malloc_non_terminal_node($$, result->malloc_pool_, T_LINE_START_STR, 1, $3);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1393,6 +1393,9 @@ int ObLoadDataResolver::resolve_string_node(const ParseNode &node, ObString &tar
|
|||||||
OZ (ObResolverUtils::escape_char_for_oracle_mode(*allocator_, target_str, cs_type));
|
OZ (ObResolverUtils::escape_char_for_oracle_mode(*allocator_, target_str, cs_type));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case T_HEX_STRING:
|
||||||
|
target_str.assign_ptr(node.str_value_, static_cast<int32_t>(node.str_len_));
|
||||||
|
break;
|
||||||
case T_OPTIONALLY_CLOSED_STR:
|
case T_OPTIONALLY_CLOSED_STR:
|
||||||
ret = OB_NOT_SUPPORTED;
|
ret = OB_NOT_SUPPORTED;
|
||||||
LOG_USER_ERROR(OB_NOT_SUPPORTED, "optionally enclosed string");
|
LOG_USER_ERROR(OB_NOT_SUPPORTED, "optionally enclosed string");
|
||||||
|
|||||||
@ -4992,6 +4992,10 @@ int ObSelectResolver::resolve_into_const_node(const ParseNode *node, ObObj &obj)
|
|||||||
obj.set_varchar(node_str);
|
obj.set_varchar(node_str);
|
||||||
obj.set_collation_type(cs_type);
|
obj.set_collation_type(cs_type);
|
||||||
}
|
}
|
||||||
|
} else if (T_HEX_STRING == node->type_) {
|
||||||
|
ObString node_str(node->str_len_, node->str_value_);
|
||||||
|
obj.set_varchar(node_str);
|
||||||
|
obj.set_collation_type(CS_TYPE_BINARY);
|
||||||
} else if (T_QUESTIONMARK == node->type_) {
|
} else if (T_QUESTIONMARK == node->type_) {
|
||||||
obj.set_unknown(node->value_);
|
obj.set_unknown(node->value_);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user