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

Reply via email to