Changeset: 6876307ffdee for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6876307ffdee
Modified Files:
        sql/src/include/sql_relation.h
        sql/src/server/rel_optimizer.mx
        sql/src/server/rel_schema.mx
        sql/src/storage/store.mx
Branch: default
Log Message:

fix crash in alter table


diffs (truncated from 315 to 300 lines):

diff -r 3a20dfeb7d23 -r 6876307ffdee sql/src/include/sql_relation.h
--- a/sql/src/include/sql_relation.h    Wed May 19 16:08:14 2010 +0200
+++ b/sql/src/include/sql_relation.h    Wed May 19 21:42:24 2010 +0200
@@ -87,7 +87,8 @@
 #define DDL_DROP_TABLE          25
 #define DDL_CREATE_VIEW  26
 #define DDL_DROP_VIEW    27
-#define DDL_ALTER_TABLE  28
+#define DDL_DROP_CONSTRAINT    28
+#define DDL_ALTER_TABLE  29
 
 #define DDL_CREATE_INDEX  30
 #define DDL_DROP_INDEX    31
diff -r 3a20dfeb7d23 -r 6876307ffdee sql/src/server/rel_optimizer.mx
--- a/sql/src/server/rel_optimizer.mx   Wed May 19 16:08:14 2010 +0200
+++ b/sql/src/server/rel_optimizer.mx   Wed May 19 21:42:24 2010 +0200
@@ -304,6 +304,10 @@
        case e_atom:
                *cnt += 10;
                return 10;
+       case e_func:
+               /* functions are more expensive, depending on the number of 
columns involved. */ 
+               *cnt -= 5*list_length(e->l);
+               return 5*list_length(e->l);
        default:
                *cnt -= 5;
                return -5;
diff -r 3a20dfeb7d23 -r 6876307ffdee sql/src/server/rel_schema.mx
--- a/sql/src/server/rel_schema.mx      Wed May 19 16:08:14 2010 +0200
+++ b/sql/src/server/rel_schema.mx      Wed May 19 21:42:24 2010 +0200
@@ -738,23 +738,7 @@
                mvc_drop_column(sql, t, col, drop_action);
        }       break;
        case SQL_DROP_CONSTRAINT:
