Changeset: c65827333031 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c65827333031 Modified Files: sql/server/rel_propagate.c sql/server/rel_rel.h sql/server/rel_select.c sql/server/rel_updates.c sql/test/subquery/Tests/subquery4.sql sql/test/subquery/Tests/subquery4.stable.err Branch: default Log Message:
Updates with wrong results diffs (107 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_rel.h b/sql/server/rel_rel.h --- a/sql/server/rel_rel.h +++ b/sql/server/rel_rel.h @@ -28,6 +28,7 @@ #define sql_update_set (1 << 12) //ORed #define sql_values (1 << 13) //ORed #define psm_call (1 << 14) //ORed +#define sql_rel_update (1 << 15) //ORed #define is_sql_from(X) ((X & sql_from) == sql_from) #define is_sql_where(X) ((X & sql_where) == sql_where) @@ -44,6 +45,7 @@ #define is_sql_update_set(X) ((X & sql_update_set) == sql_update_set) #define is_sql_values(X) ((X & sql_values) == sql_values) #define is_psm_call(X) ((X & psm_call) == psm_call) +#define is_sql_rel_update(X) ((X & sql_rel_update) == sql_rel_update) #define is_updateble(rel) \ (rel->op == op_basetable || \ 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 @@ -2380,7 +2380,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) && (rel && *rel && is_basetable((*rel)->op))) sq = rel_zero_or_one(sql, sq, ek); return exp_rel(sql, sq); } 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 @@ -990,7 +990,7 @@ update_generate_assignments(sql_query *q 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); + query_push_outer(query, r, sql_sel); rel_val = rel_subquery(query, NULL, a, ek); r = query_pop_outer(query); if (/* DISABLES CODE */ (0) && r) { 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 +QUERY = UPDATE another_T SET col5 = (SELECT 1 UNION ALL SELECT 2); --error, more than one row returned by a subquery used as an expression +ERROR = !Cardinality violation, scalar value expected +CODE = 21000 +MAPI = (monetdb) /var/tmp/mtest-204362/.s.monetdb.35709 +QUERY = 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 +ERROR = !Cardinality violation, scalar value expected +CODE = 21000 +MAPI = (monetdb) /var/tmp/mtest-204362/.s.monetdb.35709 +QUERY = 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 +ERROR = !Cardinality violation, scalar value expected +CODE = 21000 +MAPI = (monetdb) /var/tmp/mtest-204362/.s.monetdb.35709 +QUERY = 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 +ERROR = !Cardinality violation, scalar value expected +CODE = 21000 +MAPI = (monetdb) /var/tmp/mtest-204362/.s.monetdb.35709 QUERY = SET x = MAX(1) over (); --error, not allowed ERROR = !MAX: window function 'max' not allowed in SET clause (use subquery) CODE = 42000 _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list