Changeset: 30aef2cf7fed for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/30aef2cf7fed
Removed Files:
        sql/test/BugTracker-2021/Tests/type-upcasting-INT2BIGINT.Bug-7144.sql
        
sql/test/BugTracker-2021/Tests/type-upcasting-INT2BIGINT.Bug-7144.stable.err
        
sql/test/BugTracker-2021/Tests/type-upcasting-INT2BIGINT.Bug-7144.stable.out
Modified Files:
        monetdb5/optimizer/opt_mergetable.c
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_select.c
        sql/server/rel_updates.c
        sql/server/sql_parser.y
        sql/test/BugTracker-2021/Tests/All
        sql/test/BugTracker-2021/Tests/type-upcasting-INT2BIGINT.Bug-7144.test
Branch: Jul2021
Log Message:

Merged with Oct2020


diffs (166 lines):

diff --git a/monetdb5/optimizer/opt_mergetable.c 
b/monetdb5/optimizer/opt_mergetable.c
--- a/monetdb5/optimizer/opt_mergetable.c
+++ b/monetdb5/optimizer/opt_mergetable.c
@@ -177,9 +177,9 @@ static int
 checksize(matlist_t *ml, int v)
 {
        if (v >= ml->vsize) {
-               int sz = ml->vsize, i, nvsize, *nhorigin, *ntorigin, *nvars;
+               int sz = ml->vsize, i, *nhorigin, *ntorigin, *nvars;
 
-               nvsize = ml->vsize * 2;
+               unsigned int nvsize = ml->vsize * 2;
                nhorigin = (int*) GDKrealloc(ml->horigin, sizeof(int)* nvsize);
                ntorigin = (int*) GDKrealloc(ml->torigin, sizeof(int)* nvsize);
                nvars = (int*) GDKrealloc(ml->vars, sizeof(int)* nvsize);
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -2894,6 +2894,38 @@ exp_aggr_is_count(sql_exp *e)
        return 0;
 }
 
+list *
+check_distinct_exp_names(mvc *sql, list *exps)
+{
+       list *distinct_exps = NULL;
+       bool duplicates = false;
+
+       if (list_length(exps) < 2) {
+               return exps; /* always true */
+       } else if (list_length(exps) < 5) {
+               distinct_exps = list_distinct(exps, (fcmp) exp_equal, (fdup) 
NULL);
+       } else { /* for longer lists, use hashing */
+               sql_hash *ht = hash_new(sql->ta, list_length(exps), 
(fkeyvalue)&exp_key);
+
+               for (node *n = exps->h; n && !duplicates; n = n->next) {
+                       sql_exp *e = n->data;
+                       int key = ht->key(e);
+                       sql_hash_e *he = ht->buckets[key&(ht->size-1)];
+
+                       for (; he && !duplicates; he = he->chain) {
+                               sql_exp *f = he->value;
+
+                               if (!exp_equal(e, f))
+                                       duplicates = true;
+                       }
+                       hash_add(ht, key, e);
+               }
+       }
+       if ((distinct_exps && list_length(distinct_exps) != list_length(exps)) 
|| duplicates)
+               return NULL;
+       return exps;
+}
+
 void
 exps_reset_freevar(list *exps)
 {
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -196,7 +196,7 @@ extern atom *exp_flatten(mvc *sql, sql_e
 extern void exp_sum_scales(sql_subfunc *f, sql_exp *l, sql_exp *r);
 
 extern int exp_aggr_is_count(sql_exp *e);
-
+extern list *check_distinct_exp_names(mvc *sql, list *exps);
 extern void exps_reset_freevar(list *exps);
 
 extern sql_exp *exp_check_type(mvc *sql, sql_subtype *t, sql_rel *rel, sql_exp 
*exp, check_type tpe);
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -5321,36 +5321,6 @@ exp_key(sql_exp *e)
 }
 
 static list *
-check_distinct_exp_names(mvc *sql, list *exps)
-{
-       list *distinct_exps = NULL;
-       bool duplicates = false;
-
-       if (list_length(exps) < 5) {
-               distinct_exps = list_distinct(exps, (fcmp) exp_equal, (fdup) 
NULL);
-       } else { /* for longer lists, use hashing */
-               sql_hash *ht = hash_new(sql->ta, list_length(exps), 
(fkeyvalue)&exp_key);
-
-               for (node *n = exps->h; n && !duplicates; n = n->next) {
-                       sql_exp *e = n->data;
-                       int key = ht->key(e);
-                       sql_hash_e *he = ht->buckets[key&(ht->size-1)];
-
-                       for (; he && !duplicates; he = he->chain) {
-                               sql_exp *f = he->value;
-
-                               if (!exp_equal(e, f))
-                                       duplicates = true;
-                       }
-                       hash_add(ht, key, e);
-               }
-       }
-       if ((distinct_exps && list_length(distinct_exps) != list_length(exps)) 
|| duplicates)
-               return NULL;
-       return exps;
-}
-
-static list *
 group_merge_exps(mvc *sql, list *gexps, list *exps)
 {
        int nexps = list_length(gexps) + list_length(exps);
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -461,6 +461,7 @@ insert_generate_inserts(sql_query *query
        mvc *sql = query->sql;
        sql_rel *r = NULL;
        size_t rowcount = 0;
+       bool is_subquery = false;
        list *collist = check_table_columns(sql, t, columns, action, 
t->base.name);
        if (!collist)
                return NULL;
@@ -531,17 +532,18 @@ insert_generate_inserts(sql_query *query
 
                r = rel_subquery(query, NULL, val_or_q, ek);
                rowcount++;
+               is_subquery = true;
        }
        if (!r)
                return NULL;
 
-       /* In case of missing project, order by or distinct, we need to add
-          and projection */
-       if (r->op != op_project || r->r || need_distinct(r))
+       /* For the subquery case a projection is always needed */
+       if (is_subquery)
                r = rel_project(sql->sa, r, rel_projections(sql, r, NULL, 1, 
0));
-       if ((r->exps && list_length(r->exps) != list_length(collist)) ||
-               (!r->exps && collist))
+       if ((r->exps && list_length(r->exps) != list_length(collist)) || 
(!r->exps && collist))
                return sql_error(sql, 02, SQLSTATE(21S01) "%s: query result 
doesn't match number of columns in table '%s'", action, t->base.name);
+       if (is_subquery && !(r->exps = check_distinct_exp_names(sql, r->exps)))
+               return sql_error(sql, 02, SQLSTATE(42000) "%s: duplicate column 
names in subquery column list", action);
 
        r->exps = rel_inserts(sql, t, r, collist, rowcount, 0, action);
        if(!r->exps)
@@ -1782,6 +1784,9 @@ copyto(sql_query *query, symbol *sq, con
 
        if (!r)
                return NULL;
+       r = rel_project(sql->sa, r, rel_projections(sql, r, NULL, 1, 0));
+       if (!(r->exps = check_distinct_exp_names(sql, r->exps)))
+               return sql_error(sql, 02, SQLSTATE(42000) "COPY INTO: duplicate 
column names in subquery column list");
 
        tsep_e = exp_atom_clob(sql->sa, tsep);
        rsep_e = exp_atom_clob(sql->sa, rsep);
diff --git 
a/sql/test/BugTracker-2021/Tests/type-upcasting-INT2BIGINT.Bug-7144.test 
b/sql/test/BugTracker-2021/Tests/type-upcasting-INT2BIGINT.Bug-7144.test
--- a/sql/test/BugTracker-2021/Tests/type-upcasting-INT2BIGINT.Bug-7144.test
+++ b/sql/test/BugTracker-2021/Tests/type-upcasting-INT2BIGINT.Bug-7144.test
@@ -13,7 +13,7 @@ insert into t(i) select id from ints
 statement ok rowcount 2
 insert into t(j) select id from ints
 
-statement ok rowcount 2
+statement error 42000!INSERT INTO: duplicate column names in subquery column 
list
 insert into t(i, j) select id, id from ints
 
 statement ok rowcount 2
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to