/* * db_get_attributes_force () - * return: * obj(in): */ DB_ATTRIBUTE * db_get_attributes_force (DB_OBJECT * obj) { SM_CLASS *class_; SM_ATTRIBUTE *atts; atts = NULL; if (au_fetch_class_force ((DB_OBJECT *) obj, &class_, AU_FETCH_READ) == NO_ERROR) { atts = class_->ordered_attributes; if (atts == NULL) er_set (ER_WARNING_SEVERITY, ARG_FILE_LINE, ER_OBJ_NO_COMPONENTS, 0); } return ((DB_ATTRIBUTE *) atts); }
/* * db_get_attribute () - * return: * obj(in): * name(in): */ DB_ATTRIBUTE * db_get_attribute_force (DB_OBJECT * obj, const char *name) { SM_CLASS *class_; SM_ATTRIBUTE *att; att = NULL; if (au_fetch_class_force (obj, &class_, AU_FETCH_READ) == NO_ERROR) { att = classobj_find_attribute (class_, name, 0); if (att == NULL) { er_set (ER_WARNING_SEVERITY, ARG_FILE_LINE, ER_OBJ_INVALID_ATTRIBUTE, 1, name); } } return ((DB_ATTRIBUTE *) att); }
/* * pt_check_show_heap () - check table exists or not * return: PT_NODE pointer * * parser(in): * node(in): */ static PT_NODE * pt_check_table_in_show_heap (PARSER_CONTEXT * parser, PT_NODE * node) { int error = NO_ERROR; PT_NODE *show_args_node = NULL, *spec, *derived_table; PT_NODE *partition_node = NULL; SHOWSTMT_TYPE show_type; int partition_type = DB_NOT_PARTITIONED_CLASS; const char *table_name = NULL; MOP cls; SM_CLASS *sm_class = NULL; int save; if (node->node_type != PT_SELECT) { return node; } spec = node->info.query.q.select.from; assert (spec != NULL); derived_table = spec->info.spec.derived_table; assert (derived_table != NULL); show_type = derived_table->info.showstmt.show_type; assert (show_type == SHOWSTMT_HEAP_HEADER || show_type == SHOWSTMT_ALL_HEAP_HEADER || show_type == SHOWSTMT_HEAP_CAPACITY || show_type == SHOWSTMT_ALL_HEAP_CAPACITY); show_args_node = derived_table->info.showstmt.show_args; assert (show_args_node != NULL); assert (show_args_node->node_type == PT_VALUE); assert (show_args_node->type_enum == PT_TYPE_CHAR); table_name = (const char *) show_args_node->info.value.data_value.str->bytes; cls = sm_find_class (table_name); if (cls == NULL) { PT_ERRORmf (parser, show_args_node, MSGCAT_SET_ERROR, -(ER_LC_UNKNOWN_CLASSNAME), table_name); return node; } AU_DISABLE (save); error = au_fetch_class_force (cls, &sm_class, AU_FETCH_READ); AU_ENABLE (save); if (error == NO_ERROR) { if (sm_get_class_type (sm_class) != SM_CLASS_CT) { PT_ERRORm (parser, show_args_node, MSGCAT_SET_ERROR, -(ER_OBJ_NOT_A_CLASS)); return node; } } error = sm_partitioned_class_type (cls, &partition_type, NULL, NULL); if (error != NO_ERROR) { PT_ERRORc (parser, show_args_node, er_msg ()); return node; } partition_node = pt_make_integer_value (parser, partition_type); if (partition_node == NULL) { PT_INTERNAL_ERROR (parser, "allocate new node"); return node; } parser_append_node (partition_node, show_args_node); return node; }
/* * pt_check_show_index () - semantic check for show index. * return: * parser(in): * node(in): */ static PT_NODE * pt_check_show_index (PARSER_CONTEXT * parser, PT_NODE * node) { PT_NODE *show_args_node = NULL; MOP cls; const char *table_name = NULL; const char *index_name = NULL; SM_CLASS *sm_class = NULL; SM_CLASS_CONSTRAINT *sm_all_constraints = NULL; SM_CLASS_CONSTRAINT *sm_constraint = NULL; PT_NODE *entity = NULL; PT_NODE *derived_table = NULL; SHOWSTMT_TYPE show_type; int error = NO_ERROR; int save; int partition_type = DB_NOT_PARTITIONED_CLASS; PT_NODE *partition_node = NULL; if (node->node_type != PT_SELECT) { return node; } entity = node->info.query.q.select.from; assert (entity != NULL); derived_table = entity->info.spec.derived_table; assert (derived_table != NULL); show_type = derived_table->info.showstmt.show_type; assert (show_type == SHOWSTMT_INDEX_HEADER || show_type == SHOWSTMT_INDEX_CAPACITY || show_type == SHOWSTMT_ALL_INDEXES_HEADER || show_type == SHOWSTMT_ALL_INDEXES_CAPACITY); show_args_node = derived_table->info.showstmt.show_args; assert (show_args_node != NULL); assert (show_args_node->node_type == PT_VALUE); assert (show_args_node->type_enum == PT_TYPE_CHAR); assert (show_args_node->info.value.data_value.str->length < DB_MAX_IDENTIFIER_LENGTH); /* check table name */ table_name = (const char *) show_args_node->info.value.data_value.str->bytes; cls = sm_find_class (table_name); if (cls == NULL) { PT_ERRORmf (parser, show_args_node, MSGCAT_SET_ERROR, -(ER_LC_UNKNOWN_CLASSNAME), table_name); return node; } AU_DISABLE (save); error = au_fetch_class_force (cls, &sm_class, AU_FETCH_READ); AU_ENABLE (save); if (error == NO_ERROR) { if (sm_get_class_type (sm_class) != SM_CLASS_CT) { PT_ERRORm (parser, show_args_node, MSGCAT_SET_ERROR, -(ER_OBJ_NOT_A_CLASS)); return node; } } /* check index name */ if (show_type == SHOWSTMT_INDEX_HEADER || show_type == SHOWSTMT_INDEX_CAPACITY) { show_args_node = show_args_node->next; assert (show_args_node != NULL); assert (show_args_node->node_type == PT_VALUE); assert (show_args_node->type_enum == PT_TYPE_CHAR); assert (show_args_node->info.value.data_value.str->length < DB_MAX_IDENTIFIER_LENGTH); index_name = (const char *) show_args_node->info.value.data_value.str->bytes; sm_all_constraints = sm_class_constraints (cls); sm_constraint = classobj_find_constraint_by_name (sm_all_constraints, index_name); if (sm_all_constraints == NULL || sm_constraint == NULL) { PT_ERRORmf (parser, show_args_node, MSGCAT_SET_ERROR, -(ER_SM_NO_INDEX), index_name); return node; } } /* get partition type and pass it by args */ error = sm_partitioned_class_type (cls, &partition_type, NULL, NULL); if (error != NO_ERROR) { PT_ERRORc (parser, show_args_node, er_msg ()); return node; } partition_node = pt_make_integer_value (parser, partition_type); if (partition_node == NULL) { PT_INTERNAL_ERROR (parser, "allocate new node"); return node; } parser_append_node (partition_node, show_args_node); return node; }