Changeset: 3e4b46fe6ec7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3e4b46fe6ec7
Modified Files:
        sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out
        sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out.int128
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_select.c
        sql/test/BugTracker-2013/Tests/duplicate_column_name.Bug-3349.stable.err
        sql/test/BugTracker-2013/Tests/duplicate_column_name.Bug-3349.stable.out
        
sql/test/BugTracker-2019/Tests/disallow_duplicate_column_aliases.Bug-6723.stable.err
        
sql/test/BugTracker-2019/Tests/disallow_duplicate_column_aliases.Bug-6723.stable.out
        sql/test/analytics/Tests/analytics03.stable.out
        sql/test/analytics/Tests/analytics05.stable.out
Branch: sq2default
Log Message:

add handling of duplicate column names at the result level, ie internaly rename
(label) expressions. Only use the alias on the result (when possible).
Solves bug 6723


diffs (truncated from 502 to 300 lines):

diff --git a/sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out 
b/sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out
--- a/sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out
+++ b/sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out
@@ -35,7 +35,7 @@ stdout of test 'query2.2` in directory '
 #        GROUP BY qname
 #        HAVING COUNT(*) = 2
 #           AND SUM(bam.bam_flag(flag, 'firs_segm')) = 1
-% bam.,        bam.%11 # table_name
+% bam.,        bam.%7 # table_name
 % distance,    nr_alignments # name
 % bigint,      bigint # type
 % 3,   1 # length
diff --git a/sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out.int128 
b/sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out.int128
--- a/sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out.int128
+++ b/sql/backends/monet5/vaults/bam/Tests/query2.2.stable.out.int128
@@ -35,7 +35,7 @@ stdout of test 'query2.2` in directory '
 #        GROUP BY qname
 #        HAVING COUNT(*) = 2
 #           AND SUM(bam.bam_flag(flag, 'firs_segm')) = 1
-% bam.,        bam.%11 # table_name
+% bam.,        bam.%7 # table_name
 % distance,    nr_alignments # name
 % hugeint,     bigint # type
 % 3,   1 # length
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
@@ -635,6 +635,20 @@ exp_alias_or_copy( mvc *sql, const char 
 }
 
 sql_exp *
