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

Reply via email to