Update of /cvsroot/monetdb/sql/src/server
In directory sc8-pr-cvs16:/tmp/cvs-serv21087
Modified Files:
sql_mvc.mx sql_parser.mx sql_psm.mx sql_schema.mx
Log Message:
The database objects are now search by id and not by name because in some
situations there more than
one object with the same name (example functions).
The DROP function was modified.
DROP FUNCTION f_name;
It will drop the function f_name if there is only one function with such name.
If there are more function and error message is sent to ask you for the complete
signature.
DROP FUNCTION f_name();
It will drop the function f_name which does not have parameters.
DROP FUNCTION f_name(int, varchar(1024));
It will drop the function with this signature.
Note: The number bits for varchar it is only checked by the parser,
semantically only the type is checked not the size.
The parser need to be fixed (maybe by Niels) to avoid this inconvenient.
DROP ALL FUNCTION f_name;
It will drop all the functions with the name f_name.
Note: In all the previous case the drop can be cascade.
Syntax:
DROP FUNCTION f_name [(type_list)] [CASCADE | RESTRICT];
DROP ALL FUNCTION f_name [CASCADE | RESTRICT]
Index: sql_psm.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_psm.mx,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -d -r1.35 -r1.36
--- sql_psm.mx 18 Apr 2007 13:34:04 -0000 1.35
+++ sql_psm.mx 28 Apr 2007 11:19:56 -0000 1.36
@@ -473,15 +473,42 @@
return 0;
}
+list *
+create_type_list(dlist *params, int param)
+{
+ sql_subtype *par_subtype;
+ list * type_list = list_create((fdestroy) NULL);
+ dnode * n = NULL;
+
+ for (n = params->h; n; n = n->next) {
+ dnode *an = n;
+ /*char subtype_name[BUFSIZ];*/
+
+ if (param) {
+ an = n->data.lval->h;
+ par_subtype = &an->next->data.typeval;
+ list_append(type_list, par_subtype);
+ } else {
+ par_subtype = &an->data.typeval;
+ list_prepend(type_list, par_subtype);
+ }
+
+
+
+ }
+ return type_list;
+}
+
static stmt *
create_func(mvc *sql, dlist *qname, dlist *params, symbol *res, dlist
*ext_name, dlist *body)
{
char *fname = qname_table(qname);
char *sname = qname_schema(qname);
sql_schema *s = NULL;
- sql_func * f = NULL;
+ sql_subfunc * sub_f = NULL;
+ sql_func *f;
dnode *n;
- list *l = list_create((fdestroy) &arg_destroy);
+ list *l = list_create((fdestroy) &arg_destroy), *type_list = NULL;
list *id_func_l = NULL, *id_col_l = NULL, *view_id_l = NULL;
sql_subtype *restype;
int instantiate = (sql->mode == m_execute);
@@ -491,83 +518,161 @@
if(s == NULL)
s = cur_schema(sql);
restype = result_type(sql, fname, res);
+
+ if (params)
+ type_list = create_type_list(params, 1);
- if (!instantiate && schema_bind_func(sql, s, fname)) {
- return sql_error(sql, 02, "CREATE FUNCTION: name '%s' already
in use", fname);
-
- } else if (!instantiate && !schema_privs(sql->role_id, s)) {
- return sql_error(sql, 02, "CREATE FUNCTION: insufficient
privileges for user '%s' in schema '%s'", stack_get_string(sql,
"current_user"), s->base.name);
- } else {
- if (params)
- for (n = params->h; n; n = n->next) {
- dnode *an = n->data.lval->h;
+ if (!instantiate && (sub_f = sql_bind_func_(s, fname, type_list))) {
+ if (params) {
+ char args[BUFSIZ], *arg_list = NULL;
+ node *n;
+
+ if (type_list->cnt > 0) {
- list_append(l,
sql_create_arg(_strdup(an->data.sval), &an->next->data.typeval));
- sql_add_param(sql, an->data.sval,
&an->next->data.typeval);
+ for (n = type_list->h; n; n = n->next) {
+ char *tpe = subtype2string((sql_subtype *)
n->data);
+
+ if (arg_list)
+ snprintf(args, BUFSIZ, "%s, %s",
arg_list, tpe);
+ else
+ snprintf(args, BUFSIZ, "%s", tpe);
+ arg_list = GDKstrdup(args);
+ _DELETE(tpe);
+ }
+
+ list_destroy(type_list);
+
+ return sql_error(sql, 02, "CREATE FUNCTION:
name '%s' (%s) already in use", fname, arg_list);
}
- if (body) { /* sql func */
- char *q = QUERY(sql->scanner);
- stmt *b = NULL;
+
+ return sql_error(sql, 02, "DROP FUNCTION: no such
function '%s' ()", fname);
- if (!(b = sequential_block(sql, NULL, restype, body,
NULL ))) {
- return NULL;
- }
+ } else
+ return sql_error(sql, 02, "DROP FUNCTION: no such
function '%s'", fname);
+
+ } else {
+ list_destroy(type_list);
+
+ if (!instantiate && !schema_privs(sql->role_id, s)) {
+ return sql_error(sql, 02, "CREATE FUNCTION:
insufficient privileges for user '%s' in schema '%s'", stack_get_string(sql,
"current_user"), s->base.name);
+ } else {
+ if (params)
+ for (n = params->h; n; n = n->next) {
+ dnode *an = n->data.lval->h;
- /* check if we have a return statement */
- if (restype && !has_return(b))
- return sql_error(sql, 01, "Missing return
statement");
-
- /* in execute mode we instantiate the function */
- if (instantiate) {
- return b;
- } else {
- sql_destroy_params(sql);
-
- f = mvc_create_func(sql, sql->session->schema,
fname, l, restype, TRUE, FALSE, "user", q);
- if (b) {
- id_col_l = stmt_list_dependencies(b,
COLUMN_DEPENDENCY);
- id_func_l = stmt_list_dependencies(b,
FUNC_DEPENDENCY);
- view_id_l = stmt_list_dependencies(b,
VIEW_DEPENDENCY);
-
- mvc_create_dependencies(sql, id_col_l,
f->base.id, FUNC_DEPENDENCY);
- mvc_create_dependencies(sql, id_func_l,
f->base.id, FUNC_DEPENDENCY);
- mvc_create_dependencies(sql, view_id_l,
f->base.id, FUNC_DEPENDENCY);
+ list_append(l,
sql_create_arg(_strdup(an->data.sval), &an->next->data.typeval));
+ sql_add_param(sql, an->data.sval,
&an->next->data.typeval);
+ }
+ if (body) { /* sql func */
+ char *q = QUERY(sql->scanner);
+ stmt *b = NULL;
+
+ if (!(b = sequential_block(sql, NULL, restype,
body, NULL ))) {
+ return NULL;
+ }
+
+ /* check if we have a return statement */
+ if (restype && !has_return(b))
+ return sql_error(sql, 01, "Missing
return statement");
+
+ /* in execute mode we instantiate the function
*/
+ if (instantiate) {
+ return b;
+ } else {
+ sql_destroy_params(sql);
- list_destroy(id_col_l);
- list_destroy(id_func_l);
- list_destroy(view_id_l);
+ f = mvc_create_func(sql,
sql->session->schema, fname, l, restype, TRUE, FALSE, "user", q);
+ if (b) {
+ id_col_l =
stmt_list_dependencies(b, COLUMN_DEPENDENCY);
+ id_func_l =
stmt_list_dependencies(b, FUNC_DEPENDENCY);
+ view_id_l =
stmt_list_dependencies(b, VIEW_DEPENDENCY);
+
+ mvc_create_dependencies(sql,
id_col_l, f->base.id, FUNC_DEPENDENCY);
+ mvc_create_dependencies(sql,
id_func_l, f->base.id, FUNC_DEPENDENCY);
+ mvc_create_dependencies(sql,
view_id_l, f->base.id, FUNC_DEPENDENCY);
+
+ list_destroy(id_col_l);
+ list_destroy(id_func_l);
+ list_destroy(view_id_l);
+ }
+ stmt_destroy(b);
}
- stmt_destroy(b);
+ } else {
+ char *fmod = qname_module(ext_name);
+ char *fnme = qname_fname(ext_name);
+ mvc_create_func(sql, sql->session->schema,
fname, l, restype, FALSE, FALSE, fmod, fnme );
}
- } else {
- char *fmod = qname_module(ext_name);
- char *fnme = qname_fname(ext_name);
- mvc_create_func(sql, sql->session->schema, fname, l,
restype, FALSE, FALSE, fmod, fnme );
}
}
return stmt_none();
}
stmt*
-drop_func(mvc *sql, dlist *qname, int drop_action)
+drop_func(mvc *sql, dlist *qname, dlist *typelist, int drop_action)
{
char *name = qname_table(qname);
char *sname = qname_schema(qname);
sql_schema *s = NULL;
- sql_func * func;
+ list * list_func = NULL, *type_list = NULL;
+ sql_subfunc *sub_func = NULL;
+ sql_func *func = NULL;
if (sname && !(s = mvc_bind_schema(sql, sname)))
return sql_error(sql, 02, "DROP FUNCTION: no such schema '%s'",
sname);
if (s == NULL)
s = cur_schema(sql);
- func = schema_bind_func(sql,s,name);
- if (!func && !sname) {
- s = tmp_schema(sql);
- func = schema_bind_func(sql, s, name);
+
+ if (typelist) {
+ type_list = create_type_list(typelist, 0);
+ sub_func = sql_bind_func_(s,name, type_list);
+ if (!sub_func && !sname) {
+ s = tmp_schema(sql);
+ sub_func = sql_bind_func_(s, name, type_list);
+ }
+ if (sub_func)
+ func = sub_func->func;
}
- if (!func)
- return sql_error(sql, 02, "DROP FUNCTION: no such function
'%s'", name);
+ else {
+ list_func = schema_bind_func(sql,s,name);
+ if (list_func && list_func->cnt > 1)
+ return sql_error(sql, 02, "DROP FUNCTION: there are
more than one function called '%s', please use the full signature", name);
+ if (list_func && list_func->cnt == 1)
+ func = (sql_func*) list_func->h->data;
+ }
+
+ if (!func) {
+ if (typelist) {
+ char args[BUFSIZ], *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)
+ snprintf(args, BUFSIZ, "%s, %s",
arg_list, tpe);
+ else
+ snprintf(args, BUFSIZ, "%s", tpe);
+ arg_list = GDKstrdup(args);
+ _DELETE(tpe);
+ }
+
+ list_destroy(type_list);
+
+ return sql_error(sql, 02, "DROP FUNCTION: no
such function '%s' (%s)", name, arg_list);
+ }
+
+ return sql_error(sql, 02, "DROP FUNCTION: no such
function '%s' ()", name);
+
+ } else
+ return sql_error(sql, 02, "DROP FUNCTION: no such
function '%s'", name);
+ }
+
+ list_destroy(type_list);
+
+
if (!schema_privs(sql->role_id, s)) {
return sql_error(sql, 02, "DROP FUNCTION: access denied for %s
to schema ;'%s'", stack_get_string(sql, "current_user"), s->base.name);
}
@@ -576,7 +681,48 @@
if (!drop_action && mvc_check_dependency(sql, func->base.id,
FUNC_DEPENDENCY))
return sql_error(sql, 02, "DROP FUNCTION: there are functions
dependent on function %s;", func->base.name);
- mvc_drop_func(sql, s, name, drop_action);
+ mvc_drop_func(sql, s, func, drop_action);
+
+ return stmt_none();
+}
+
+stmt*
+drop_all_func(mvc *sql, dlist *qname, int drop_action)
+{
+ char *name = qname_table(qname);
+ char *sname = qname_schema(qname);
+ sql_schema *s = NULL;
+ list * list_func = NULL;
+ sql_func *func = NULL;
+ node *n = NULL;
+
+ if (sname && !(s = mvc_bind_schema(sql, sname)))
+ return sql_error(sql, 02, "DROP FUNCTION: no such schema '%s'",
sname);
+
+ if (s == NULL)
+ s = cur_schema(sql);
+
+ list_func = schema_bind_func(sql,s,name);
+
+ if (!list_func) {
+ return sql_error(sql, 02, "DROP ALL FUNCTION: no such
functions '%s'", name);
+ }
+
+ if (!schema_privs(sql->role_id, s)) {
+ return sql_error(sql, 02, "DROP FUNCTION: access denied for %s
to schema ;'%s'", stack_get_string(sql, "current_user"), s->base.name);
+ }
+
+
+ for( n = list_func->h ; n; n = n->next) {
+ func = (sql_func *) n->data;
+
+ if (!drop_action && mvc_check_dependency(sql, func->base.id,
FUNC_DEPENDENCY))
+ return sql_error(sql, 02, "DROP FUNCTION: there are
functions dependent on function %s;", func->base.name);
+ }
+
+ mvc_drop_all_func(sql, s, list_func, drop_action);
+
+ list_destroy(list_func);
return stmt_none();
}
@@ -598,8 +744,11 @@
case SQL_DROP_FUNC:
{
dlist *l = s->data.lval;
-
- ret = drop_func(sql, l->h->data.lval, l->h->next->data.ival);
+
+ if (l->h->next->data.ival)
+ ret = drop_all_func(sql, l->h->data.lval,
l->h->next->next->next->data.ival);
+ else
+ ret = drop_func(sql, l->h->data.lval,
l->h->next->next->data.lval, l->h->next->next->next->data.ival);
sql->type = Q_SCHEMA;
} break;
case SQL_SET:
Index: sql_mvc.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_mvc.mx,v
retrieving revision 1.180
retrieving revision 1.181
diff -u -d -r1.180 -r1.181
--- sql_mvc.mx 17 Apr 2007 13:44:13 -0000 1.180
+++ sql_mvc.mx 28 Apr 2007 11:19:55 -0000 1.181
@@ -137,7 +137,8 @@
extern sql_type *mvc_bind_type(mvc *sql, char *name);
extern sql_type *schema_bind_type(mvc *sql, sql_schema * s, char *name);
extern sql_func *mvc_bind_func(mvc *sql, char *name);
-extern sql_func *schema_bind_func(mvc *sql, sql_schema * s, char *name);
+extern list *schema_bind_func(mvc *sql, sql_schema * s, char *name);
+extern sql_func *schema_bind_func_types(mvc *sql, sql_schema * s, char *name,
list *typelist);
extern sql_schema *mvc_bind_schema(mvc *c, char *sname);
extern sql_table *mvc_bind_table(mvc *c, sql_schema *s, char *tname);
@@ -150,17 +151,18 @@
extern sql_type *mvc_create_type(mvc *sql, sql_schema *s, char *sqlname, int
digits, int scale, int radix, char *impl);
extern sql_func *mvc_create_func(mvc *sql, sql_schema *s, char *name, list
*args, sql_subtype *res, bit issql, bit aggr, char *mod, char *impl);
-extern void mvc_drop_func(mvc *c, sql_schema *s, char *name, int cascade);
+extern void mvc_drop_func(mvc *c, sql_schema *s, sql_func * func, int
drop_action);
+extern void mvc_drop_all_func(mvc *c, sql_schema *s, list *list_func, int
drop_action);
-extern void mvc_drop_schema(mvc *c, char *name, int drop_action);
+extern void mvc_drop_schema(mvc *c, sql_schema *s, int drop_action);
extern sql_schema *mvc_create_schema(mvc *m, char *name, int auth_id, int
owner);
extern size_t mvc_clear_table(mvc *m, sql_table *t);
-extern void mvc_drop_table(mvc *c, sql_schema *s, char *name, int cascade);
+extern void mvc_drop_table(mvc *c, sql_schema *s, sql_table * t, int
drop_action);
extern sql_table *mvc_create_table(mvc *c, sql_schema *s, char *name, bit
system, int persistence, int commit_action, int sz);
extern sql_table *mvc_create_view(mvc *c, sql_schema *s, char *name, char
*sql, bit system);
extern sql_table *mvc_create_generated(mvc *c, sql_schema *s, char *name, char
*sql, bit system);
-extern void mvc_drop_column(mvc *c, sql_table *t, char *name, int cascade);
+extern void mvc_drop_column(mvc *c, sql_table *t, sql_column *col, int
drop_action);
extern sql_column *mvc_create_column(mvc *c, sql_table *t, char *name,
sql_subtype *type);
extern sql_column *mvc_create_column_(mvc *c, sql_table *t, char *name, char
*type, int digits);
extern sql_column *mvc_null(mvc *c, sql_column *col, int flag);
@@ -171,15 +173,15 @@
extern sql_key *mvc_create_kc(mvc *m, sql_key *k, sql_column *c);
extern sql_fkey *mvc_create_fkc(mvc *m, sql_fkey *fk, sql_column *c);
-extern void mvc_drop_key(mvc *c, sql_schema *s, char *kname, int cascade);
+extern void mvc_drop_key(mvc *c, sql_schema *s, sql_key *key, int drop_action);
extern sql_idx *mvc_create_idx(mvc *m, sql_table *t, char *iname, idx_type it);
extern sql_idx *mvc_create_ic(mvc *m, sql_idx * i, sql_column *c);
-extern void mvc_drop_idx(mvc *c, sql_schema *s, char *iname);
+extern void mvc_drop_idx(mvc *c, sql_schema *s, sql_idx * i);
extern sql_trigger * mvc_create_trigger(mvc *m, sql_table *t, char *name, sht
time, sht orientation, sht event, char *old_name, char *new_name, char
*condition, char *statement );
extern sql_trigger * mvc_create_tc(mvc *m, sql_trigger * i, sql_column *c /*,
extra options such as trunc */ );
-extern void mvc_drop_trigger(mvc *m, sql_schema *s, char *name);
+extern void mvc_drop_trigger(mvc *m, sql_schema *s, sql_trigger * tri);
/*dependency control*/
extern void mvc_create_dependency(mvc *m, int id, int depend_id, int
depend_type);
@@ -718,17 +720,56 @@
return t;
}
-sql_func *
+list *
schema_bind_func(mvc *sql, sql_schema * s, char *name)
{
- sql_func *t = find_sql_func(s, name);
+ list *func_list = find_all_sql_func(s, name);
(void) sql;
- if (!t)
+ if (!func_list)
return NULL;
if (mvc_debug)
fprintf(stderr, "schema_bind_func %s\n", name);
- return t;
+ return func_list;
+}
+
+sql_func *
+schema_bind_func_types(mvc *sql, sql_schema * s, char *name, list * typelist)
+{
+ list *func_list = find_all_sql_func(s, name);
+ sql_func * f = NULL;
+ sql_subtype arg_subtype;
+ node *npar = NULL, *narg = NULL;
+
+ (void) sql;
+ if (!func_list)
+ return NULL;
+ else {
+ f = (sql_func *) func_list->h->data;
+
+ if (f->ops->h)
+ narg = f->ops->h;
+
+ for (npar = typelist->h; npar; npar = npar->next) {
+ if (!narg)
+ return NULL;
+
+ arg_subtype = *(sql_subtype*) narg->data;
+
+ if (strcmp((char *) npar->data,
arg_subtype.type->base.name) != 0)
+ return NULL;
+
+ narg = narg->next;
+ }
+
+ if (npar || narg)
+ return NULL;
+ }
+
+ if (mvc_debug)
+ fprintf(stderr, "schema_bind_func_types %s\n", name);
+
+ return f;
}
sql_schema *
@@ -929,12 +970,22 @@
}
void
-mvc_drop_func(mvc *m, sql_schema *s, char *name, int cascade)
+mvc_drop_func(mvc *m, sql_schema *s, sql_func *f, int drop_action)
{
if (mvc_debug)
- fprintf(stderr, "mvc_drop_func %s %s\n", s->base.name, name);
+ fprintf(stderr, "mvc_drop_func %s %s\n", s->base.name,
f->base.name);
- sql_trans_drop_func(m->session->tr, s, name, -1, cascade);
+ sql_trans_drop_func(m->session->tr, s, f->base.id, drop_action ?
DROP_CASCADE_START : DROP_RESTRICT);
+ m->type = Q_SCHEMA;
+}
+
+void
+mvc_drop_all_func(mvc *m, sql_schema *s, list *list_func, int drop_action)
+{
+ if (mvc_debug)
+ fprintf(stderr, "mvc_drop_all_func %s %s\n", s->base.name,
((sql_func *) list_func->h->data)->base.name);
+
+ sql_trans_drop_all_func(m->session->tr, s, list_func, drop_action ?
DROP_CASCADE_START : DROP_RESTRICT);
m->type = Q_SCHEMA;
}
@@ -952,11 +1003,11 @@
}
void
-mvc_drop_schema(mvc *m, char *sname, int cascade)
+mvc_drop_schema(mvc *m, sql_schema * s, int drop_action)
{
if (mvc_debug)
- fprintf(stderr, "mvc_drop_schema %s\n", sname);
- sql_trans_drop_schema(m->session->tr, sname, -1, cascade);
+ fprintf(stderr, "mvc_drop_schema %s\n", s->base.name);
+ sql_trans_drop_schema(m->session->tr, s->base.id, drop_action ?
DROP_CASCADE_START : DROP_RESTRICT);
m->type = Q_SCHEMA;
}
@@ -1001,11 +1052,11 @@
}
void
-mvc_drop_key(mvc *m, sql_schema *s, char *name, int cascade)
+mvc_drop_key(mvc *m, sql_schema *s, sql_key *k, int drop_action)
{
if (mvc_debug)
- fprintf(stderr, "mvc_drop_key %s %s\n", s->base.name, name);
- sql_trans_drop_key(m->session->tr, s, name, -1, cascade);
+ fprintf(stderr, "mvc_drop_key %s %s\n", s->base.name,
k->base.name);
+ sql_trans_drop_key(m->session->tr, s, k->base.id, drop_action ?
DROP_CASCADE_START : DROP_RESTRICT);
}
sql_idx *
@@ -1030,13 +1081,13 @@
}
void
-mvc_drop_idx(mvc *m, sql_schema *s, char *name)
+mvc_drop_idx(mvc *m, sql_schema *s, sql_idx *i)
{
if (mvc_debug)
- fprintf(stderr, "mvc_drop_idx %s %s\n", s->base.name, name);
+ fprintf(stderr, "mvc_drop_idx %s %s\n", s->base.name,
i->base.name);
m->type = Q_SCHEMA;
- sql_trans_drop_idx(m->session->tr, s, name, -1, 0);
+ sql_trans_drop_idx(m->session->tr, s, i->base.id, DROP_RESTRICT);
}
sql_trigger *
@@ -1062,13 +1113,13 @@
}
void
-mvc_drop_trigger(mvc *m, sql_schema *s, char *name)
+mvc_drop_trigger(mvc *m, sql_schema *s, sql_trigger *tri)
{
if (mvc_debug)
- fprintf(stderr, "mvc_drop_trigger %s %s\n", s->base.name, name);
+ fprintf(stderr, "mvc_drop_trigger %s %s\n", s->base.name,
tri->base.name);
m->type = Q_SCHEMA;
- sql_trans_drop_trigger(m->session->tr, s, name, -1, 0);
+ sql_trans_drop_trigger(m->session->tr, s, tri->base.id, DROP_RESTRICT);
}
@@ -1117,12 +1168,12 @@
}
void
-mvc_drop_table(mvc *m, sql_schema *s, char *name, int cascade)
+mvc_drop_table(mvc *m, sql_schema *s, sql_table *t, int drop_action)
{
if (mvc_debug)
- fprintf(stderr, "mvc_drop_table %s %s\n", s->base.name, name);
+ fprintf(stderr, "mvc_drop_table %s %s\n", s->base.name,
t->base.name);
- sql_trans_drop_table(m->session->tr, s, name, -1, cascade);
+ sql_trans_drop_table(m->session->tr, s, t->base.id, drop_action ?
DROP_CASCADE_START : DROP_RESTRICT);
m->type = Q_SCHEMA;
}
@@ -1159,11 +1210,11 @@
}
void
-mvc_drop_column(mvc *m, sql_table *t, char *name, int cascade)
+mvc_drop_column(mvc *m, sql_table *t, sql_column *col, int drop_action)
{
if (mvc_debug)
- fprintf(stderr, "mvc_drop_column %s %s\n", t->base.name, name);
- sql_trans_drop_column(m->session->tr, t, name, -1, cascade);
+ fprintf(stderr, "mvc_drop_column %s %s\n", t->base.name,
col->base.name);
+ sql_trans_drop_column(m->session->tr, t, col->base.id, drop_action ?
DROP_CASCADE_START : DROP_RESTRICT);
m->type = Q_SCHEMA;
}
Index: sql_parser.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_parser.mx,v
retrieving revision 1.241
retrieving revision 1.242
diff -u -d -r1.241 -r1.242
--- sql_parser.mx 17 Apr 2007 12:27:07 -0000 1.241
+++ sql_parser.mx 28 Apr 2007 11:19:55 -0000 1.242
@@ -448,6 +448,8 @@
string_commalist
paramlist
opt_paramlist
+ opt_typelist
+ typelist
opt_seq_params
opt_alt_seq_params
serial_opt_params
@@ -2121,10 +2123,19 @@
append_list(l, $3 );
append_int(l, $4 );
$$ = _symbol_create_list( SQL_DROP_TABLE, l ); }
- | DROP FUNCTION qname drop_action
+ | DROP FUNCTION qname opt_typelist drop_action
{ dlist *l = L();
append_list(l, $3 );
- append_int(l, $4 );
+ append_int(l, 0 );
+ append_list(l, $4 );
+ append_int(l, $5 );
+ $$ = _symbol_create_list( SQL_DROP_FUNC, l ); }
+ | DROP ALL FUNCTION qname drop_action
+ { dlist *l = L();
+ append_list(l, $4 );
+ append_int(l, 1 );
+ append_list(l, NULL );
+ append_int(l, $5 );
$$ = _symbol_create_list( SQL_DROP_FUNC, l ); }
| DROP VIEW qname drop_action
{ dlist *l = L();
@@ -2137,6 +2148,20 @@
| DROP TRIGGER qname { $$ = _symbol_create_list( SQL_DROP_TRIGGER, $3 ); }
;
+opt_typelist:
+ /*empty*/ {$$ = NULL;}
+ | '(' typelist ')' {$$ = $2;}
+ | '(' ')' {$$ = L(); }
+ ;
+
+typelist:
+ data_type { dlist *l = L();
+ append_type(l, &$1 );
+ $$= l; }
+ | data_type ',' typelist { append_type($3, &$1);
+ $$ = $3; }
+ ;
+
drop_action:
/* empty */ { $$ = 0; }
| RESTRICT { $$ = 0; }
Index: sql_schema.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_schema.mx,v
retrieving revision 1.124
retrieving revision 1.125
diff -u -d -r1.124 -r1.125
--- sql_schema.mx 26 Apr 2007 14:35:08 -0000 1.124
+++ sql_schema.mx 28 Apr 2007 11:19:56 -0000 1.125
@@ -602,12 +602,13 @@
{
char *tname = qname_table(qname);
sql_schema *ss = cur_schema(sql);
+ sql_trigger *tri = NULL;
if (!schema_privs(sql->role_id, ss))
return sql_error(sql, 02, "DROP TRIGGER: access denied for %s
to schema ;'%s'", stack_get_string(sql, "current_user"), ss->base.name);
- if (mvc_bind_trigger(sql, ss, tname ) == NULL)
+ if ((tri = mvc_bind_trigger(sql, ss, tname )) == NULL)
return sql_error(sql, 02, "DROP TRIGGER: unknown trigger %s\n",
tname);
- mvc_drop_trigger(sql, ss, tname);
+ mvc_drop_trigger(sql, ss, tri);
return stmt_none();
}
@@ -807,7 +808,7 @@
} else if (! drop_action && mvc_check_dependency(sql, t->base.id,
VIEW_DEPENDENCY)) {
return sql_error(sql, 02, "unable to drop view %s
(there are database objects which depend on it)\n", t->base.name);
} else {
- mvc_drop_table(sql, ss, t->base.name, drop_action);
+ mvc_drop_table(sql, ss, t, drop_action);
return stmt_none();
}
}
@@ -866,7 +867,7 @@
if (!i) {
return sql_error(sql, 02, "DROP INDEX: no such index '%s'",
iname);
} else {
- mvc_drop_idx(sql, ss, i->base.name);
+ mvc_drop_idx(sql, ss, i);
res = stmt_none();
}
return res;
@@ -1498,7 +1499,7 @@
}
}
}
- mvc_drop_column(sql, t, cname, drop_action);
+ mvc_drop_column(sql, t, col, drop_action);
res = stmt_none();
} break;
case SQL_DROP_CONSTRAINT:
@@ -1506,10 +1507,11 @@
dlist *l = s->data.lval;
char *kname = l->h->data.sval;
int drop_action = l->h->next->data.ival;
+ sql_key * key = NULL;
- if (mvc_bind_key(sql, ss, kname ) == NULL)
+ if ((key = mvc_bind_key(sql, ss, kname )) == NULL)
return sql_error(sql, 02, "cannot drop unknown
constraint %s\n", kname);
- mvc_drop_key(sql, ss, kname, drop_action);
+ mvc_drop_key(sql, ss, key, drop_action);
res = stmt_none();
} break;
}
@@ -1668,7 +1670,7 @@
if (!drop_action && mvc_check_dependency(sql, t->base.id,
TABLE_DEPENDENCY))
return sql_error(sql, 02, "DROP TABLE: unable to drop
table %s (there are database objects which depend on it)\n", t->base.name);
- mvc_drop_table(sql, s, t->base.name, drop_action);
+ mvc_drop_table(sql, s, t, drop_action);
return stmt_none();
}
@@ -1765,7 +1767,7 @@
} else if (sql_schema_has_user(sql, s)) {
return sql_error(sql, 02, "DROP SCHEMA: unable to drop schema
'%s' (there are database objects which depend on it", name);
} else {
- mvc_drop_schema(sql, name, dropaction);
+ mvc_drop_schema(sql, s, dropaction);
return stmt_none();
}
}
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins