Changeset: 1fc3c8aa1f5c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1fc3c8aa1f5c
Added Files:
        sql/test/BugTracker-2021/Tests/distinct-with-orderby.Bug-7202.test
Modified Files:
        sql/server/rel_select.c
        sql/test/BugTracker-2021/Tests/All
        sql/test/analytics/Tests/analytics10.test
        sql/test/emptydb/Tests/check.SQL.py
        sql/test/miscellaneous/Tests/groupby_expressions.test
        sql/test/prepare/Tests/sqlancer_prepare.stable.err
        sql/test/prepare/Tests/sqlancer_prepare.stable.err.int128
Branch: Jan2022
Log Message:

Added test and fix for bug #7202 With distinct the ordering columns must match 
the projection list, otherwise it is not computable


diffs (188 lines):

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
@@ -4380,7 +4380,7 @@ rel_partition_groupings(sql_query *query
 /* find selection expressions matching the order by column expression */
 /* complex columns only */
 static sql_exp *
-rel_order_by_column_exp(sql_query *query, sql_rel **R, symbol *column_r, int f)
+rel_order_by_column_exp(sql_query *query, sql_rel **R, symbol *column_r, int 
needs_distinct, int f)
 {
        mvc *sql = query->sql;
        sql_rel *r = *R, *p = NULL;
@@ -4390,7 +4390,7 @@ rel_order_by_column_exp(sql_query *query
        if (!r)
                return e;
 
-       if (r && is_simple_project(r->op) && is_processed(r)) {
+       if (is_simple_project(r->op) && is_processed(r)) {
                p = r;
                r = r->l;
        }
@@ -4405,6 +4405,8 @@ rel_order_by_column_exp(sql_query *query
                if (is_project(p->op) && (found = exps_any_match(p->exps, e))) 
{ /* if one of the projections matches, return a reference to it */
                        e = exp_ref(sql, found);
                } else {
+                       if (needs_distinct)
+                               return sql_error(sql, 02, SQLSTATE(42000) 
"SELECT: with DISTINCT ORDER BY expressions must appear in select list");
                        e = rel_project_add_exp(sql, p, e);
                        for (node *n = p->exps->h ; n ; n = n->next) {
                                sql_exp *ee = n->data;
@@ -4422,6 +4424,8 @@ rel_order_by_column_exp(sql_query *query
                sql_exp *found = exps_find_exp(r->exps, e);
 
                if (!found) {
+                       if (needs_distinct)
+                               return sql_error(sql, 02, SQLSTATE(42000) 
"SELECT: with DISTINCT ORDER BY expressions must appear in select list");
                        append(r->exps, e);
                } else {
                        e = found;
@@ -4446,7 +4450,7 @@ simple_selection(symbol *sq)
 }
 
 static list *
-rel_order_by(sql_query *query, sql_rel **R, symbol *orderby, int f)
+rel_order_by(sql_query *query, sql_rel **R, symbol *orderby, int 
needs_distinct, int f)
 {
        mvc *sql = query->sql;
        sql_rel *rel = *R, *or = rel; /* the order by relation */
@@ -4504,6 +4508,8 @@ rel_order_by(sql_query *query, sql_rel *
                                        sql_exp *found = 
exps_find_exp(rel->exps, e);
 
                                        if (!found) {
+                                               if (needs_distinct)
+                                                       return sql_error(sql, 
02, SQLSTATE(42000) "SELECT: with DISTINCT ORDER BY expressions must appear in 
select list");
                                                append(rel->exps, e);
                                        } else {
                                                e = found;
@@ -4517,8 +4523,7 @@ rel_order_by(sql_query *query, sql_rel *
                                sql->session->status = 0;
                                sql->errstr[0] = '\0';
 
-                               if (!e)
-                                       e = rel_order_by_column_exp(query, 
&rel, col, sql_sel | sql_orderby | (f & sql_group_totals));
+                               e = rel_order_by_column_exp(query, &rel, col, 
needs_distinct, sql_sel | sql_orderby | (f & sql_group_totals));
                        }
                        if (!e)
                                return NULL;
@@ -4794,7 +4799,7 @@ rel_rankop(sql_query *query, sql_rel **r
 
        /* Order By */
        if (order_by_clause) {
-               obe = rel_order_by(query, &p, order_by_clause, nf | sql_window);
+               obe = rel_order_by(query, &p, order_by_clause, 0, nf | 
sql_window);
                if (!obe)
                        return NULL;
        }
@@ -5484,7 +5489,7 @@ rel_having_limits_nodes(sql_query *query
                }
                rel = rel_orderby(sql, rel);
                set_processed(rel);
-               obe = rel_order_by(query, &rel, sn->orderby, sql_orderby | 
group_totals);
+               obe = rel_order_by(query, &rel, sn->orderby, sn->distinct != 
NULL, sql_orderby | group_totals);
                if (!obe)
                        return NULL;
                rel->r = obe;
diff --git a/sql/test/BugTracker-2021/Tests/All 
b/sql/test/BugTracker-2021/Tests/All
--- a/sql/test/BugTracker-2021/Tests/All
+++ b/sql/test/BugTracker-2021/Tests/All
@@ -35,3 +35,4 @@ grouping-sets-aliases.Bug-7185
 copyinto-copyfrom.Bug-7186
 concurrent-add-column.Bug-7196
 unique-idx.Bug-7201
+distinct-with-orderby.Bug-7202
diff --git a/sql/test/BugTracker-2021/Tests/distinct-with-orderby.Bug-7202.test 
b/sql/test/BugTracker-2021/Tests/distinct-with-orderby.Bug-7202.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2021/Tests/distinct-with-orderby.Bug-7202.test
@@ -0,0 +1,20 @@
+statement ok
+START TRANSACTION
+
+statement ok
+CREATE TABLE T (t1 int, t2 int)
+
+statement ok rowcount 2
+INSERT INTO t VALUES (1, 1), (1, 2)
+
+query I nosort
+SELECT DISTINCT t1 FROM T ORDER BY t1
+----
+1
+
+statement error 42000!SELECT: with DISTINCT ORDER BY expressions must appear 
in select list
+SELECT DISTINCT t1 FROM T ORDER BY t1, t2
+
+statement ok
+ROLLBACK
+
diff --git a/sql/test/analytics/Tests/analytics10.test 
b/sql/test/analytics/Tests/analytics10.test
--- a/sql/test/analytics/Tests/analytics10.test
+++ b/sql/test/analytics/Tests/analytics10.test
@@ -959,7 +959,7 @@ query I rowsort
 SELECT
     DISTINCT CAST(SUM(TotalSales) as BIGINT) AS TotalSales
 FROM tbl_ProductSales GROUP BY ROLLUP (Product_Category, ColID)
-ORDER BY SUM(TotalSales)
+ORDER BY CAST(SUM(TotalSales) as BIGINT)
 ----
 100
 1200
diff --git a/sql/test/emptydb/Tests/check.SQL.py 
b/sql/test/emptydb/Tests/check.SQL.py
--- a/sql/test/emptydb/Tests/check.SQL.py
+++ b/sql/test/emptydb/Tests/check.SQL.py
@@ -387,7 +387,7 @@ with process.client('sql', format='csv',
 
     clt.stdin.write("select E'\\\\dSv ' || s.name || '.' || t.name from 
sys._tables t, sys.schemas s where t.schema_id = s.id and t.query is not null 
order by s.name, t.name;\n")
 
-    clt.stdin.write("select distinct E'\\\\dSf ' || s.name || '.\"' || f.name 
|| '\"' from sys.functions f, sys.schemas s where f.language between 1 and 2 
and f.schema_id = s.id and s.name = 'sys' order by s.name, f.name;\n")
+    clt.stdin.write("select proj from (select distinct E'\\\\dSf ' || s.name 
|| '.\"' || f.name || '\"' as proj from sys.functions f, sys.schemas s where 
f.language between 1 and 2 and f.schema_id = s.id and s.name = 'sys') as 
proj(proj) order by proj;\n")
 
     out, err = clt.communicate()
     out = re.sub('^"(.*)"$', r'\1', out, flags=re.MULTILINE).replace('"\n', 
'\n').replace('\n"', '\n').replace('""', '"').replace(r'\\', '\\')
diff --git a/sql/test/miscellaneous/Tests/groupby_expressions.test 
b/sql/test/miscellaneous/Tests/groupby_expressions.test
--- a/sql/test/miscellaneous/Tests/groupby_expressions.test
+++ b/sql/test/miscellaneous/Tests/groupby_expressions.test
@@ -232,15 +232,10 @@ select cast(sum("aa"+"bb") as bigint) fr
 ----
 10
 
-query II rowsort
-select distinct "aa", "bb" from "groupings" order by "aa" > "bb"
+query T rowsort
+select distinct "aa" > "bb" from "groupings" order by "aa" > "bb"
 ----
-1
-1
-1
-3
-2
-2
+False
 
 query I rowsort
 select count(*) from "groupings" having count("aa") <= count("aa" + "bb") 
order by sum("aa") > sum("bb")
diff --git a/sql/test/prepare/Tests/sqlancer_prepare.stable.err 
b/sql/test/prepare/Tests/sqlancer_prepare.stable.err
--- a/sql/test/prepare/Tests/sqlancer_prepare.stable.err
+++ b/sql/test/prepare/Tests/sqlancer_prepare.stable.err
@@ -22,7 +22,7 @@ MAPI  = (monetdb) /var/tmp/mtest-363257/
 QUERY = prepare with cte0(c0) as (select 1), cte1(c0,c1,c2) as (select 
distinct 1, 2, false)
         select distinct least('y', (values (''), (''))), 1, (select ? from 
(select 1) as l1v0(x))
         from cte0 as l0cte0, cte1 as l0cte1 order by l0cte0.c0 desc nulls 
last, l0cte1.c2 desc nulls first; -- ? can't be defined, so error
-ERROR = !Could not determine type for argument number 1
+ERROR = !SELECT: with DISTINCT ORDER BY expressions must appear in select list
 CODE  = 42000
 MAPI  = (monetdb) /var/tmp/mtest-185783/.s.monetdb.32587
 QUERY = prepare with cte0(c0) as (select 2) select 1 <> all(select 2 from 
(values (1),(2)) as t1) from cte0 as l0cte0 group by ?; --error, cannot have a 
parameter for group by column
diff --git a/sql/test/prepare/Tests/sqlancer_prepare.stable.err.int128 
b/sql/test/prepare/Tests/sqlancer_prepare.stable.err.int128
--- a/sql/test/prepare/Tests/sqlancer_prepare.stable.err.int128
+++ b/sql/test/prepare/Tests/sqlancer_prepare.stable.err.int128
@@ -26,7 +26,7 @@ MAPI  = (monetdb) /var/tmp/mtest-363257/
 QUERY = prepare with cte0(c0) as (select 1), cte1(c0,c1,c2) as (select 
distinct 1, 2, false)
         select distinct least('y', (values (''), (''))), 1, (select ? from 
(select 1) as l1v0(x))
         from cte0 as l0cte0, cte1 as l0cte1 order by l0cte0.c0 desc nulls 
last, l0cte1.c2 desc nulls first; -- ? can't be defined, so error
-ERROR = !Could not determine type for argument number 1
+ERROR = !SELECT: with DISTINCT ORDER BY expressions must appear in select list
 CODE  = 42000
 MAPI  = (monetdb) /var/tmp/mtest-185783/.s.monetdb.32587
 QUERY = prepare with cte0(c0) as (select 2) select 1 <> all(select 2 from 
(values (1),(2)) as t1) from cte0 as l0cte0 group by ?; --error, cannot have a 
parameter for group by column
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to