Fix bug: Prepared statement in Oracle mode did not set the length semantics for string variables.

This commit is contained in:
GongYusen
2024-06-28 12:42:23 +00:00
committed by ob-robot
parent bee4a0e083
commit 92fb30597e

View File

@ -2685,6 +2685,32 @@ int ObMPStmtExecute::parse_param_value(ObIAllocator &allocator,
} }
} }
} }
// set length semantics
if (OB_SUCC(ret) && lib::is_oracle_mode()) {
const ObLengthSemantics default_length_semantics = ctx_.session_info_->get_actual_nls_length_semantics();
if (MYSQL_TYPE_OB_NVARCHAR2 == type || MYSQL_TYPE_VAR_STRING == type ||
MYSQL_TYPE_OB_NCHAR == type || MYSQL_TYPE_VARCHAR == type ||
MYSQL_TYPE_STRING == type) {
if (length == 0) {
param.set_length_semantics(default_length_semantics);
} else {
ObLengthSemantics length_semantics = LS_DEFAULT;
if ((MYSQL_TYPE_OB_NVARCHAR2 == type || MYSQL_TYPE_VAR_STRING == type || MYSQL_TYPE_OB_NCHAR == type)) {
length_semantics = LS_CHAR;
} else {
length_semantics = default_length_semantics;
}
if (is_oracle_byte_length(true, length_semantics)
&& MYSQL_TYPE_OB_NVARCHAR2 != type
&& MYSQL_TYPE_VAR_STRING != type
&& MYSQL_TYPE_OB_NCHAR != type) {
param.set_length_semantics(LS_BYTE);
} else {
param.set_length_semantics(LS_CHAR);
}
}
}
}
return ret; return ret;
} }