[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