static sql_rel* rel_drop_func(mvc *sql, dlist *qname, dlist *typelist, int drop_action, int type, int if_exists) { const char *name = qname_table(qname); const char *sname = qname_schema(qname); sql_schema *s = NULL; sql_func *func = NULL; char is_aggr = (type == F_AGGR); char is_func = (type != F_PROC); char *F = is_aggr?"AGGREGATE":(is_func?"FUNCTION":"PROCEDURE"); char *KF = type==F_FILT?"FILTER ": type==F_UNION?"UNION ": ""; if (sname && !(s = mvc_bind_schema(sql, sname))) return sql_error(sql, 02, SQLSTATE(3F000) "DROP %s%s: no such schema '%s'", KF, F, sname); if (s == NULL) s = cur_schema(sql); func = resolve_func(sql, s, name, typelist, type, "DROP", if_exists); if (!func && !sname) { s = tmp_schema(sql); func = resolve_func(sql, s, name, typelist, type, "DROP", if_exists); } if (func) return rel_drop_function(sql->sa, s->base.name, name, func->base.id, type, drop_action); else if(if_exists && !sql->session->status) return rel_drop_function(sql->sa, s->base.name, name, -2, type, drop_action); return NULL; }
static sql_rel* rel_drop_func(mvc *sql, dlist *qname, dlist *typelist, int drop_action, int type) { char *name = qname_table(qname); char *sname = qname_schema(qname); sql_schema *s = NULL; list * list_func = NULL, *type_list = NULL; sql_subfunc *sub_func = NULL; sql_func *func = NULL; char is_aggr = (type == F_AGGR); char is_func = (type != F_PROC); char *F = is_aggr?"AGGREGATE":(is_func?"FUNCTION":"PROCEDURE"); char *f = is_aggr?"aggregate":(is_func?"function":"procedure"); char *KF = type==F_FILT?"FILTER ": type==F_UNION?"UNION ": ""; char *kf = type==F_FILT?"filter ": type==F_UNION?"union ": ""; if (sname && !(s = mvc_bind_schema(sql, sname))) return sql_error(sql, 02, "3F000!DROP %s%s: no such schema '%s'", KF, F, sname); if (s == NULL) s = cur_schema(sql); if (typelist) { type_list = create_type_list(sql, typelist, 0); sub_func = sql_bind_func_(sql->sa, s, name, type_list, type); if (!sub_func && type == F_FUNC) { sub_func = sql_bind_func_(sql->sa, s, name, type_list, F_UNION); type = sub_func?F_UNION:F_FUNC; } if (!sub_func && !sname) { s = tmp_schema(sql); sub_func = sql_bind_func_(sql->sa, s, name, type_list, type); if (!sub_func && type == F_FUNC) { sub_func = sql_bind_func_(sql->sa, s, name, type_list, F_UNION); type = sub_func?F_UNION:F_FUNC; } } if ( sub_func && sub_func->func->type == type) func = sub_func->func; } else { list_func = schema_bind_func(sql,s,name, type); if (!list_func && type == F_FUNC) list_func = schema_bind_func(sql,s,name, F_UNION); if (list_func && list_func->cnt > 1) { list_destroy(list_func); return sql_error(sql, 02, "DROP %s%s: there are more than one %s%s called '%s', please use the full signature", KF, F, kf, f,name); } if (list_func && list_func->cnt == 1) func = (sql_func*) list_func->h->data; } if (!func) { if (typelist) { char *arg_list = NULL; node *n; if (type_list->cnt > 0) { for (n = type_list->h; n; n = n->next) { char *tpe = subtype2string((sql_subtype *) n->data); if (arg_list) { arg_list = sql_message("%s, %s", arg_list, tpe); _DELETE(tpe); } else { arg_list = tpe; } } list_destroy(list_func); list_destroy(type_list); return sql_error(sql, 02, "DROP %s%s: no such %s%s '%s' (%s)", KF, F, kf, f, name, arg_list); } list_destroy(list_func); list_destroy(type_list); return sql_error(sql, 02, "DROP %s%s: no such %s%s '%s' ()", KF, F, kf, f, name); } else { return sql_error(sql, 02, "DROP %s%s: no such %s%s '%s'", KF, F, kf, f, name); } } else if (((is_func && type != F_FILT) && !func->res) || (!is_func && func->res)) { list_destroy(list_func); list_destroy(type_list); return sql_error(sql, 02, "DROP %s%s: cannot drop %s '%s'", KF, F, is_func?"procedure":"function", name); } list_destroy(list_func); list_destroy(type_list); return rel_drop_function(sql->sa, s->base.name, name, func->base.id, type, drop_action); }