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