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

Reply via email to