Changeset: b12ff271d2ec for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b12ff271d2ec
Added Files:
sql/test/subquery/Tests/subquery6.sql
sql/test/subquery/Tests/subquery6.stable.err
sql/test/subquery/Tests/subquery6.stable.out
Modified Files:
sql/server/rel_updates.c
sql/test/subquery/Tests/All
Branch: Jun2020
Log Message:
Removed unecessary old code at rel_updates for deletes and updates, which was
causing a subquery crash
diffs (166 lines):
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
@@ -1088,7 +1088,7 @@ update_table(sql_query *query, dlist *qn
t = mvc_bind_table(sql, NULL, tname);
}
if (update_allowed(sql, t, tname, "UPDATE", "update", 0) != NULL) {
- sql_rel *r = NULL, *bt = rel_basetable(sql, t, alias ? alias :
t->base.name), *res = bt;
+ sql_rel *r = NULL, *bt = rel_basetable(sql, t, alias ? alias :
tname), *res = bt;
if (opt_from) {
dlist *fl = opt_from->data.lval;
@@ -1113,25 +1113,15 @@ update_table(sql_query *query, dlist *qn
return NULL;
}
if (opt_where) {
- int status = sql->session->status;
-
if (!table_privs(sql, t, PRIV_SELECT))
return sql_error(sql, 02, SQLSTATE(42000)
"UPDATE: insufficient privileges for user '%s' to update table '%s'",
stack_get_string(sql, "current_user"), tname);
- r = rel_logical_exp(query, NULL, opt_where, sql_where);
- if (!r) {
- sql->errstr[0] = 0;
- sql->session->status = status;
- r = rel_logical_exp(query, res, opt_where,
sql_where);
- if (!r)
- return NULL;
- /* handle join */
- if (!opt_from && r && is_join(r->op))
- r->op = op_semi;
- else if (r && res && r->nrcols != res->nrcols) {
- list *exps = rel_projections(sql, res,
NULL, 1, 1);
- r = rel_project(sql->sa, r, exps);
- }
- }
+ if (!(r = rel_logical_exp(query, res, opt_where,
sql_where)))
+ return NULL;
+ /* handle join */
+ if (!opt_from && r && is_join(r->op))
+ r->op = op_semi;
+ else if (r && res && r->nrcols != res->nrcols)
+ r = rel_project(sql->sa, r,
rel_projections(sql, res, NULL, 1, 1));
if (!r)
return NULL;
} else { /* update all */
@@ -1189,33 +1179,20 @@ delete_table(sql_query *query, dlist *qn
t = mvc_bind_table(sql, NULL, tname);
}
if (update_allowed(sql, t, tname, "DELETE FROM", "delete from", 1) !=
NULL) {
- sql_rel *r = NULL;
- sql_exp *e;
+ sql_rel *r = rel_basetable(sql, t, alias ? alias : tname);
if (opt_where) {
- int status = sql->session->status;
+ sql_exp *e;
if (!table_privs(sql, t, PRIV_SELECT))
return sql_error(sql, 02, SQLSTATE(42000)
"DELETE FROM: insufficient privileges for user '%s' to delete from table '%s'",
stack_get_string(sql, "current_user"), tname);
-
- r = rel_logical_exp(query, NULL, opt_where, sql_where);
- if (r) { /* simple predicate which is not using the to
- be updated table. We add a select
all */
- sql_rel *l = rel_basetable(sql, t, alias ?
alias : t->base.name);
- r = rel_crossproduct(sql->sa, l, r, op_join);
- } else {
- sql->errstr[0] = 0;
- sql->session->status = status;
- r = rel_basetable(sql, t, alias ? alias :
t->base.name);
- r = rel_logical_exp(query, r, opt_where,
sql_where);
- }
- if (!r)
+ if (!(r = rel_logical_exp(query, r, opt_where,
sql_where)))
return NULL;
e = exp_column(sql->sa, rel_name(r), TID,
sql_bind_localtype("oid"), CARD_MULTI, 0, 1);
- r = rel_project(sql->sa, r,
append(new_exp_list(sql->sa), e));
- r = rel_delete(sql->sa, rel_basetable(sql, t, tname),
r);
+ r = rel_project(sql->sa, r,
list_append(new_exp_list(sql->sa), e));
+ r = rel_delete(sql->sa, rel_basetable(sql, t, alias ?
alias : tname), r);
} else { /* delete all */
- r = rel_delete(sql->sa, rel_basetable(sql, t, tname),
NULL);
+ r = rel_delete(sql->sa, r, NULL);
}
return r;
}
diff --git a/sql/test/subquery/Tests/All b/sql/test/subquery/Tests/All
--- a/sql/test/subquery/Tests/All
+++ b/sql/test/subquery/Tests/All
@@ -9,3 +9,4 @@ subquery2
subquery3
subquery4
subquery5
+subquery6
diff --git a/sql/test/subquery/Tests/subquery6.sql
b/sql/test/subquery/Tests/subquery6.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/subquery/Tests/subquery6.sql
@@ -0,0 +1,16 @@
+CREATE TABLE tbl_ProductSales (ColID int, Product_Category varchar(64),
Product_Name varchar(64), TotalSales int);
+INSERT INTO tbl_ProductSales VALUES (1,'Game','Mobo Game',200),(2,'Game','PKO
Game',400),(3,'Fashion','Shirt',500),(4,'Fashion','Shorts',100);
+CREATE TABLE another_T (col1 INT, col2 INT, col3 INT, col4 INT, col5 INT, col6
INT, col7 INT, col8 INT);
+INSERT INTO another_T VALUES (1,2,3,4,5,6,7,8), (11,22,33,44,55,66,77,88),
(111,222,333,444,555,666,777,888), (1111,2222,3333,4444,5555,6666,7777,8888);
+CREATE TABLE integers(i INTEGER);
+INSERT INTO integers VALUES (1), (2), (3), (NULL);
+
+DELETE FROM another_t WHERE (SELECT 1 UNION SELECT 2) > 1;
+ --error, more than one row returned by a subquery used as an expression
+
+DELETE FROM another_t WHERE (SELECT 1 UNION SELECT 2) > 1;
+ --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
new file mode 100644
--- /dev/null
+++ b/sql/test/subquery/Tests/subquery6.stable.err
@@ -0,0 +1,18 @@
+stderr of test 'subquery6` in directory 'sql/test/subquery` itself:
+
+
+# 11:45:43 >
+# 11:45:43 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-297142" "--port=31114"
+# 11:45:43 >
+
+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-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
+
+# 11:45:43 >
+# 11:45:43 > "Done."
+# 11:45:43 >
+
diff --git a/sql/test/subquery/Tests/subquery6.stable.out
b/sql/test/subquery/Tests/subquery6.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/subquery/Tests/subquery6.stable.out
@@ -0,0 +1,24 @@
+stdout of test 'subquery6` in directory 'sql/test/subquery` itself:
+
+
+# 11:45:43 >
+# 11:45:43 > "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-297142" "--port=31114"
+# 11:45:43 >
+
+#CREATE TABLE tbl_ProductSales (ColID int, Product_Category varchar(64),
Product_Name varchar(64), TotalSales int);
+#INSERT INTO tbl_ProductSales VALUES (1,'Game','Mobo Game',200),(2,'Game','PKO
Game',400),(3,'Fashion','Shirt',500),(4,'Fashion','Shorts',100);
+[ 4 ]
+#CREATE TABLE another_T (col1 INT, col2 INT, col3 INT, col4 INT, col5 INT,
col6 INT, col7 INT, col8 INT);
+#INSERT INTO another_T VALUES (1,2,3,4,5,6,7,8), (11,22,33,44,55,66,77,88),
(111,222,333,444,555,666,777,888), (1111,2222,3333,4444,5555,6666,7777,8888);
+[ 4 ]
+#CREATE TABLE integers(i INTEGER);
+#INSERT INTO integers VALUES (1), (2), (3), (NULL);
+[ 4 ]
+#DROP TABLE tbl_ProductSales;
+#DROP TABLE another_T;
+#DROP TABLE integers;
+
+# 11:45:43 >
+# 11:45:43 > "Done."
+# 11:45:43 >
+
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list