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 -- [email protected]
To unsubscribe send an email to [email protected]