supprt sql_quote_show_create variable in mysql mode
This commit is contained in:
@ -56,7 +56,9 @@
|
||||
#include "observer/omt/ob_tenant_srs_mgr.h"
|
||||
#include "sql/executor/ob_maintain_dependency_info_task.h"
|
||||
#include "sql/resolver/ddl/ob_create_view_resolver.h"
|
||||
|
||||
extern "C" {
|
||||
#include "sql/parser/ob_non_reserved_keywords.h"
|
||||
}
|
||||
using namespace oceanbase;
|
||||
using namespace oceanbase::sql;
|
||||
using namespace oceanbase::obmysql;
|
||||
@ -3891,20 +3893,28 @@ int ObSQLUtils::convert_sql_text_to_schema_for_storing(ObIAllocator &allocator,
|
||||
|
||||
int ObSQLUtils::print_identifier(char *buf, const int64_t buf_len, int64_t &pos,
|
||||
ObCollationType connection_collation,
|
||||
const common::ObString &identifier_name)
|
||||
const common::ObString &identifier_name,
|
||||
bool is_oracle_mode)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObArenaAllocator allocator("PrintIdentifier");
|
||||
ObString print_name;
|
||||
if (OB_ISNULL(buf)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid argument", K(ret));
|
||||
} else if (OB_FAIL(generate_new_name_with_escape_character(allocator,
|
||||
identifier_name,
|
||||
print_name,
|
||||
is_oracle_mode))) {
|
||||
LOG_WARN("failed to generate new name with escape character", K(ret));
|
||||
} else if (ObCharset::charset_type_by_coll(connection_collation)
|
||||
== CHARSET_UTF8MB4) {
|
||||
if (OB_UNLIKELY(pos + identifier_name.length() > buf_len)) {
|
||||
if (OB_UNLIKELY(pos + print_name.length() > buf_len)) {
|
||||
ret = OB_SIZE_OVERFLOW;
|
||||
LOG_WARN("size overflow", K(ret), K(identifier_name));
|
||||
LOG_WARN("size overflow", K(ret), K(print_name));
|
||||
} else {
|
||||
MEMCPY(buf + pos, identifier_name.ptr(), identifier_name.length());
|
||||
pos += identifier_name.length();
|
||||
MEMCPY(buf + pos, print_name.ptr(), print_name.length());
|
||||
pos += print_name.length();
|
||||
}
|
||||
} else if (OB_UNLIKELY(buf_len <= pos)) {
|
||||
ret = OB_SIZE_OVERFLOW;
|
||||
@ -3912,8 +3922,8 @@ int ObSQLUtils::print_identifier(char *buf, const int64_t buf_len, int64_t &pos,
|
||||
} else {
|
||||
uint32_t result_len = 0;
|
||||
if (OB_FAIL(ObCharset::charset_convert(CS_TYPE_UTF8MB4_BIN,
|
||||
identifier_name.ptr(),
|
||||
identifier_name.length(),
|
||||
print_name.ptr(),
|
||||
print_name.length(),
|
||||
connection_collation,
|
||||
buf + pos,
|
||||
buf_len - pos,
|
||||
@ -5043,3 +5053,39 @@ int ObSQLUtils::find_synonym_ref_obj(const uint64_t database_id,
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObSQLUtils::print_identifier_require_quotes(ObCollationType collation_type,
|
||||
const ObString &ident,
|
||||
bool &require)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
bool pure_digit = true;
|
||||
const ObCharsetInfo *info = ObCharset::get_charset(collation_type);
|
||||
require = false;
|
||||
if (OB_ISNULL(info)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
OB_LOG(WARN, "arguemnt is invalid", K(ret));
|
||||
} else if (ident.length() > 0 && ident[0] == '$') {
|
||||
require = true;
|
||||
}
|
||||
for (int64_t i = 0; OB_SUCC(ret) && !require && i < ident.length(); i++) {
|
||||
char ch = ident[i];
|
||||
uint length = ob_mbcharlen(info, ch);
|
||||
if (length == 0) {
|
||||
require = true;
|
||||
} else if (length == 1 && !oceanbase::sql::MYSQL_IDENTIFIER_FALGS[static_cast<uint8_t>(ch)]) {
|
||||
require = true;
|
||||
} else if (length == 1 && (ch < '0' || ch > '9')) {
|
||||
pure_digit = false;
|
||||
}
|
||||
}
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (pure_digit) {
|
||||
require = true;
|
||||
} else if (require) {
|
||||
//do nothing
|
||||
} else if (-1 != mysql_sql_reserved_keyword_lookup(ident.ptr())) {
|
||||
require = true;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
Reference in New Issue
Block a user