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