修case:dump、tochar、nanvl、information_schema
This commit is contained in:
parent
02a36be7ca
commit
cd30dbac63
@ -949,7 +949,7 @@ int ObInfoSchemaColumnsTable::fill_row_cells(const common::ObString &database_na
|
||||
select_item, schema_guard_,
|
||||
session_, column_type_str_,
|
||||
column_type_str_len_,
|
||||
column_attributes))) {
|
||||
column_attributes, false))) {
|
||||
SERVER_LOG(WARN, "failed to deduce column attributes",
|
||||
K(select_item), K(ret));
|
||||
} else {
|
||||
|
@ -617,7 +617,8 @@ int ObTableColumns::fill_row_cells(
|
||||
session_,
|
||||
column_type_str_,
|
||||
column_type_str_len_,
|
||||
column_attributes))) {
|
||||
column_attributes,
|
||||
false))) {
|
||||
LOG_WARN("failed to deduce column attributes",
|
||||
K(select_item), K(ret));
|
||||
} else {
|
||||
@ -723,7 +724,8 @@ int ObTableColumns::deduce_column_attributes(
|
||||
sql::ObSQLSessionInfo *session,
|
||||
char *column_type_str,
|
||||
int64_t column_type_str_len,
|
||||
ColumnAttributes &column_attributes) {
|
||||
ColumnAttributes &column_attributes,
|
||||
bool skip_type_str) {
|
||||
int ret = OB_SUCCESS;
|
||||
// nullable = YES: if some binaryref expr is nullable
|
||||
// nullable = NO, other cases
|
||||
@ -747,7 +749,7 @@ int ObTableColumns::deduce_column_attributes(
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (OB_ISNULL(select_stmt) || OB_ISNULL(expr)
|
||||
|| OB_ISNULL(session) || OB_ISNULL(schema_guard)
|
||||
|| OB_ISNULL(column_type_str)) {
|
||||
|| (OB_ISNULL(column_type_str) && !skip_type_str)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("parameter is NULL", K(ret), K(expr), K(select_stmt), KP(session), KP(schema_guard), KP(column_type_str));
|
||||
} else {
|
||||
@ -827,7 +829,7 @@ int ObTableColumns::deduce_column_attributes(
|
||||
} else if (result_type.get_udt_id() == T_OBJ_XML) {
|
||||
sub_type = T_OBJ_XML;
|
||||
}
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_SUCC(ret) && !skip_type_str) {
|
||||
int64_t pos = 0;
|
||||
if (OB_FAIL(ob_sql_type_str(column_type_str,
|
||||
column_type_str_len,
|
||||
@ -848,9 +850,11 @@ int ObTableColumns::deduce_column_attributes(
|
||||
if (OB_SUCC(ret)) {
|
||||
// set attributes
|
||||
column_attributes.field_ = select_item.alias_name_;
|
||||
column_attributes.type_ = ObString(column_type_str_len,
|
||||
static_cast<int32_t>(strlen(column_type_str)),
|
||||
column_type_str);
|
||||
if(!skip_type_str){
|
||||
column_attributes.type_ = ObString(column_type_str_len,
|
||||
static_cast<int32_t>(strlen(column_type_str)),
|
||||
column_type_str);
|
||||
}
|
||||
column_attributes.null_ = ObString::make_string(nullable ? "YES" : "NO");
|
||||
column_attributes.default_ = ObString::make_string(!has_default ? "NULL" : "");
|
||||
column_attributes.extra_ = ObString::make_string("");
|
||||
|
@ -86,7 +86,9 @@ public:
|
||||
sql::ObSQLSessionInfo *session,
|
||||
char *column_type_str,
|
||||
int64_t column_type_str_len,
|
||||
ColumnAttributes &column_attributes);
|
||||
ColumnAttributes &column_attributes,
|
||||
bool skip_type_str); // skip_type_str : when use ObTableColumns::deduce_column_attributes in create_view_resolver,
|
||||
// no field column_type_str, skip
|
||||
private:
|
||||
|
||||
enum DESC_COLUMN {
|
||||
|
@ -985,18 +985,24 @@ int ObExprToCharCommon::process_number_sci_value(
|
||||
} else {
|
||||
if (is_double) {
|
||||
double val = input.get_double();
|
||||
if (isnan(fabs(val)) || fabs(val) == INFINITY){
|
||||
if (isnan(fabs(val))){
|
||||
str_len = strlen("Nan");
|
||||
strncpy(buf, "Nan", str_len);
|
||||
} else if (fabs(val) == INFINITY) {
|
||||
str_len = strlen("Inf");
|
||||
strncpy(buf, "Inf", str_len);
|
||||
} else {
|
||||
str_len = ob_gcvt_opt(val, OB_GCVT_ARG_DOUBLE,
|
||||
static_cast<int32_t>(alloc_size), buf, NULL, lib::is_oracle_mode(), TRUE);
|
||||
}
|
||||
} else if (is_float) {
|
||||
float val = input.get_float();
|
||||
if (isnan(fabs(val)) || fabs(val) == INFINITY){
|
||||
if (isnan(fabs(val))){
|
||||
str_len = strlen("Nan");
|
||||
strncpy(buf, "Nan", str_len);
|
||||
} else if (fabs(val) == INFINITY) {
|
||||
str_len = strlen("Inf");
|
||||
strncpy(buf, "Inf", str_len);
|
||||
} else {
|
||||
str_len = ob_gcvt_opt(val, OB_GCVT_ARG_FLOAT,
|
||||
static_cast<int32_t>(alloc_size), buf, NULL, lib::is_oracle_mode(), TRUE);
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include "lib/hash/ob_hashset.h"
|
||||
#include "storage/mview/ob_mview_sched_job_utils.h"
|
||||
#include "sql/resolver/mv/ob_mv_checker.h"
|
||||
#include "observer/virtual_table/ob_table_columns.h"
|
||||
|
||||
namespace oceanbase
|
||||
{
|
||||
@ -1223,7 +1224,10 @@ int ObCreateViewResolver::add_column_infos(const uint64_t tenant_id,
|
||||
ObColumnSchemaV2 column;
|
||||
int64_t cur_column_id = OB_APP_MIN_COLUMN_ID;
|
||||
uint64_t data_version = 0;
|
||||
if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, data_version))) {
|
||||
share::schema::ObSchemaGetterGuard schema_guard;
|
||||
if (OB_FAIL(GCTX.schema_service_->get_tenant_schema_guard(tenant_id, schema_guard))) {
|
||||
LOG_WARN("fail to get schema guard", K(ret));
|
||||
} else if (OB_FAIL(GET_MIN_DATA_VERSION(tenant_id, data_version))) {
|
||||
LOG_WARN("failed to get data version", K(ret));
|
||||
} else if (data_version >= DATA_VERSION_4_1_0_0) {
|
||||
if (!column_list.empty() && OB_UNLIKELY(column_list.count() != select_items.count())) {
|
||||
@ -1254,6 +1258,8 @@ int ObCreateViewResolver::add_column_infos(const uint64_t tenant_id,
|
||||
OB_FAIL(resolve_column_default_value(&select_stmt, select_item, column, alloc, session_info))) {
|
||||
// oracle mode has default expr value, not support now
|
||||
LOG_WARN("add column to table_schema failed", K(ret), K(column));
|
||||
} else if (OB_FAIL(resolve_columns_nullable_value(&select_stmt, select_item, column, alloc, session_info, &schema_guard))){
|
||||
LOG_WARN("failed to add column nullable info", K(ret));
|
||||
} else if (OB_FAIL(table_schema.add_column(column))) {
|
||||
LOG_WARN("add column to table_schema failed", K(ret), K(column));
|
||||
} else {
|
||||
@ -1282,7 +1288,6 @@ int ObCreateViewResolver::fill_column_meta_infos(const ObRawExpr &expr,
|
||||
column.set_collation_type(expr.get_collation_type());
|
||||
column.set_accuracy(expr.get_accuracy());
|
||||
column.set_zero_fill(expr.get_result_type().has_result_flag(ZEROFILL_FLAG));
|
||||
column.set_nullable(expr.get_result_type().is_not_null_for_read() ? false : true);
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (column.is_enum_or_set() && OB_FAIL(column.set_extended_type_info(expr.get_enum_set_values()))) {
|
||||
LOG_WARN("set enum or set info failed", K(ret), K(expr));
|
||||
@ -1326,5 +1331,30 @@ int ObCreateViewResolver::resolve_column_default_value(const sql::ObSelectStmt *
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObCreateViewResolver::resolve_columns_nullable_value(const sql::ObSelectStmt *select_stmt,
|
||||
const sql::SelectItem &select_item,
|
||||
ObColumnSchemaV2 &column_schema,
|
||||
ObIAllocator &alloc,
|
||||
ObSQLSessionInfo &session_info,
|
||||
share::schema::ObSchemaGetterGuard *schema_guard)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
observer::ObTableColumns::ColumnAttributes column_attributes;
|
||||
if (OB_FAIL(observer::ObTableColumns::deduce_column_attributes(is_oracle_mode(),
|
||||
select_stmt,
|
||||
select_item,
|
||||
schema_guard,
|
||||
&session_info,
|
||||
NULL,
|
||||
0,
|
||||
column_attributes,
|
||||
true))) {
|
||||
LOG_WARN("failed to resolve nullable value", K(ret));
|
||||
} else {
|
||||
column_schema.set_nullable(column_attributes.null_ == "YES");
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
} // namespace sql
|
||||
} // namespace oceanbase
|
||||
|
@ -67,6 +67,12 @@ public:
|
||||
schema::ObColumnSchemaV2 &column_schema,
|
||||
common::ObIAllocator &alloc,
|
||||
sql::ObSQLSessionInfo &session_info);
|
||||
static int resolve_columns_nullable_value(const sql::ObSelectStmt *select_stmt,
|
||||
const sql::SelectItem &select_item,
|
||||
ObColumnSchemaV2 &column_schema,
|
||||
ObIAllocator &alloc,
|
||||
ObSQLSessionInfo &session_info,
|
||||
share::schema::ObSchemaGetterGuard *schema_guard);
|
||||
private:
|
||||
int check_privilege(ObCreateTableStmt *stmt,
|
||||
ObSelectStmt *select_stmt);
|
||||
|
Loading…
x
Reference in New Issue
Block a user