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