Changeset: 3b6769af644a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3b6769af644a
Modified Files:
        sql/server/rel_rel.h
        sql/server/rel_select.c
        sql/server/rel_updates.c
        sql/test/subquery/Tests/subquery6.sql
        sql/test/subquery/Tests/subquery6.stable.err
Branch: Jun2020
Log Message:

Approved output and added missing cardinality check for merge statements


diffs (108 lines):

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
@@ -29,6 +29,7 @@
 #define sql_psm_set      (1 << 13) //ORed
 #define sql_values       (1 << 14) //ORed
 #define psm_call         (1 << 15) //ORed
+#define sql_merge        (1 << 16) //ORed
 
 #define is_sql_from(X)         ((X & sql_from) == sql_from)
 #define is_sql_where(X)        ((X & sql_where) == sql_where)
@@ -46,6 +47,7 @@
 #define is_sql_psm_set(X)      ((X & sql_psm_set) == sql_psm_set)
 #define is_sql_values(X)       ((X & sql_values) == sql_values)
 #define is_psm_call(X)         ((X & psm_call) == psm_call)
+#define is_sql_merge(X)        ((X & sql_merge) == sql_merge)
 
 #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
@@ -2451,7 +2451,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) | is_sql_having(f) | ( is_sql_where(f) && rel && (!*rel || 
is_basetable((*rel)->op) || is_simple_project((*rel)->op)))))
+               if (ek.card < card_set && sq->card >= CARD_MULTI && 
(is_sql_sel(f) | is_sql_having(f) | ( is_sql_where(f) && rel && (!*rel || 
is_basetable((*rel)->op) || is_simple_project((*rel)->op) || is_sql_merge(f)))))
                        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
@@ -1300,7 +1300,7 @@ merge_into_table(sql_query *query, dlist
        if (isMergeTable(t))
                return sql_error(sql, 02, SQLSTATE(42000) "MERGE: merge 
statements not available for merge tables yet");
 
-       bt = rel_basetable(sql, t, alias ? alias : t->base.name);
+       bt = rel_basetable(sql, t, alias ? alias : tname);
        joined = table_ref(query, NULL, tref, 0);
        if (!bt || !joined)
                return NULL;
@@ -1335,7 +1335,7 @@ merge_into_table(sql_query *query, dlist
                                        join_rel = rel_dup(join_rel);
                                } else {
                                        join_rel = rel_crossproduct(sql->sa, 
joined, bt, op_left);
-                                       if (!(join_rel = rel_logical_exp(query, 
join_rel, search_cond, sql_where | sql_join)))
+                                       if (!(join_rel = rel_logical_exp(query, 
join_rel, search_cond, sql_where | sql_join | sql_merge)))
                                                return NULL;
                                        set_processed(join_rel);
                                }
@@ -1372,7 +1372,7 @@ merge_into_table(sql_query *query, dlist
                                        join_rel = rel_dup(join_rel);
                                } else {
                                        join_rel = rel_crossproduct(sql->sa, 
joined, bt, op_left);
-                                       if (!(join_rel = rel_logical_exp(query, 
join_rel, search_cond, sql_where | sql_join)))
+                                       if (!(join_rel = rel_logical_exp(query, 
join_rel, search_cond, sql_where | sql_join | sql_merge)))
                                                return NULL;
                                        set_processed(join_rel);
                                }
@@ -1413,7 +1413,7 @@ merge_into_table(sql_query *query, dlist
                                join_rel = rel_dup(join_rel);
                        } else {
                                join_rel = rel_crossproduct(sql->sa, joined, 
bt, op_left);
-                               if (!(join_rel = rel_logical_exp(query, 
join_rel, search_cond, sql_where | sql_join)))
+                               if (!(join_rel = rel_logical_exp(query, 
join_rel, search_cond, sql_where | sql_join | sql_merge)))
                                        return NULL;
                                set_processed(join_rel);
                        }
diff --git a/sql/test/subquery/Tests/subquery6.sql 
b/sql/test/subquery/Tests/subquery6.sql
--- a/sql/test/subquery/Tests/subquery6.sql
+++ b/sql/test/subquery/Tests/subquery6.sql
@@ -11,6 +11,15 @@ DELETE FROM another_t WHERE (SELECT 1 UN
 DELETE FROM another_t WHERE (SELECT 1 UNION SELECT 2) > 1; 
        --error, more than one row returned by a subquery used as an expression
 
+UPDATE another_T SET col1 = 1 WHERE (SELECT 1 UNION SELECT 2) > 1;
+       --error, more than one row returned by a subquery used as an expression
+
+MERGE INTO another_t USING (SELECT col1 FROM another_t) sub ON (SELECT 1 UNION 
SELECT 2) > 1 WHEN MATCHED THEN DELETE WHEN NOT MATCHED THEN INSERT;
+       --error, more than one row returned by a subquery used as an expression
+
+MERGE INTO another_t USING (SELECT (SELECT 1 UNION SELECT 2) FROM another_t) 
sub ON TRUE WHEN MATCHED THEN DELETE WHEN NOT MATCHED THEN INSERT;
+       --error, more than one row returned by a subquery used as an expression
+
 DROP TABLE tbl_ProductSales;
 DROP TABLE another_T;
 DROP TABLE integers;
diff --git a/sql/test/subquery/Tests/subquery6.stable.err 
b/sql/test/subquery/Tests/subquery6.stable.err
--- a/sql/test/subquery/Tests/subquery6.stable.err
+++ b/sql/test/subquery/Tests/subquery6.stable.err
@@ -11,6 +11,15 @@ ERROR = !GDK reported error: BATsubcross
 MAPI  = (monetdb) /var/tmp/mtest-297142/.s.monetdb.31114
 QUERY = DELETE FROM another_t WHERE (SELECT 1 UNION SELECT 2) > 1; 
 ERROR = !GDK reported error: BATsubcross: more than one match
+MAPI  = (monetdb) /var/tmp/mtest-307385/.s.monetdb.36125
+QUERY = UPDATE another_T SET col1 = 1 WHERE (SELECT 1 UNION SELECT 2) > 1;
+ERROR = !GDK reported error: BATsubcross: more than one match
+MAPI  = (monetdb) /var/tmp/mtest-307385/.s.monetdb.36125
+QUERY = MERGE INTO another_t USING (SELECT col1 FROM another_t) sub ON (SELECT 
1 UNION SELECT 2) > 1 WHEN MATCHED THEN DELETE WHEN NOT MATCHED THEN INSERT;
+ERROR = !GDK reported error: BATsubcross: more than one match
+MAPI  = (monetdb) /var/tmp/mtest-307385/.s.monetdb.36125
+QUERY = MERGE INTO another_t USING (SELECT (SELECT 1 UNION SELECT 2) FROM 
another_t) sub ON TRUE WHEN MATCHED THEN DELETE WHEN NOT MATCHED THEN INSERT;
+ERROR = !GDK reported error: BATsubcross: more than one match
 
 # 11:45:43 >  
 # 11:45:43 >  "Done."
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to