Changeset: 4a1b36c42d20 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/4a1b36c42d20 Modified Files: sql/backends/monet5/rel_bin.c sql/server/rel_schema.c Branch: check Log Message:
column CHECK condition on insert diffs (86 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 @@ -16,6 +16,7 @@ #include "rel_rel.h" #include "rel_basetable.h" #include "rel_exp.h" +#include "rel_dump.h" #include "rel_psm.h" #include "rel_prop.h" #include "rel_select.h" @@ -4926,6 +4927,42 @@ sql_insert_triggers(backend *be, sql_tab return res; } +static void +sql_insert_check(backend *be, sql_table *t, sql_rel *rel, list *refs) +{ + mvc *sql = be->mvc; + node *m, *n; + + sql_rel* rel2 = rel_copy(sql, rel, 1); + + list* exps = rel2->exps; + + sql_rel* rel3; + + + sql_subtype *bt = sql_bind_localtype("bit"); + + for (n = ol_first_node(t->columns), m = exps->h; n && m; + n = n->next, m = m->next) { + sql_exp *i = m->data; + sql_column *c = n->data; + if (c->check) { + i->alias.rname= sa_strdup(sql->sa, t->base.name); + i->alias.name= sa_strdup(sql->sa, c->base.name); + + int pos = 0; + rel3 = rel_read(sql, sa_strdup(sql->sa, c->check), &pos, sa_list(sql->sa)); + rel3->l = rel2; + stmt* s = subrel_bin(be, rel3, refs); + s = stmt_uselect(be, column(be, s), stmt_atom(be, atom_zero_value(sql->sa, bt)), cmp_equal, NULL, 0, 1); + sql_subfunc *cnt = sql_bind_func(sql, "sys", "count", sql_bind_localtype("void"), NULL, F_AGGR, true, true); + s = stmt_aggr(be, s, NULL, NULL, cnt, 1, 0, 1); + char *msg = sa_message(sql->sa, SQLSTATE(40002) "INSERT INTO: CHECK constraint violated for column %s.%s", c->t->base.name, c->base.name); + (void)stmt_exception(be, s, msg, 00001); + } + } +} + static sql_table * sql_insert_check_null(backend *be, sql_table *t, list *inserts) { @@ -5004,6 +5041,8 @@ rel2bin_insert(backend *be, sql_rel *rel if (idx_ins) pin = refs_find_rel(refs, prel); + sql_insert_check(be, t, rel->r, refs); + if (!sql_insert_check_null(be, t, inserts->op4.lval)) return NULL; diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c --- a/sql/server/rel_schema.c +++ b/sql/server/rel_schema.c @@ -608,19 +608,8 @@ column_constraint_type(sql_query *query, sql_rel* rel3 = rel_basetable(sql, t, t->base.name); sql_exp *e = rel_logical_value_exp(query, &rel3, s->data.sym, sql_sel, ek); sql_rel *rel = rel_project_exp(sql, e); - (void) rel; - char* check = rel2str(sql, rel); - int pos = 0; - list *refs = sa_list(sql->sa); - sql_rel* rel2 = rel_read(sql, check, &pos, refs); - (void) check; - (void) rel2; - char *err = NULL, *r; - r = symbol2string(sql, s->data.sym, 0, &err); - (void) r; - switch (mvc_check(sql, cs, check)) { case -1: (void) sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL); _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org