Changeset: 648228314846 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=648228314846
Modified Files:
        sql/server/rel_propagate.c
        sql/server/rel_psm.c
        sql/server/rel_rel.h
        sql/server/rel_schema.c
        sql/server/rel_select.c
        sql/server/rel_select.h
        sql/server/rel_updates.c
        sql/test/BugTracker-2010/Tests/new-readonly-db.Bug-2695.stable.err
        sql/test/miscellaneous/Tests/simple_selects.sql
        sql/test/miscellaneous/Tests/simple_selects.stable.err
        sql/test/subquery/Tests/subquery4.sql
        sql/test/subquery/Tests/subquery4.stable.err
Branch: pushdown
Log Message:

merged


diffs (truncated from 319 to 300 lines):

diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c
--- a/sql/server/rel_propagate.c
+++ b/sql/server/rel_propagate.c
@@ -160,7 +160,7 @@ generate_partition_limits(sql_query *que
                return exp_atom(sql->sa, amax);
        } else {
                exp_kind ek = {type_value, card_value, FALSE};
-       sql_exp *e = rel_value_exp2(query, r, s, sql_sel | sql_values, ek);
+               sql_exp *e = rel_value_exp2(query, r, s, sql_sel | sql_values, 
ek);
 
                if (!e)
                        return NULL;
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -242,8 +242,9 @@ rel_psm_while_do( sql_query *query, sql_
                list *whilestmts;
                dnode *n = w;
                sql_rel *rel = NULL;
+               exp_kind ek = {type_value, card_value, FALSE};
 
-               cond = rel_logical_value_exp(query, &rel, n->data.sym, 
sql_sel); 
+               cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel, 
ek); 
                n = n->next;
                whilestmts = sequential_block(query, res, restypelist, 
n->data.lval, n->next->data.sval, is_func);
 
@@ -280,8 +281,9 @@ psm_if_then_else( sql_query *query, sql_
                list *ifstmts, *elsestmts;
                dnode *n = elseif->data.sym->data.lval->h;
                sql_rel *rel = NULL;
+               exp_kind ek = {type_value, card_value, FALSE};
 
-               cond = rel_logical_value_exp(query, &rel, n->data.sym, 
sql_sel); 
+               cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel, 
ek); 
                n = n->next;
                ifstmts = sequential_block(query, res, restypelist, 
n->data.lval, NULL, is_func);
                n = n->next;
@@ -319,8 +321,9 @@ rel_psm_if_then_else( sql_query *query, 
                list *ifstmts, *elsestmts;
                dnode *n = elseif;
                sql_rel *rel = NULL;
+               exp_kind ek = {type_value, card_value, FALSE};
 
-               cond = rel_logical_value_exp(query, &rel, n->data.sym, 
sql_sel); 
+               cond = rel_logical_value_exp(query, &rel, n->data.sym, sql_sel, 
ek); 
                n = n->next;
                ifstmts = sequential_block(query, res, restypelist, 
n->data.lval, NULL, is_func);
                n = n->next;
@@ -421,7 +424,8 @@ rel_psm_case( sql_query *query, sql_subt
                while(n) {
                        dnode *m = n->data.sym->data.lval->h;
                        sql_rel *rel = NULL;
-                       sql_exp *cond = rel_logical_value_exp(query, &rel, 
m->data.sym, sql_sel);
+                       exp_kind ek = {type_value, card_value, FALSE};
+                       sql_exp *cond = rel_logical_value_exp(query, &rel, 
m->data.sym, sql_sel, ek);
                        list *if_stmts = NULL;
                        sql_exp *case_stmt = NULL;
 
@@ -820,6 +824,9 @@ rel_create_func(sql_query *query, dlist 
                return sql_error(sql, 02, SQLSTATE(3F000) "CREATE %s: no such 
schema '%s'", F, sname);
 
        type_list = create_type_list(sql, params, 1);
+       if ((type == F_FUNC || type == F_AGGR) && sql_bind_func_(sql->sa, s, 
fname, type_list, (type == F_FUNC) ? F_AGGR : F_FUNC))
+               return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s: there's 
%s with the name '%s' and the same parameters, which causes ambiguous calls", 
F, (type == F_FUNC) ? "an aggregate" : "a function", fname);
+
        if ((sf = sql_bind_func_(sql->sa, s, fname, type_list, type)) != NULL 
&& create) {
                if (replace) {
                        sql_func *func = sf->func;
diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -449,7 +449,8 @@ column_option(
                char *err = NULL, *r;
 
                if (sym->token == SQL_COLUMN || sym->token == SQL_IDENT) {
-                       sql_exp *e = rel_logical_value_exp(query, NULL, sym, 
sql_sel);
+                       exp_kind ek = {type_value, card_value, FALSE};
+                       sql_exp *e = rel_logical_value_exp(query, NULL, sym, 
sql_sel, ek);
 
                        if (e && is_atom(e->type)) {
                                atom *a = exp_value(sql, e, sql->args, 
sql->argc);
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
@@ -637,7 +637,7 @@ rel_named_table_function(sql_query *quer
                l = l->next; /* skip distinct */
        if (l->next) { /* table call with subquery */
                if (l->next->type == type_symbol || l->next->type == type_list) 
{
-                       exp_kind iek = {type_value, card_column, TRUE};
+                       exp_kind iek = {type_value, card_set, TRUE};
                        list *exps = sa_list(sql->sa);
                        int count = 0;
 
@@ -2101,10 +2101,9 @@ rel_in_exp(sql_query *query, sql_rel *re
 }
 
 sql_exp *
-rel_logical_value_exp(sql_query *query, sql_rel **rel, symbol *sc, int f)
+rel_logical_value_exp(sql_query *query, sql_rel **rel, symbol *sc, int f, 
exp_kind ek)
 {
        mvc *sql = query->sql;
-       exp_kind ek = {type_value, card_column, FALSE};
 
        if (!sc)
                return NULL;
@@ -2119,8 +2118,8 @@ rel_logical_value_exp(sql_query *query, 
                symbol *lo = sc->data.lval->h->data.sym;
                symbol *ro = sc->data.lval->h->next->data.sym;
 
-               sql_exp *ls = rel_logical_value_exp(query, rel, lo, f);
-               sql_exp *rs = rel_logical_value_exp(query, rel, ro, f);
+               sql_exp *ls = rel_logical_value_exp(query, rel, lo, f, ek);
+               sql_exp *rs = rel_logical_value_exp(query, rel, ro, f, ek);
 
                if (!ls || !rs)
                        return NULL;
@@ -2201,7 +2200,7 @@ rel_logical_value_exp(sql_query *query, 
                        n->next->next->next = NULL; /* remove quantifier */
                        dl->h = n->next->next;
                        n->next->next = NULL; /* (remove comparison) moved 
righthand side */ 
-                       return rel_logical_value_exp(query, rel, sc, f);
+                       return rel_logical_value_exp(query, rel, sc, f, ek);
                }       
                /* <> ANY -> NOT (= ALL) */
                if (quantifier == 1 && cmp_type == cmp_notequal) {
@@ -2350,7 +2349,7 @@ rel_logical_value_exp(sql_query *query, 
                return le;
        }
        case SQL_NOT: {
-               sql_exp *le = rel_logical_value_exp(query, rel, sc->data.sym, 
f);
+               sql_exp *le = rel_logical_value_exp(query, rel, sc->data.sym, 
f, ek);
 
                if (!le)
                        return le;
@@ -2380,7 +2379,7 @@ rel_logical_value_exp(sql_query *query, 
                        return NULL;
                if (ek.card <= card_set && is_project(sq->op) && 
list_length(sq->exps) > 1)
                        return sql_error(sql, 02, SQLSTATE(42000) "SELECT: 
subquery must return only one column");
-               if (ek.card < card_set && sq->card >= CARD_MULTI && 
is_sql_sel(f) && (*rel && is_basetable((*rel)->op)))
+               if (ek.card < card_set && sq->card >= CARD_MULTI && 
(is_sql_sel(f) | is_sql_where(f)) && rel && (!*rel || is_basetable((*rel)->op)))
                        sq = rel_zero_or_one(sql, sq, ek);
                return exp_rel(sql, sq);
        }
@@ -3730,7 +3729,7 @@ rel_case(sql_query *query, sql_rel **rel
                                        return NULL;
                                cond = rel_binop_(sql, rel ? *rel : NULL, l, r, 
NULL, "=", card_value);
                        } else {
-                               cond = rel_logical_value_exp(query, rel, 
when->h->data.sym, f);
+                               cond = rel_logical_value_exp(query, rel, 
when->h->data.sym, f, ek);
                        }
                        result = rel_value_exp(query, rel, 
when->h->next->data.sym, f, ek);
                }
@@ -3772,7 +3771,7 @@ rel_case(sql_query *query, sql_rel **rel
                                        return NULL;
                                cond = rel_binop_(sql, rel ? *rel : NULL, l, r, 
NULL, "=", card_value);
                        } else {
-                               cond = rel_logical_value_exp(query, rel, 
when->h->data.sym, f);
+                               cond = rel_logical_value_exp(query, rel, 
when->h->data.sym, f, ek);
                        }
                        result = rel_value_exp(query, rel, 
when->h->next->data.sym, f, ek);
                }
@@ -5094,7 +5093,7 @@ rel_value_exp2(sql_query *query, sql_rel
        case SQL_XMLTEXT:
                return rel_xml(query, rel, se, f, ek);
        default:
-               return rel_logical_value_exp(query, rel, se, f);
+               return rel_logical_value_exp(query, rel, se, f, ek);
        }
 }
 
diff --git a/sql/server/rel_select.h b/sql/server/rel_select.h
--- a/sql/server/rel_select.h
+++ b/sql/server/rel_select.h
@@ -17,7 +17,7 @@ extern sql_rel *rel_selects(sql_query *q
 extern sql_rel *schema_selects(sql_query *query, sql_schema *s, symbol *sym);
 extern sql_rel * rel_subquery(sql_query *query, sql_rel *rel, symbol *sq, 
exp_kind ek);
 extern sql_rel * rel_logical_exp(sql_query *query, sql_rel *rel, symbol *sc, 
int f);
-extern sql_exp * rel_logical_value_exp(sql_query *query, sql_rel **rel, symbol 
*sc, int f);
+extern sql_exp * rel_logical_value_exp(sql_query *query, sql_rel **rel, symbol 
*sc, int f, exp_kind ek);
 
 extern sql_exp *rel_column_exp(sql_query *query, sql_rel **rel, symbol 
*column_e, int f);
 extern sql_exp * rel_value_exp(sql_query *query, sql_rel **rel, symbol *se, 
int f, exp_kind ek);
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
@@ -977,31 +977,19 @@ update_generate_assignments(sql_query *q
                                        return sql_error(sql, 02, 
SQLSTATE(42000) "%s: column '%s' has no valid default value", action, 
col->base.name);
                                }
                        } else if (single) {
-                               v = rel_value_exp(query, &rel_val, a, sql_sel | 
sql_update_set, ek);
+                               v = rel_value_exp(query, &r, a, sql_sel | 
sql_update_set, ek);
                                outer = 1;
                        } else {
                                rel_val = rel_subquery(query, NULL, a, ek);
                        }
-                       if ((single && !v) || (!single && !rel_val)) {
+                       if (!single && !rel_val && r) {
+                               outer = 1;
                                sql->errstr[0] = 0;
                                sql->session->status = status;
-                               assert(!rel_val);
-                               outer = 1;
-                               if (single) {
-                                       v = rel_value_exp(query, &r, a, sql_sel 
| sql_update_set, ek);
-                               } else if (!rel_val && r) {
-                                       query_push_outer(query, r, sql_sel | 
sql_update_set);
-                                       rel_val = rel_subquery(query, NULL, a, 
ek);
-                                       r = query_pop_outer(query);
-                                       if (/* DISABLES CODE */ (0) && r) {
-                                               list *val_exps = 
rel_projections(sql, r->r, NULL, 0, 1);
-
-                                               r = rel_project(sql->sa, r, 
rel_projections(sql, r, NULL, 1, 1));
-                                               if (r)
-                                                       list_merge(r->exps, 
val_exps, (fdup)NULL);
-                                               reset_processed(r);
-                                       }
-                               }
+                               /* TODO put in else above */
+                               query_push_outer(query, r, sql_sel);
+                               rel_val = rel_subquery(query, NULL, a, ek);
+                               r = query_pop_outer(query);
                        }
                        if ((single && !v) || (!single && !rel_val)) {
                                rel_destroy(r);
diff --git a/sql/test/BugTracker-2010/Tests/new-readonly-db.Bug-2695.stable.err 
b/sql/test/BugTracker-2010/Tests/new-readonly-db.Bug-2695.stable.err
--- a/sql/test/BugTracker-2010/Tests/new-readonly-db.Bug-2695.stable.err
+++ b/sql/test/BugTracker-2010/Tests/new-readonly-db.Bug-2695.stable.err
@@ -64,6 +64,8 @@ stderr of test 'new-readonly-db.Bug-2695
 # cmdline opt  mal_listing = 2
 # cmdline opt  gdk_dbname = mTests_src_test_BugTracker-2010-2695
 # cmdline opt  gdk_readonly = yes
+2020-03-11 14:03:29 ../../../src/sql/server/sql_mvc.c:146             mvc_init 
          M_CRITICAL SQL_TRANS            main thread          # Unable to 
create system tables
+2020-03-11 14:03:29 ../../../../src/sql/backends/monet5/sql_scenario.c:139     
      SQLprelude           M_CRITICAL SQL_PARSER           main thread          
# Fatal error during initialization: SQLException:SQLinit:42000!Catalogue 
initialization failed
 
 # 12:51:24 >  
 # 12:51:24 >  Done.
diff --git a/sql/test/miscellaneous/Tests/simple_selects.sql 
b/sql/test/miscellaneous/Tests/simple_selects.sql
--- a/sql/test/miscellaneous/Tests/simple_selects.sql
+++ b/sql/test/miscellaneous/Tests/simple_selects.sql
@@ -70,6 +70,9 @@ select substring('abc' from 1 for null);
 select substring('abc' from null for 2);
 select substring('abc' from null for null);
 
+CREATE FUNCTION count(input INT) RETURNS INT BEGIN RETURN SELECT 1; END; 
--error, ambiguous, there's an aggregate named count with the same parameters
+CREATE AGGREGATE sin(input REAL) RETURNS REAL EXTERNAL NAME "mmath"."sin"; 
--error, ambiguous, there's a function named sin with the same parameters
+
 select length(myblob), octet_length(myblob), length(mystr), 
octet_length(mystr) 
 from (values (cast(null as blob), cast(null as char(32)))) as my(myblob, 
mystr);
 select md5(null);
diff --git a/sql/test/miscellaneous/Tests/simple_selects.stable.err 
b/sql/test/miscellaneous/Tests/simple_selects.stable.err
--- a/sql/test/miscellaneous/Tests/simple_selects.stable.err
+++ b/sql/test/miscellaneous/Tests/simple_selects.stable.err
@@ -117,6 +117,14 @@ MAPI  = (monetdb) /var/tmp/mtest-316445/
 QUERY = select cast(true as interval month); --error, not possible
 ERROR = !types boolean(1,0) and month_interval(3,0) are not equal
 CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-416559/.s.monetdb.32222
+QUERY = CREATE FUNCTION count(input INT) RETURNS INT BEGIN RETURN SELECT 1; 
END; --error, ambiguous, there's an aggregate named count with the same 
parameters
+ERROR = !CREATE FUNCTION: there's an aggregate with the name 'count' and the 
same parameters, which causes ambiguous calls
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-416559/.s.monetdb.32222
+QUERY = CREATE AGGREGATE sin(input REAL) RETURNS REAL EXTERNAL NAME 
"mmath"."sin"; --error, ambiguous, there's a function named sin with the same 
parameters
+ERROR = !CREATE AGGREGATE: there's a function with the name 'sin' and the same 
parameters, which causes ambiguous calls
+CODE  = 42000
 
 # 17:31:38 >  
 # 17:31:38 >  "Done."
diff --git a/sql/test/subquery/Tests/subquery4.sql 
b/sql/test/subquery/Tests/subquery4.sql
--- a/sql/test/subquery/Tests/subquery4.sql
+++ b/sql/test/subquery/Tests/subquery4.sql
@@ -141,6 +141,11 @@ DELETE FROM another_T WHERE col1 = AVG(c
 DELETE FROM another_T WHERE col7 = (SELECT SUM(col3) OVER ()); --0 rows 
affected
 DELETE FROM another_T WHERE col8 = (SELECT MAX(col6 + ColID) OVER () FROM 
tbl_ProductSales); --error, more than one row returned by a subquery used as an 
expression
 
+UPDATE another_T SET col5 = (SELECT 1 UNION ALL SELECT 2); --error, more than 
one row returned by a subquery used as an expression
+UPDATE another_T SET col5 = 1 WHERE col5 = (SELECT 1 UNION ALL SELECT 2); 
--error, more than one row returned by a subquery used as an expression
+DELETE FROM another_T WHERE col1 = (SELECT 1 UNION ALL SELECT 2); --error, 
more than one row returned by a subquery used as an expression
+INSERT INTO another_T VALUES ((SELECT 1 UNION ALL SELECT 2),2,3,4,5,6,7,8); 
--error, more than one row returned by a subquery used as an expression
+
 DECLARE x int;
 SET x = MAX(1) over (); --error, not allowed
 DECLARE y int;
@@ -149,7 +154,7 @@ SET y = MIN(1); --error, not allowed
 INSERT INTO another_T VALUES (SUM(1),2,3,4,5,6,7,8); --error, not allowed
 INSERT INTO another_T VALUES (AVG(1) OVER (),2,3,4,5,6,7,8); --error, not 
allowed
 INSERT INTO another_T VALUES ((SELECT SUM(1)),(SELECT SUM(2) OVER 
()),3,4,5,6,7,8); --allowed
-       
+
 SELECT * FROM another_T;
 
 CREATE PROCEDURE crashme(a int) BEGIN DECLARE x INT; SET x = a; END;
diff --git a/sql/test/subquery/Tests/subquery4.stable.err 
b/sql/test/subquery/Tests/subquery4.stable.err
--- a/sql/test/subquery/Tests/subquery4.stable.err
+++ b/sql/test/subquery/Tests/subquery4.stable.err
@@ -140,7 +140,23 @@ MAPI  = (monetdb) /var/tmp/mtest-234504/
 QUERY = DELETE FROM another_T WHERE col8 = (SELECT MAX(col6 + ColID) OVER () 
FROM tbl_ProductSales); --error, more than one row returned by a subquery used 
as an expression
 ERROR = !zero_or_one: cardinality violation, scalar expression expected
 CODE  = M0M29
-MAPI  = (monetdb) /var/tmp/mtest-60261/.s.monetdb.38639
+MAPI  = (monetdb) /var/tmp/mtest-204362/.s.monetdb.35709
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to