Changeset: b94c34073d77 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b94c34073d77
Modified Files:
        sql/server/rel_schema.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: check
Log Message:

persist check condition in the catalog


diffs (125 lines):

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
@@ -610,18 +610,29 @@ column_constraint_type(sql_query *query,
                sql_rel *rel = rel_project_exp(sql, e);
                (void) rel;
 
-               char* rel_str = rel2str(sql, rel);
+               char* check = rel2str(sql, rel);
 
                int pos = 0;
                list *refs = sa_list(sql->sa);
-               sql_rel* rel2 = rel_read(sql, rel_str, &pos, refs);
-               (void) rel_str;
+               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;
-               (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT CHECK: 
check constraints not supported");
-               return SQL_ERR;
+
+               switch (mvc_check(sql, cs, check)) {
+                       case -1:
+                               (void) sql_error(sql, 02, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                               return SQL_ERR;
+                       case -2:
+                       case -3:
+                               (void) sql_error(sql, 02, SQLSTATE(42000) 
"CHECK CONSTRAINT: transaction conflict detected");
+                               return SQL_ERR;
+                       default:
+                               break;
+               }
+               res = SQL_OK;
        }       break;
        default:{
                res = SQL_ERR;
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -1496,6 +1496,18 @@ mvc_storage(mvc *m, sql_column *col, cha
 }
 
 int
+mvc_check(mvc *m, sql_column *col, char *check)
+{
+       TRC_DEBUG(SQL_TRANS, "Check: %s %s\n", col->base.name, check);
+       if (col->t->persistence == SQL_DECLARED_TABLE) {
+               col->check = check?sa_strdup(m->sa, check):NULL;
+               return 0;
+       } else {
+               return sql_trans_alter_check(m->session->tr, col, check);
+       }
+}
+
+int
 mvc_access(mvc *m, sql_table *t, sht access)
 {
        TRC_DEBUG(SQL_TRANS, "Access: %s %d\n", t->base.name, access);
diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h
--- a/sql/server/sql_mvc.h
+++ b/sql/server/sql_mvc.h
@@ -226,6 +226,7 @@ sql_export int mvc_create_column(sql_col
 extern int mvc_create_column_(sql_column **col, mvc *m, sql_table *t, const 
char *name, const char *type, unsigned int digits);
 extern int mvc_null(mvc *c, sql_column *col, int flag);
 extern int mvc_default(mvc *c, sql_column *col, char *val);
+extern int mvc_check(mvc *m, sql_column *col, char *check);
 extern int mvc_drop_default(mvc *c, sql_column *col);
 extern int mvc_storage(mvc *c, sql_column *col, char *storage);
 extern int mvc_access(mvc *m, sql_table *t, sht access);
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -410,6 +410,7 @@ extern int sql_trans_drop_column(sql_tra
 extern int sql_trans_alter_null(sql_trans *tr, sql_column *col, int isnull);
 extern int sql_trans_alter_default(sql_trans *tr, sql_column *col, char *val);
 extern int sql_trans_alter_storage(sql_trans *tr, sql_column *col, char 
*storage);
+extern int sql_trans_alter_check(sql_trans *tr, sql_column *col, char *check);
 extern int sql_trans_is_sorted(sql_trans *tr, sql_column *col);
 extern int sql_trans_is_unique(sql_trans *tr, sql_column *col);
 extern int sql_trans_is_duplicate_eliminated(sql_trans *tr, sql_column *col);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -6432,6 +6432,39 @@ sql_trans_alter_storage(sql_trans *tr, s
 }
 
 int
+sql_trans_alter_check(sql_trans *tr, sql_column *col, char *check)
+{
+       int res = LOG_OK;
+       sqlstore *store = tr->store;
+
+       if ((col->check || check) && (!col->check || !check || 
strcmp(col->check, check) != 0)) {
+               void *p = check ? check : (void *) ATOMnilptr(TYPE_str);
+               sql_schema *syss = find_sql_schema(tr, 
isGlobal(col->t)?"sys":"tmp");
+               sql_table *syscolumn = find_sql_table(tr, syss, "_columns");
+               sql_column *col_ids = find_sql_column(syscolumn, "id");
+               sql_column *col_chks = find_sql_column(syscolumn, "check");
+               oid rid = store->table_api.column_find_row(tr, col_ids, 
&col->base.id, NULL);
+               sql_column *dup = NULL;
+
+               if (is_oid_nil(rid))
+                       return -1;
+               if ((res = store->table_api.column_update_value(tr, col_chks, 
rid, p)))
+                       return res;
+
+               if ((res = new_column(tr, col, &dup)))
+                       return res;
+               _DELETE(dup->check);
+               if (check)
+                       dup->check =_STRDUP(check);
+               if (!isNew(col) && isGlobal(col->t) && !isGlobalTemp(col->t) && 
(res = sql_trans_add_dependency(tr, col->t->base.id, dml)))
+                       return res;
+               if ((res = store_reset_sql_functions(tr, col->t->base.id))) /* 
reset sql functions depending on the table */
+                       return res;
+       }
+       return res;
+}
+
+int
 sql_trans_is_sorted( sql_trans *tr, sql_column *col )
 {
        sqlstore *store = tr->store;
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to