Changeset: 9a64ac00868b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9a64ac00868b
Modified Files:
        sql/include/sql_catalog.h
        sql/server/rel_basetable.c
        sql/server/rel_optimizer.c
        sql/server/rel_schema.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/storage/sql_catalog.c
        sql/storage/sql_storage.h
        sql/storage/store.c
        sql/test/miscellaneous/Tests/simple_plans.test
Branch: antipush
Log Message:

Don't make a column less unique than before. Cleaned unique flag propagation


diffs (truncated from 503 to 300 lines):

diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -614,7 +614,7 @@ typedef struct sql_column {
        int colnr;
        bit null;
        char *def;
-       char unique;            /* NOT UNIQUE, UNIQUE, SUB_UNIQUE */
+       char unique;            /* 0 NOT UNIQUE, 1 SUB_UNIQUE, 2 UNIQUE */
        int drop_action;        /* only used for alter statements */
        char *storage_type;
        int sorted;             /* for DECLARED (dupped tables) we keep order 
info */
diff --git a/sql/server/rel_basetable.c b/sql/server/rel_basetable.c
--- a/sql/server/rel_basetable.c
+++ b/sql/server/rel_basetable.c
@@ -157,7 +157,7 @@ bind_col_exp(mvc *sql, char *name, sql_c
        if (c->t->pkey && ((sql_kc*)c->t->pkey->k.columns->h->data)->c == c) {
                p = e->p = prop_create(sql->sa, PROP_HASHCOL, e->p);
                p->value = c->t->pkey;
-       } else if (c->unique == 1) {
+       } else if (c->unique == 2) {
                p = e->p = prop_create(sql->sa, PROP_HASHCOL, e->p);
                p->value = NULL;
        }
@@ -325,7 +325,7 @@ rel_base_add_columns( mvc *sql, sql_rel 
                if (c->t->pkey && ((sql_kc*)c->t->pkey->k.columns->h->data)->c 
== c) {
                        p = e->p = prop_create(sql->sa, PROP_HASHCOL, e->p);
                        p->value = c->t->pkey;
-               } else if (c->unique == 1) {
+               } else if (c->unique == 2) {
                        p = e->p = prop_create(sql->sa, PROP_HASHCOL, e->p);
                        p->value = NULL;
                }
@@ -371,7 +371,7 @@ rewrite_basetable(mvc *sql, sql_rel *rel
                        if (c->t->pkey && 
((sql_kc*)c->t->pkey->k.columns->h->data)->c == c) {
                                p = e->p = prop_create(sa, PROP_HASHCOL, e->p);
                                p->value = c->t->pkey;
-                       } else if (c->unique == 1) {
+                       } else if (c->unique == 2) {
                                p = e->p = prop_create(sa, PROP_HASHCOL, e->p);
                                p->value = NULL;
                        }
@@ -447,7 +447,7 @@ rel_rename_part(mvc *sql, sql_rel *p, sq
                        if (rc->t->pkey && 
((sql_kc*)rc->t->pkey->k.columns->h->data)->c == rc) {
                                prop *p = ne->p = prop_create(sql->sa, 
PROP_HASHCOL, ne->p);
                                p->value = rc->t->pkey;
-                       } else if (rc->unique == 1) {
+                       } else if (rc->unique == 2) {
                                prop *p = ne->p = prop_create(sql->sa, 
PROP_HASHCOL, ne->p);
                                p->value = NULL;
                        }
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -2437,7 +2437,7 @@ rel_distinct_aggregate_on_unique_values(
                                                        /* column is the only 
primary key column of its table */
                                                        if (find_prop(arg->p, 
PROP_HASHCOL) && c->t->pkey && list_find(c->t->pkey->k.columns, c, cmp) != NULL 
&& list_length(c->t->pkey->k.columns) == 1)
                                                                continue;
-                                                       else if (c->unique == 
1) /* column has unique constraint */
+                                                       else if (c->unique == 
2) /* column has unique constraint */
                                                                continue;
                                                        else
                                                                all_unique = 
false;
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
@@ -382,7 +382,7 @@ column_constraint_type(mvc *sql, const c
                        default:
                                break;
                }
-               switch (mvc_create_ukey_done(sql, k)) {
+               switch (mvc_create_key_done(sql, k)) {
                        case -1:
                                (void) sql_error(sql, 02, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                                return res;
@@ -468,6 +468,17 @@ column_constraint_type(mvc *sql, const c
                        default:
                                break;
                }
+               switch (mvc_create_key_done(sql, (sql_key*)fk)) {
+                       case -1:
+                               (void) sql_error(sql, 02, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                               return res;
+                       case -2:
+                       case -3:
+                               (void) sql_error(sql, 02, SQLSTATE(42000) 
"CONSTRAINT FOREIGN KEY: transaction conflict detected");
+                               return res;
+                       default:
+                               break;
+               }
                res = SQL_OK;
        }       break;
        case SQL_NOT_NULL:
@@ -704,6 +715,17 @@ table_foreign_key(mvc *sql, char *name, 
                        sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT FOREIGN 
KEY: not all columns are handled\n");
                        return SQL_ERR;
                }
+               switch (mvc_create_key_done(sql, (sql_key*)fk)) {
+                       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) 
"CONSTRAINT FOREIGN KEY: transaction conflict detected");
+                               return SQL_ERR;
+                       default:
+                               break;
+               }
        }
        return SQL_OK;
 }
@@ -763,7 +785,7 @@ table_constraint_type(mvc *sql, char *na
                                        break;
                        }
                }
-               switch (mvc_create_ukey_done(sql, k)) {
+               switch (mvc_create_key_done(sql, k)) {
                        case -1:
                                (void) sql_error(sql, 02, SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                                return SQL_ERR;
@@ -2110,6 +2132,7 @@ rel_create_index(mvc *sql, char *iname, 
                                break;
                }
        }
+       mvc_create_idx_done(sql, i);
 
        /* new columns need update with default values */
        updates = SA_ZNEW_ARRAY(sql->sa, sql_exp*, ol_length(nt->columns));
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
@@ -1092,7 +1092,7 @@ mvc_create_ukey(sql_key **kres, mvc *m, 
 }
 
 int
-mvc_create_ukey_done(mvc *m, sql_key *k)
+mvc_create_key_done(mvc *m, sql_key *k)
 {
        int res = LOG_OK;
 
@@ -1167,7 +1167,7 @@ mvc_create_idx(sql_idx **i, mvc *m, sql_
 }
 
 int
-mvc_create_ic(mvc *m, sql_idx * i, sql_column *c)
+mvc_create_ic(mvc *m, sql_idx *i, sql_column *c)
 {
        int res = LOG_OK;
 
@@ -1180,6 +1180,16 @@ mvc_create_ic(mvc *m, sql_idx * i, sql_c
 }
 
 int
+mvc_create_idx_done(mvc *m, sql_idx *i)
+{
+       int res = LOG_OK;
+
+       (void) m;
+       (void) create_sql_idx_done(i);
+       return res;
+}
+
+int
 mvc_drop_idx(mvc *m, sql_schema *s, sql_idx *i)
 {
        TRC_DEBUG(SQL_TRANS, "Drop index: %s %s\n", s->base.name, i->base.name);
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
@@ -222,15 +222,16 @@ extern int mvc_is_unique(mvc *m, sql_col
 extern int mvc_is_duplicate_eliminated(mvc *c, sql_column *col);
 
 extern int mvc_create_ukey(sql_key **kres, mvc *m, sql_table *t, const char 
*name, key_type kt);
-extern int mvc_create_ukey_done(mvc *m, sql_key *k);
 extern int mvc_create_fkey(sql_fkey **kres, mvc *m, sql_table *t, const char 
*name, key_type kt, sql_key *rkey, int on_delete, int on_update);
 extern int mvc_create_kc(mvc *m, sql_key *k, sql_column *c);
 extern int mvc_create_fkc(mvc *m, sql_fkey *fk, sql_column *c);
+extern int mvc_create_key_done(mvc *m, sql_key *k);
 
 extern int mvc_drop_key(mvc *c, sql_schema *s, sql_key *key, int drop_action);
 
 extern int mvc_create_idx(sql_idx **i, mvc *m, sql_table *t, const char *name, 
idx_type it);
 extern int mvc_create_ic(mvc *m, sql_idx * i, sql_column *c);
+extern int mvc_create_idx_done(mvc *m, sql_idx *i);
 extern int mvc_drop_idx(mvc *c, sql_schema *s, sql_idx * i);
 
 extern int mvc_create_trigger(sql_trigger **tri, mvc *m, sql_table *t, const 
char *name, sht time, sht orientation, sht event, const char *old_name, const 
char *new_name, const char *condition, const char *statement);
diff --git a/sql/storage/sql_catalog.c b/sql/storage/sql_catalog.c
--- a/sql/storage/sql_catalog.c
+++ b/sql/storage/sql_catalog.c
@@ -506,7 +506,7 @@ is_column_unique(sql_column *c)
        if (c->t->pkey && list_length(c->t->pkey->k.columns) == 1 && 
((sql_kc*)c->t->pkey->k.columns->h->data)->c->base.id == c->base.id)
                return true;
        /* is it a unique key itself */
-       return c->unique == 1;
+       return c->unique == 2;
 }
 
 static ValPtr /* TODO remove this duplicated code */
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
@@ -429,6 +429,7 @@ extern sql_key * key_create_done(struct 
 
 extern sql_idx *create_sql_idx(struct sqlstore *store, sql_allocator *sa, 
sql_table *t, const char *nme, idx_type it);
 extern sql_idx *create_sql_ic(struct sqlstore *store, sql_allocator *sa, 
sql_idx *i, sql_column *c);
+extern sql_idx *create_sql_idx_done(sql_idx *i);
 extern sql_func *create_sql_func(struct sqlstore *store, sql_allocator *sa, 
const char *func, list *args, list *res, sql_ftype type, sql_flang lang, const 
char *mod, const char *impl, const char *query, bit varres, bit vararg, bit 
system);
 
 /* for alter we need to duplicate a table */
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -420,15 +420,6 @@ load_idxcolumn(sql_trans *tr, sql_idx * 
        kc->c = find_sql_column(i->t, v);
        assert(kc->c);
        list_append(i->columns, kc);
-       if (hash_index(i->type)) {
-               if (list_length(i->columns) == 1) {
-                       kc->c->unique = 1;
-               } else {
-                       /* Correct unique flag of first key column */
-                       sql_kc *ic1 = i->columns->h->data;
-                       ic1->c->unique = kc->c->unique = 2;
-               }
-       }
 }
 
 static sql_idx *
@@ -458,7 +449,7 @@ load_idx(sql_trans *tr, sql_table *t, re
                        break;
                load_idxcolumn(tr, ni, rt_idxcols);
        }
-       return ni;
+       return create_sql_idx_done(ni);
 }
 
 static void
@@ -3240,7 +3231,7 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
        sql_table *sysidx = find_sql_table(tr, syss, "idxs");
        sql_table *sysic = find_sql_table(tr, syss, "objects");
        node *n;
-       int nr, res = LOG_OK;
+       int nr, res = LOG_OK, ncols = list_length(i->columns);
        sql_table *dup = NULL;
 
        if ((res = new_table(tr, t, &dup)))
@@ -3258,15 +3249,8 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
                sql_kc *okc = n->data, *ic;
 
                list_append(ni->columns, ic = kc_dup(tr, okc, t));
-               if (i->type == hash_idx) {
-                       if (nr == 0) {
-                               ic->c->unique = 1;
-                       } else {
-                               /* Correct unique flag of first key column */
-                               sql_kc *ic1 = ni->columns->h->data;
-                               ic1->c->unique = ic->c->unique = 2;
-                       }
-               }
+               if (i->type == hash_idx)
+                       ic->c->unique = (ncols == 1) ? 2 : MAX(ic->c->unique, 
1);
                if ((res = store->table_api.table_insert(tr, sysic, 
&ni->base.id, &ic->c->base.name, &nr, ATOMnilptr(TYPE_int)))) {
                        idx_destroy(store, ni);
                        return res;
@@ -5545,33 +5529,6 @@ create_sql_fkey(sqlstore *store, sql_all
 }
 
 sql_idx *
-create_sql_ic(sqlstore *store, sql_allocator *sa, sql_idx *i, sql_column *c)
-{
-       sql_kc *ic = SA_ZNEW(sa, sql_kc);
-
-       ic->c = c;
-       list_append(i->columns, ic);
-
-       (void)store;
-       if (hash_index(i->type)) {
-               if (list_length(i->columns) == 1) {
-                       c->unique = 1;
-               } else {
-                       /* Correct unique flag of first key column */
-                       sql_kc *ic1 = i->columns->h->data;
-                       ic1->c->unique = c->unique = 2;
-               }
-       }
-
-       /* should we switch to oph_idx ? */
-       if (i->type == hash_idx && list_length(i->columns) == 1 && 
ic->c->sorted) {
-               /*i->type = oph_idx;*/
-               i->type = no_idx;
-       }
-       return i;
-}
-
-sql_idx *
 create_sql_idx(sqlstore *store, sql_allocator *sa, sql_table *t, const char 
*name, idx_type it)
 {
        sql_idx *ni = SA_ZNEW(sa, sql_idx);
@@ -5586,6 +5543,37 @@ create_sql_idx(sqlstore *store, sql_allo
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to