Changeset: b253ed971b5c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b253ed971b5c
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: Feb2010
Log Message:
back ported fix
diffs (truncated from 315 to 300 lines):
diff -r 2a2886a777a0 -r b253ed971b5c sql/src/include/sql_relation.h
--- a/sql/src/include/sql_relation.h Wed May 19 21:43:06 2010 +0200
+++ b/sql/src/include/sql_relation.h Wed May 19 22:00:26 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 2a2886a777a0 -r b253ed971b5c sql/src/server/rel_optimizer.mx
--- a/sql/src/server/rel_optimizer.mx Wed May 19 21:43:06 2010 +0200
+++ b/sql/src/server/rel_optimizer.mx Wed May 19 22:00:26 2010 +0200
@@ -303,6 +303,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 2a2886a777a0 -r b253ed971b5c sql/src/server/rel_schema.mx
--- a/sql/src/server/rel_schema.mx Wed May 19 21:43:06 2010 +0200
+++ b/sql/src/server/rel_schema.mx Wed May 19 22:00:26 2010 +0200
@@ -718,23 +718,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));
@@ -910,7 +894,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;
@@ -946,7 +930,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;
@@ -967,7 +951,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;
@@ -1005,6 +989,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)
{
@@ -1026,6 +1023,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 || table_element(sql, te, s, nt, 1) == SQL_ERR)
return NULL;
@@ -1094,7 +1101,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;
@@ -1125,13 +1132,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:
@@ -1141,13 +1142,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 2a2886a777a0 -r b253ed971b5c sql/src/storage/store.mx
--- a/sql/src/storage/store.mx Wed May 19 21:43:06 2010 +0200
+++ b/sql/src/storage/store.mx Wed May 19 22:00:26 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;
}
@@ -3046,6 +3046,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;
@@ -3086,51 +3131,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");
@@ -4177,27 +4177,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
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list