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