-       {
-               dlist *l = s->data.lval;
-               char *kname = l->h->data.sval;
-               int drop_action = l->h->next->data.i_val;
-               sql_key * key = NULL;
-
-               assert(l->h->next->type == type_int);
-               if ((key = mvc_bind_key(sql, ss, kname )) == NULL) {
-                       sql_error(sql, 02, "ALTER TABLE: no such constraint 
'%s'\n", kname);
-                       return SQL_ERR;
-               }
-               if (!drop_action && mvc_check_dependency(sql, key->base.id, 
KEY_DEPENDENCY, NULL)) {
-                       sql_error(sql, 02, "ALTER TABLE: cannot drop constraint 
'%s': there are database objects which depend on it\n", key->base.name);
-                       return SQL_ERR;
-               }
-               mvc_drop_key(sql, ss, key, drop_action);
-       }       break;
+               assert(0);
        }
        if (res == SQL_ERR) {
                sql_error(sql, 02, "unknown table element (" PTRFMT ")->token = 
%s\n", PTRFMTCAST s, token2string(s->token));
@@ -927,7 +911,7 @@
 }
 
 static char *
-get_schema_name(dlist *name_auth)
+dlist_get_schema_name(dlist *name_auth)
 {
        assert(name_auth && name_auth->h);
        return name_auth->h->data.sval;
@@ -963,7 +947,7 @@
 static sql_rel *
 rel_create_schema(mvc *sql, dlist *auth_name, dlist *schema_elements)
 {
-       char *name = get_schema_name(auth_name);
+       char *name = dlist_get_schema_name(auth_name);
        char *auth = schema_auth(auth_name);
        int auth_id = sql->role_id;
 
@@ -984,7 +968,7 @@
                sql_rel *ret;
 
                ret = rel_schema(DDL_CREATE_SCHEMA, 
-                          get_schema_name(auth_name),
+                          dlist_get_schema_name(auth_name),
                           schema_auth(auth_name), 0);
 
                ss->base.name = name;
@@ -1022,6 +1006,19 @@
        }
 }
 
+static str
+get_schema_name( mvc *sql, char *sname, char *tname)
+{
+       if (!sname) {
+               sql_schema *ss = cur_schema(sql);
+               sql_table *t = mvc_bind_table(sql, ss, tname);
+               if (!t)
+                       ss = tmp_schema(sql);
+               sname = ss->base.name;
+       }
+       return sname;
+}
+
 static sql_rel *
 rel_alter_table(mvc *sql, dlist *qname, symbol *te)
 {
@@ -1043,6 +1040,16 @@
                node *n;
                sql_rel *res = NULL;
                sql_table *nt = dup_sql_table(sql->sa, t);
+
+               if (nt && te->token == SQL_DROP_CONSTRAINT) {
+                       dlist *l = te->data.lval;
+                       char *kname = l->h->data.sval;
+                       int drop_action = l->h->next->data.i_val;
+                       
+                       sname = get_schema_name(sql, sname, tname);
+                       return rel_schema( DDL_DROP_CONSTRAINT, sname, kname, 
drop_action);
+               }
+
                if (!nt || (te && table_element(sql, te, s, nt, 1) == SQL_ERR)) 
                        return NULL;
 
@@ -1115,7 +1122,7 @@
 
                assert(l->h->next->type == type_int);
                ret = rel_schema(DDL_DROP_SCHEMA, 
-                          get_schema_name(auth_name),
+                          dlist_get_schema_name(auth_name),
                           NULL,
                           l->h->next->data.i_val);     /* drop_action */
        }       break;
@@ -1146,13 +1153,7 @@
                char *tname = qname_table(l->h->data.lval);
 
                assert(l->h->next->type == type_int);
-               if (!sname) {
-                       sql_schema *ss = cur_schema(sql);
-                       sql_table *t = mvc_bind_table(sql, ss, tname);
-                       if (!t)
-                               ss = tmp_schema(sql);
-                       sname = ss->base.name;
-               }
+               sname = get_schema_name(sql, sname, tname);
                ret = rel_schema(DDL_DROP_TABLE, sname, tname, 
l->h->next->data.i_val);
        }       break;
        case SQL_DROP_VIEW:
@@ -1162,13 +1163,7 @@
                char *tname = qname_table(l->h->data.lval);
 
                assert(l->h->next->type == type_int);
-               if (!sname) {
-                       sql_schema *ss = cur_schema(sql);
-                       sql_table *t = mvc_bind_table(sql, ss, tname);
-                       if (!t)
-                               ss = tmp_schema(sql);
-                       sname = ss->base.name;
-               }
+               sname = get_schema_name(sql, sname, tname);
                ret = rel_schema(DDL_DROP_VIEW, sname, tname, 
l->h->next->data.i_val);
        }       break;
        case SQL_ALTER_TABLE:
diff -r 3a20dfeb7d23 -r 6876307ffdee sql/src/storage/store.mx
--- a/sql/src/storage/store.mx  Wed May 19 16:08:14 2010 +0200
+++ b/sql/src/storage/store.mx  Wed May 19 21:42:24 2010 +0200
@@ -367,10 +367,10 @@
 
        v = table_funcs.column_find_value(tr, find_sql_column(keycolumns, 
"column"), rid);
        kc->c = find_sql_column(i->t, v);       _DELETE(v);
+       assert(kc->c);
        v = table_funcs.column_find_value(tr, find_sql_column(keycolumns, 
"trunc"), rid);
        kc->trunc = *(int *)v;                  _DELETE(v);
        list_append(i->columns, kc);
-       assert(kc->c);
        if (hash_index(i->type)) 
                kc->c->unique = 1;
 }
@@ -3061,6 +3061,51 @@
 }
 
 static void
