[prev in list] [next in list] [prev in thread] [next in thread]
List: monetdb-checkins
Subject: MonetDB: Oct2014 - new fix for the name conflict bug
From: Niels Nes <commits () monetdb ! org>
Date: 2015-01-30 12:13:32
Message-ID: hg.e388060548bd.1422620012.6315528441665844383 () monetdb2 ! cwi-incubator ! nl
[Download RAW message or body]
Changeset: e388060548bd for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e388060548bd
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/store.c
Branch: Oct2014
Log Message:
new fix for the name conflict bug
diffs (114 lines):
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -984,12 +984,6 @@ create_col(sql_trans *tr, sql_column *c)
sql_column *fc = NULL;
size_t cnt = 0;
- /* Temp solutions for name conflicts */
- log_bid bid = logger_find_bat(bat_logger, bat->name);
-
- if (bid)
- return LOG_ERR;
-
/* alter ? */
if (c->t->columns.set && (fc = c->t->columns.set->h->data) != NULL)
cnt = count_col(tr, fc, 1);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -1955,6 +1955,76 @@ column_dup(sql_trans *tr, int flag, sql_
return c;
}
+static int
+sql_trans_cname_conflict( sql_trans *tr, sql_table *t, char *extra, char *cname)
+{
+ char *tmp;
+
+ if (extra) {
+ tmp = sa_message(tr->sa, "%s_%s", extra, cname);
+ } else {
+ tmp = cname;
+ }
+ if (find_sql_column(t, tmp))
+ return 1;
+ return 0;
+}
+
+static int
+sql_trans_tname_conflict( sql_trans *tr, sql_schema *s, char *extra, char *tname, char *cname)
+{
+ char *tp;
+ char *tmp;
+ sql_table *t = NULL;
+
+ if (extra) {
+ tmp = sa_message(tr->sa, "%s_%s", extra, tname);
+ } else {
+ tmp = sa_strdup(tr->sa, tname);
+ }
+ tp = tmp;
+ while ((tp = strchr(tp, '_')) != NULL) {
+ *tp = 0;
+ t = find_sql_table(s, tmp);
+ if (t && sql_trans_cname_conflict(tr, t, tp+1, cname))
+ return 1;
+ *tp++ = '_';
+ }
+ t = find_sql_table(s, tname);
+ if (t && sql_trans_cname_conflict(tr, t, NULL, cname))
+ return 1;
+ return 0;
+}
+
+static int
+sql_trans_name_conflict( sql_trans *tr, char *sname, char *tname, char *cname)
+{
+ char *sp;
+ sql_schema *s = NULL;
+
+ sp = strchr(sname, '_');
+ if (!sp && strchr(tname, '_') == 0 && strchr(cname, '_') == 0)
+ return 0;
+
+ if (sp) {
+ char *tmp = sa_strdup(tr->sa, sname);
+ sp = tmp;
+ while ((sp = strchr(sp, '_')) != NULL) {
+ *sp = 0;
+ s = find_sql_schema(tr, tmp);
+ if (s && sql_trans_tname_conflict(tr, s, sp+1, tname, cname))
+ return 1;
+ *sp++ = '_';
+ }
+ } else {
+ s = find_sql_schema(tr, sname);
+ if (s)
+ return sql_trans_tname_conflict(tr, s, NULL, tname, cname);
+ }
+ return 0;
+
+}
+
sql_column *
sql_trans_copy_column( sql_trans *tr, sql_table *t, sql_column *c )
{
@@ -1962,6 +2032,8 @@ sql_trans_copy_column( sql_trans *tr, sq
sql_table *syscolumn = find_sql_table(syss, "_columns");
sql_column *col = SA_ZNEW(tr->sa, sql_column);
+ if (sql_trans_name_conflict(tr, t->s->base.name, t->base.name, c->base.name))
+ return NULL;
base_init(tr->sa, &col->base, c->base.id, TR_NEW, c->base.name);
col->type = c->type;
col->def = NULL;
@@ -4177,6 +4249,8 @@ sql_trans_create_column(sql_trans *tr, s
if (!tpe)
return NULL;
+ if (sql_trans_name_conflict(tr, t->s->base.name, t->base.name, name))
+ return NULL;
col = create_sql_column(tr->sa, t, name, tpe );
if (isTable(col->t))
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic