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