+sys_drop_ic(sql_trans *tr, sql_idx * i, sql_kc *kc)
+{
+       sql_schema *syss = find_sql_schema(tr, isGlobalTable(i->t)?"sys":"tmp");
+       sql_table *syskc = find_sql_table(syss, "keycolumns");
+       sql_column *kc_id = find_sql_column(syskc, "id");
+       oid rid = table_funcs.column_find_row(tr, kc_id, &i->base.id, NULL);
+
+       (void) kc;              /* Stefan: unused!? */
+       assert(rid != oid_nil);
+       table_funcs.table_delete(tr, syskc, rid);
+
+       if (isGlobalTable(i->t)) 
+               tr->schema_updates ++;
+}
+
+static void
+sys_drop_idx(sql_trans *tr, sql_idx * i, int drop_action)
+{
+       node *n;
+       sql_schema *syss = find_sql_schema(tr, isGlobalTable(i->t)?"sys":"tmp");
+       sql_table *sysidx = find_sql_table(syss, "idxs");
+       oid rid = table_funcs.column_find_row(tr, find_sql_column(sysidx, 
"id"), &i->base.id, NULL);
+
+       assert(rid != oid_nil);
+       table_funcs.table_delete(tr, sysidx, rid);
+
+       for (n = i->columns->h; n; n = n->next) {
+               sql_kc *ic = n->data;
+
+               sys_drop_ic(tr, i, ic);
+       }
+
+       /* remove idx from schema and table*/
+       list_remove_data(i->t->s->idxs, i);
+       if (i->t->cluster == i)
+               i->t->cluster = NULL;
+       sql_trans_drop_dependencies(tr, i->base.id);
+       if (isGlobalTable(i->t)) 
+               tr->schema_updates ++;
+
+       if (drop_action)
+               sql_trans_drop_all_dependencies(tr, i->t->s, i->base.id, 
INDEX_DEPENDENCY);
+}
+
+static void
 sys_drop_key(sql_trans *tr, sql_key *k, int drop_action)
 {
        node *n;
@@ -3101,51 +3146,6 @@
 }
 
 static void
-sys_drop_ic(sql_trans *tr, sql_idx * i, sql_kc *kc)
-{
-       sql_schema *syss = find_sql_schema(tr, isGlobalTable(i->t)?"sys":"tmp");
-       sql_table *syskc = find_sql_table(syss, "keycolumns");
-       sql_column *kc_id = find_sql_column(syskc, "id");
-       oid rid = table_funcs.column_find_row(tr, kc_id, &i->base.id, NULL);
-
-       (void) kc;              /* Stefan: unused!? */
-       assert(rid != oid_nil);
-       table_funcs.table_delete(tr, syskc, rid);
-
-       if (isGlobalTable(i->t)) 
-               tr->schema_updates ++;
-}
-
-static void
-sys_drop_idx(sql_trans *tr, sql_idx * i, int drop_action)
-{
-       node *n;
-       sql_schema *syss = find_sql_schema(tr, isGlobalTable(i->t)?"sys":"tmp");
-       sql_table *sysidx = find_sql_table(syss, "idxs");
-       oid rid = table_funcs.column_find_row(tr, find_sql_column(sysidx, 
"id"), &i->base.id, NULL);
-
-       assert(rid != oid_nil);
-       table_funcs.table_delete(tr, sysidx, rid);
-
-       for (n = i->columns->h; n; n = n->next) {
-               sql_kc *ic = n->data;
-
-               sys_drop_ic(tr, i, ic);
-       }
-
-       /* remove idx from schema and table*/
-       list_remove_data(i->t->s->idxs, i);
-       if (i->t->cluster == i)
-               i->t->cluster = NULL;
-       sql_trans_drop_dependencies(tr, i->base.id);
-       if (isGlobalTable(i->t)) 
-               tr->schema_updates ++;
-
-       if (drop_action)
-               sql_trans_drop_all_dependencies(tr, i->t->s, i->base.id, 
INDEX_DEPENDENCY);
-}
-
-static void
 sys_drop_tc(sql_trans *tr, sql_trigger * i, sql_kc *kc)
 {
        sql_schema *syss = find_sql_schema(tr, isGlobalTable(i->t)?"sys":"tmp");
@@ -4212,27 +4212,22 @@
                *local_id = k->base.id;
                list_append(tr->dropped, local_id);
        }
-       
-
-       if (!isTempTable(k->t))
-               sys_drop_key(tr, k, drop_action);
-
-       k->base.wtime = k->t->base.wtime = s->base.wtime = tr->wtime = 
tr->stime;
-       if (isGlobalTable(k->t)) 
-               tr->schema_updates ++;
+
+       if (k->idx)
+               sql_trans_drop_idx(tr, s, k->idx->base.id, drop_action);
 
        /*Clean the key from the keys*/
        n = cs_find_name(&k->t->keys, k->base.name);
        if (n)
                cs_del(&k->t->keys, n, k->base.flag);
 
-       /* Clean the index of the key*/
-       if (k->type ==  fkey) {
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to