Changeset: 532d2d76c3bf for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=532d2d76c3bf
Modified Files:
Branch: default
Log Message:
Merge the patches
diffs (truncated from 547 to 300 lines):
diff -r 663f4e388b59 -r 532d2d76c3bf sql/src/backends/monet5/sql.mx
--- a/sql/src/backends/monet5/sql.mx Wed May 19 22:17:21 2010 +0200
+++ b/sql/src/backends/monet5/sql.mx Wed May 19 22:17:52 2010 +0200
@@ -1761,6 +1761,26 @@
}
static str
+drop_key( mvc *sql, char *sname, char *kname, int drop_action )
+{
+ sql_key *key;
+ sql_schema *ss = NULL;
+
+ if (sname != NULL && (ss = mvc_bind_schema(sql, sname)) == NULL)
+ return sql_message("DROP VIEW: no such schema '%s'", sname);
+
+ if (ss == NULL)
+ ss = cur_schema(sql);
+
+ if ((key = mvc_bind_key(sql, ss, kname )) == NULL)
+ return sql_message("ALTER TABLE: no such constraint '%s'",
kname);
+ if (!drop_action && mvc_check_dependency(sql, key->base.id,
KEY_DEPENDENCY, NULL))
+ return sql_message("ALTER TABLE: cannot drop constraint '%s':
there are database objects which depend on it", key->base.name);
+ mvc_drop_key(sql, ss, key, drop_action);
+ return MAL_SUCCEED;
+}
+
+static str
create_seq( mvc *sql, char *sname, sql_sequence *seq)
{
sql_schema *s = NULL;
@@ -1918,6 +1938,12 @@
sql_table *t = *(sql_table**) getArgReference(stk, pci, 3);
msg = alter_table(sql, sname, t);
} break;
+ case DDL_DROP_CONSTRAINT: {
+ int action = *(int*) getArgReference(stk, pci, 4);
+ str name = *(str*) getArgReference(stk, pci, 3);
+
+ msg = drop_key( sql, sname, name, action);
+ } break;
default:
throw(SQL, "sql.catalog", "catalog unknown type");
}
diff -r 663f4e388b59 -r 532d2d76c3bf sql/src/include/sql_relation.h
--- a/sql/src/include/sql_relation.h Wed May 19 22:17:21 2010 +0200
+++ b/sql/src/include/sql_relation.h Wed May 19 22:17:52 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 663f4e388b59 -r 532d2d76c3bf sql/src/server/rel_optimizer.mx
--- a/sql/src/server/rel_optimizer.mx Wed May 19 22:17:21 2010 +0200
+++ b/sql/src/server/rel_optimizer.mx Wed May 19 22:17:52 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 663f4e388b59 -r 532d2d76c3bf sql/src/server/rel_schema.mx
--- a/sql/src/server/rel_schema.mx Wed May 19 22:17:21 2010 +0200
+++ b/sql/src/server/rel_schema.mx Wed May 19 22:17:52 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 663f4e388b59 -r 532d2d76c3bf sql/src/storage/store.mx
--- a/sql/src/storage/store.mx Wed May 19 22:17:21 2010 +0200
+++ b/sql/src/storage/store.mx Wed May 19 22:17:52 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;
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list