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