Changeset: 51333b32e0a1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/51333b32e0a1
Modified Files:
sql/backends/monet5/rel_bin.c
sql/test/pg_regress/Tests/alter_table.test
Branch: check
Log Message:
enable ALTER TABLE ... ADD CONSTRAINT ... CHECK ... statements
diffs (97 lines):
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -5997,33 +5997,36 @@ sql_update_check(backend *be, sql_key *
sql_rel* rel = rel_read(sql, sa_strdup(sql->sa, key->check), &pos,
sa_list(sql->sa));
stack_pop_frame(sql);
- sql_rel* base = rel->l;
- assert(strcmp(((sql_exp*) updates->exps->h->data)->alias.name, TID) ==
0);
- list_append(base->exps, exp_copy(sql, updates->exps->h->data));
-
- bool need_join = 0;
- list* pexps = sa_list(sql->sa);
- sql_exp* tid_exp = exp_copy(sql, updates->exps->h->data);
- unsigned label = ++sql->label;
- exp_setrelname(sql->sa, tid_exp, label);
- list_append(pexps, tid_exp);
- for (node* m = base->exps->h; m; m = m->next) {
- if (exps_find_exp( updates->exps, m->data) == NULL) {
- pexps = list_append(pexps, exp_copy(sql, m->data));
- need_join = 1;
- }
- }
-
- if (need_join) {
- base = rel_project(sql->sa, base, pexps);
- sql_rel* join = rel_crossproduct(sql->sa, base, updates,
op_join);
- sql_exp* join_cond = exp_compare(sql->sa, exp_ref(sql,
base->exps->h->data), exp_ref(sql, updates->exps->h->data), cmp_equal);
- join->exps = sa_list(sql->sa);
- join->exps = list_append(join->exps, join_cond);
- rel->l = join;
- }
- else {
- rel->l = updates;
+
+ if (!key->base.new) {
+ sql_rel* base = rel->l;
+ assert(strcmp(((sql_exp*) updates->exps->h->data)->alias.name,
TID) == 0);
+ list_append(base->exps, exp_copy(sql, updates->exps->h->data));
+
+ bool need_join = 0;
+ list* pexps = sa_list(sql->sa);
+ sql_exp* tid_exp = exp_copy(sql, updates->exps->h->data);
+ unsigned label = ++sql->label;
+ exp_setrelname(sql->sa, tid_exp, label);
+ list_append(pexps, tid_exp);
+ for (node* m = base->exps->h; m; m = m->next) {
+ if (exps_find_exp( updates->exps, m->data) == NULL) {
+ pexps = list_append(pexps, exp_copy(sql,
m->data));
+ need_join = 1;
+ }
+ }
+
+ if (need_join) {
+ base = rel_project(sql->sa, base, pexps);
+ sql_rel* join = rel_crossproduct(sql->sa, base,
updates, op_join);
+ sql_exp* join_cond = exp_compare(sql->sa, exp_ref(sql,
base->exps->h->data), exp_ref(sql, updates->exps->h->data), cmp_equal);
+ join->exps = sa_list(sql->sa);
+ join->exps = list_append(join->exps, join_cond);
+ rel->l = join;
+ }
+ else {
+ rel->l = updates;
+ }
}
sql_subfunc *cnt = sql_bind_func(sql, "sys", "count",
sql_bind_localtype("void"), NULL, F_AGGR, true, true);
@@ -6138,9 +6141,15 @@ rel2bin_update(backend *be, sql_rel *rel
return NULL;
t = rel_ddl_table_get(tr);
- /* no columns to update (probably an new pkey!) */
- if (!rel->exps)
+ /* no columns to update (probably an new pkey or ckey!) */
+ if (!rel->exps) {
+ for (m = ol_first_node(t->keys); m; m = m->next) {
+ sql_key * key = m->data;
+ if (key->type == ckey && key->base.new)
+ sql_update_check(be, key, rel->r, refs);
+ }
return ddl;
+ }
}
if (rel->r) /* first construct the update relation */
diff --git a/sql/test/pg_regress/Tests/alter_table.test
b/sql/test/pg_regress/Tests/alter_table.test
--- a/sql/test/pg_regress/Tests/alter_table.test
+++ b/sql/test/pg_regress/Tests/alter_table.test
@@ -469,7 +469,7 @@ create table atacc1 ( test int )
statement ok
insert into atacc1 (test) values (2)
-statement ok
+statement error
alter table atacc1 add constraint atacc_test1 check (test>3)
statement ok
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]