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