+exp_alias_ref(mvc *sql, sql_exp *e)
+{
+       sql_exp *ne = NULL;
+       const char *tname = exp_relname(e);
+       const char *cname = exp_name(e);
+
+       if (!has_label(e)) 
+               exp_label(sql->sa, e, ++sql->label);
+       ne = exp_ref(sql->sa, e);
+       exp_setname(sql->sa, ne, tname, cname);
+       return exp_propagate(sql->sa, ne, e);
+}
+
+sql_exp *
 exp_set(sql_allocator *sa, const char *name, sql_exp *val, int level)
 {
        sql_exp *e = exp_create(sa, e_psm);
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
@@ -85,6 +85,7 @@ extern sql_exp * exp_propagate(sql_alloc
 #define exp_ref(sa, e) exp_propagate(sa, exp_column(sa, exp_relname(e), 
exp_name(e), exp_subtype(e), exp_card(e), has_nil(e), is_intern(e)), e)
 extern sql_exp * exp_alias(sql_allocator *sa, const char *arname, const char 
*acname, const char *org_rname, const char *org_cname, sql_subtype *t, unsigned 
int card, int has_nils, int intern);
 extern sql_exp * exp_alias_or_copy( mvc *sql, const char *tname, const char 
*cname, sql_rel *orel, sql_exp *old);
+extern sql_exp * exp_alias_ref(mvc *sql, sql_exp *e);
 extern sql_exp * exp_set(sql_allocator *sa, const char *name, sql_exp *val, 
int level);
 extern sql_exp * exp_var(sql_allocator *sa, const char *name, sql_subtype 
*type, int level);
 extern sql_exp * exp_table(sql_allocator *sa, const char *name, sql_table *t, 
int level);
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
@@ -72,16 +72,42 @@ rel_table_projections( mvc *sql, sql_rel
        case op_table:
        case op_basetable:
                if (rel->exps) {
+                       int rename = 0;
                        node *en;
 
+                       /* first check alias */
+                       if (!is_base(rel->op) && !level) {
+                               list *exps = sa_list(sql->sa);
+
+                               for (en = rel->exps->h; en && !rename; en = 
en->next) {
+                                       sql_exp *e = en->data;;
+
+                                       if ((is_basecol(e) && exp_relname(e) && 
strcmp(exp_relname(e), tname) == 0) ||
+                                           (is_basecol(e) && !exp_relname(e) 
&& e->l && strcmp(e->l, tname) == 0)) {
+                                               if (exp_name(e) && 
exps_bind_column2(exps, tname, exp_name(e)))
+                                                       rename = 1;
+                                               else
+                                                       append(exps, e);
+                                       }
+                               }
+                       }
+
                        exps = new_exp_list(sql->sa);
                        for (en = rel->exps->h; en; en = en->next) {
                                sql_exp *e = en->data;
-                               /* first check alias */
-                               if (is_basecol(e) && exp_relname(e) && 
strcmp(exp_relname(e), tname) == 0)
-                                       append(exps, exp_alias_or_copy(sql, 
tname, exp_name(e), rel, e));
-                               if (is_basecol(e) && !exp_relname(e) && e->l && 
strcmp(e->l, tname) == 0)
-                                       append(exps, exp_alias_or_copy(sql, 
tname, exp_name(e), rel, e));
+                               if (is_basecol(e) && exp_relname(e) && 
strcmp(exp_relname(e), tname) == 0) {
+                                       if (rename)
+                                               append(exps, exp_alias_ref(sql, 
e));
+                                       else 
+                                               append(exps, 
exp_alias_or_copy(sql, tname, exp_name(e), rel, e));
+                               }
+                               if (is_basecol(e) && !exp_relname(e) && e->l && 
strcmp(e->l, tname) == 0) {
+                                       if (rename)
+                                               append(exps, exp_alias_ref(sql, 
e));
+                                       else
+                                               append(exps, 
exp_alias_or_copy(sql, tname, exp_name(e), rel, e));
+                               }
+
                        }
                        if (exps && list_length(exps))
                                return exps;
@@ -198,8 +224,10 @@ rel_table_optname(mvc *sql, sql_rel *sq,
                        for (; ne; ne = ne->next) {
                                sql_exp *e = ne->data;
 
+                               /*
                                if (exp_name(e) && exps_bind_column2(l, tname, 
exp_name(e)))
                                        return sql_error(sql, ERR_AMBIGUOUS, 
SQLSTATE(42000) "SELECT: Duplicate column name '%s.%s'", tname, exp_name(e));
+                                       */
                                noninternexp_setname(sql->sa, e, tname, NULL );
                                if (!is_intern(e))
                                        set_basecol(e);
@@ -813,14 +841,25 @@ table_ref(sql_query *query, sql_rel *rel
                }
                if (temp_table && !t) {
                        node *n;
-                       list *exps = rel_projections(sql, temp_table, NULL, 1, 
1);
-
-                       temp_table = rel_project(sql->sa, temp_table, exps);
-                       for (n = exps->h; n; n = n->next) {
+                       int needed = !is_simple_project(temp_table->op);
+
+                       for (n = temp_table->exps->h; n && !needed; n = 
n->next) {
                                sql_exp *e = n->data;
 
-                               noninternexp_setname(sql->sa, e, tname, NULL);
-                               set_basecol(e);
+                               if (!exp_relname(e) || strcmp(exp_relname(e), 
tname) != 0)
+                                       needed = 1;
+                       }
+
+                       if (needed) {
+                               list *exps = rel_projections(sql, temp_table, 
NULL, 1, 1);
+
+                               temp_table = rel_project(sql->sa, temp_table, 
exps);
+                               for (n = exps->h; n; n = n->next) {
+                                       sql_exp *e = n->data;
+
+                                       noninternexp_setname(sql->sa, e, tname, 
NULL);
+                                       set_basecol(e);
+                               }
                        }
                        return temp_table;
                } else if (isView(t)) {
diff --git 
a/sql/test/BugTracker-2013/Tests/duplicate_column_name.Bug-3349.stable.err 
b/sql/test/BugTracker-2013/Tests/duplicate_column_name.Bug-3349.stable.err
--- a/sql/test/BugTracker-2013/Tests/duplicate_column_name.Bug-3349.stable.err
+++ b/sql/test/BugTracker-2013/Tests/duplicate_column_name.Bug-3349.stable.err
@@ -28,16 +28,6 @@ stderr of test 'duplicate_column_name.Bu
 # 10:39:09 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-28423" "--port=32749"
 # 10:39:09 >  
 
-MAPI  = (monetdb) /var/tmp/mtest-28423/.s.monetdb.32749
-QUERY = SELECT *
-        FROM (
-                   SELECT a1.x, a1.y, a2.x, a2.y
-                   FROM ( SELECT * FROM test) AS a1 JOIN 
-                        ( SELECT * FROM test) AS a2 
-                       ON a1.x = a2.x
-               ) AS t;
-ERROR = !SELECT: Duplicate column name 't.x'
-CODE  = 42000
 
 # 10:39:09 >  
 # 10:39:09 >  "Done."
diff --git 
a/sql/test/BugTracker-2013/Tests/duplicate_column_name.Bug-3349.stable.out 
b/sql/test/BugTracker-2013/Tests/duplicate_column_name.Bug-3349.stable.out
--- a/sql/test/BugTracker-2013/Tests/duplicate_column_name.Bug-3349.stable.out
+++ b/sql/test/BugTracker-2013/Tests/duplicate_column_name.Bug-3349.stable.out
@@ -31,6 +31,21 @@ stdout of test 'duplicate_column_name.Bu
 [ 1    ]
 #SELECT *
 #FROM (
+#          SELECT a1.x, a1.y, a2.x, a2.y
+#          FROM ( SELECT * FROM test) AS a1 JOIN 
+#               ( SELECT * FROM test) AS a2 
+#              ON a1.x = a2.x
+#      ) AS t;
+% sys.t,       sys.t,  sys.t,  sys.t # table_name
+% x,   y,      x,      y # name
+% int, int,    int,    int # type
+% 1,   1,      1,      1 # length
+[ 1,   1,      1,      1       ]
+[ 1,   1,      1,      1       ]
+[ 1,   2,      1,      2       ]
+[ 1,   2,      1,      2       ]
+#SELECT *
+#FROM (
 #      SELECT a1.x AS x1, a1.y AS y1, a2.x AS x2, a2.y AS y2
 #      FROM ( SELECT * FROM test) AS a1 JOIN 
 #           ( SELECT * FROM test) AS a2 
diff --git 
a/sql/test/BugTracker-2019/Tests/disallow_duplicate_column_aliases.Bug-6723.stable.err
 
b/sql/test/BugTracker-2019/Tests/disallow_duplicate_column_aliases.Bug-6723.stable.err
--- 
a/sql/test/BugTracker-2019/Tests/disallow_duplicate_column_aliases.Bug-6723.stable.err
+++ 
b/sql/test/BugTracker-2019/Tests/disallow_duplicate_column_aliases.Bug-6723.stable.err
@@ -25,30 +25,6 @@ stderr of test 'disallow_duplicate_colum
 # 13:22:43 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-15745" "--port=33477"
 # 13:22:43 >  
 
-MAPI  = (monetdb) /var/tmp/mtest-15745/.s.monetdb.33477
-QUERY = select 1 as T, 2 as T;
-ERROR = !SELECT: Duplicate column name or alias 'T' not allowed
-CODE  = 42000
-MAPI  = (monetdb) /var/tmp/mtest-15745/.s.monetdb.33477
-QUERY = select a.* from (select 1 as T, 2 as T) a;
-ERROR = !SELECT: Duplicate column name or alias 'T' not allowed
-CODE  = 42000
-MAPI  = (monetdb) /var/tmp/mtest-15745/.s.monetdb.33477
-QUERY = with wa as (select 1 as T, 2 as T) select wa.* from wa;
-ERROR = !SELECT: Duplicate column name or alias 'T' not allowed
-CODE  = 42000
-MAPI  = (monetdb) /var/tmp/mtest-15745/.s.monetdb.33477
-QUERY = select 1,2,3 as "L2";
-ERROR = !SELECT: Duplicate column name or alias 'L2' not allowed
-CODE  = 42000
-MAPI  = (monetdb) /var/tmp/mtest-15745/.s.monetdb.33477
-QUERY = select a.* from (select 1,2,3 as "L2") a;
-ERROR = !SELECT: Duplicate column name or alias 'L2' not allowed
-CODE  = 42000
-MAPI  = (monetdb) /var/tmp/mtest-15745/.s.monetdb.33477
-QUERY = with wa as (select 1,2,3 as "L2") select wa.* from wa;
-ERROR = !SELECT: Duplicate column name or alias 'L2' not allowed
-CODE  = 42000
 
 # 13:22:43 >  
 # 13:22:43 >  "Done."
diff --git 
a/sql/test/BugTracker-2019/Tests/disallow_duplicate_column_aliases.Bug-6723.stable.out
 
b/sql/test/BugTracker-2019/Tests/disallow_duplicate_column_aliases.Bug-6723.stable.out
--- 
a/sql/test/BugTracker-2019/Tests/disallow_duplicate_column_aliases.Bug-6723.stable.out
+++ 
b/sql/test/BugTracker-2019/Tests/disallow_duplicate_column_aliases.Bug-6723.stable.out
@@ -22,6 +22,42 @@ stdout of test 'disallow_duplicate_colum
 # 13:22:43 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-15745" "--port=33477"
 # 13:22:43 >  
 
+#select 1 as T, 2 as T;
+% .,   . # table_name
+% t,   t # name
+% tinyint,     tinyint # type
+% 1,   1 # length
+[ 1,   2       ]
+#select a.* from (select 1 as T, 2 as T) a;
+% .a,  .a # table_name
+% t,   t # name
+% tinyint,     tinyint # type
+% 1,   1 # length
+[ 1,   2       ]
+#with wa as (select 1 as T, 2 as T) select wa.* from wa;
+% .wa, .wa # table_name
+% t,   t # name
+% tinyint,     tinyint # type
+% 1,   1 # length
+[ 1,   2       ]
+#select 1,2,3 as "L2";
+% .,   .,      . # table_name
+% single_value,        single_value,   L2 # name
+% tinyint,     tinyint,        tinyint # type
+% 1,   1,      1 # length
+[ 1,   2,      3       ]
+#select a.* from (select 1,2,3 as "L2") a;
+% .%1, .%2,    .a # table_name
+% %1,  %2,     L2 # name
+% tinyint,     tinyint,        tinyint # type
+% 1,   1,      1 # length
+[ 1,   2,      3       ]
+#with wa as (select 1,2,3 as "L2") select wa.* from wa;
+% .%1, .%2,    .wa # table_name
+% %1,  %2,     L2 # name
+% tinyint,     tinyint,        tinyint # type
+% 1,   1,      1 # length
+[ 1,   2,      3       ]
 
 # 13:22:43 >  
 # 13:22:43 >  "Done."
diff --git a/sql/test/analytics/Tests/analytics03.stable.out 
b/sql/test/analytics/Tests/analytics03.stable.out
--- a/sql/test/analytics/Tests/analytics03.stable.out
+++ b/sql/test/analytics/Tests/analytics03.stable.out
@@ -34,8 +34,8 @@ stdout of test 'analytics03` in director
 #       cast(sum(aa) over (order by aa groups unbounded preceding) as bigint),
 #       cast(sum(aa) over (partition by bb order by bb rows unbounded 
preceding) as bigint),
 #       cast(sum(aa) over (partition by bb order by bb range unbounded 
preceding) as bigint),
-% sys.L5,      sys.L12,        sys.L17,        sys.L24,        sys.L31,        
sys.L36,        sys.L43,        sys.L50 # table_name
-% L5,  L12,    L17,    L24,    L31,    L36,    L43,    L50 # name
+% sys.%1,      sys.%2, sys.%3, sys.%4, sys.%5, sys.%6, sys.%7, sys.%10 # 
table_name
+% %1,  %2,     %3,     %4,     %5,     %6,     %7,     %10 # name
 % bigint,      bigint, bigint, bigint, bigint, bigint, bigint, bigint # type
 % 2,   2,      2,      2,      2,      2,      2,      2 # length
 [ 1,   20,     1,      4,      4,      1,      6,      6       ]
@@ -45,17 +45,17 @@ stdout of test 'analytics03` in director
 [ 8,   20,     3,      4,      4,      2,      14,     14      ]
 [ 9,   20,     4,      4,      4,      3,      14,     14      ]
 [ 11,  20,     8,      10,     10,     5,      14,     14      ]
-[ 20,  20,     10,     10,     10,     7,      14,     14      ]
-[ 14,  20,     16,     16,     16,     10,     14,     14      ]
-[ 18,  20,     20,     20,     20,     14,     14,     14      ]
+[ 13,  20,     10,     10,     10,     7,      14,     14      ]
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to