Changeset: 71ba15d6c605 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/71ba15d6c605
Modified Files:
        sql/server/rel_unnest.c
        sql/test/SQLancer/Tests/sqlancer17.test
Branch: default
Log Message:

Merged with Jan2022


diffs (truncated from 344 to 300 lines):

diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -1467,7 +1467,7 @@ SQLdrop_schema(Client cntxt, MalBlkPtr m
        if (s->system)
                throw(SQL,"sql.drop_schema",SQLSTATE(42000) "DROP SCHEMA: 
access denied for '%s'", sname);
        if (sql_schema_has_user(sql, s))
-               throw(SQL,"sql.drop_schema",SQLSTATE(2BM37) "DROP SCHEMA: 
unable to drop schema '%s' (there are database objects which depend on it)", 
sname);
+               throw(SQL,"sql.drop_schema",SQLSTATE(2BM37) "DROP SCHEMA: 
unable to drop schema '%s' (there are database users using it as session's 
default schema)", sname);
        if (!action /* RESTRICT */ && (
                os_size(s->tables, tr) || os_size(s->types, tr) || 
os_size(s->funcs, tr) || os_size(s->seqs, tr)))
                throw(SQL,"sql.drop_schema",SQLSTATE(2BM37) "DROP SCHEMA: 
unable to drop schema '%s' (there are database objects which depend on it)", 
sname);
diff --git a/sql/backends/monet5/sql_rank.c b/sql/backends/monet5/sql_rank.c
--- a/sql/backends/monet5/sql_rank.c
+++ b/sql/backends/monet5/sql_rank.c
@@ -1501,7 +1501,7 @@ SQLprod(Client cntxt, MalBlkPtr mb, MalS
 str
 SQLavg(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       int tpe = getArgType(mb, pci, 1), frame_type;
+       int tpe = getArgType(mb, pci, 1), frame_type = 0;
        BAT *r = NULL, *b = NULL, *p = NULL, *o = NULL, *s = NULL, *e = NULL;
        str msg = SQLanalytics_args(&r, &b, &frame_type, &p, &o, &s, &e, cntxt, 
mb, stk, pci, TYPE_dbl, "sql.avg");
        bat *res = NULL;
@@ -1561,7 +1561,7 @@ bailout:
 str
 SQLavginteger(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-       int tpe = getArgType(mb, pci, 1), frame_type;
+       int tpe = getArgType(mb, pci, 1), frame_type = 0;
        BAT *r = NULL, *b = NULL, *p = NULL, *o = NULL, *s = NULL, *e = NULL;
        str msg = SQLanalytics_args(&r, &b, &frame_type, &p, &o, &s, &e, cntxt, 
mb, stk, pci, 0, "sql.avg");
        bat *res = NULL;
@@ -1606,7 +1606,7 @@ static str
 do_stddev_and_variance(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci, const char *op,
                                           gdk_return (*func)(BAT *, BAT *, BAT 
*, BAT *, BAT *, BAT *, int, int))
 {
-       int tpe = getArgType(mb, pci, 1), frame_type;
+       int tpe = getArgType(mb, pci, 1), frame_type = 0;
        BAT *r = NULL, *b = NULL, *p = NULL, *o = NULL, *s = NULL, *e = NULL;
        str msg = SQLanalytics_args(&r, &b, &frame_type, &p, &o, &s, &e, cntxt, 
mb, stk, pci, TYPE_dbl, op);
        bat *res = NULL;
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -818,8 +818,16 @@ push_up_project(mvc *sql, sql_rel *rel, 
 {
        sql_rel *r = rel->r;
 
+       assert(is_simple_project(r->op));
        if (rel_is_ref(r)) {
-               sql_rel *nr = rel_project(sql->sa, rel_dup(r->l), 
exps_copy(sql, r->exps));
+               sql_rel *nr = rel_project(sql->sa, r->l ? rel_dup(r->l) : NULL, 
exps_copy(sql, r->exps));
+
+               if (is_single(r))
+                       set_single(nr);
+               if (need_distinct(r))
+                       set_distinct(nr);
+               nr->p = prop_copy(sql->sa, r->p);
+               nr->r = exps_copy(sql, r->r);
                rel_destroy(r);
                rel->r = r = nr;
        }
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -4047,6 +4047,20 @@ sql_trans_commit(sql_trans *tr)
        return (ok==LOG_OK)?SQL_OK:SQL_ERR;
 }
 
+static sql_table *
+find_table_by_columnid(sql_trans *tr, const char *schema, sqlid id)
+{
+       sqlstore *store = tr->store;
+       sql_table *syscolumn = find_sql_table(tr, find_sql_schema(tr, schema), 
"_columns");
+
+       oid rid = store->table_api.column_find_row(tr, 
find_sql_column(syscolumn, "id"), &id, NULL);
+       if (!is_oid_nil(rid)) {
+               sqlid tid = store->table_api.column_find_sqlid(tr, 
find_sql_column(syscolumn, "table_id"), rid);
+               return sql_trans_find_table(tr, tid);
+       }
+       return NULL;
+}
+
 static int
 sql_trans_drop_all_dependencies(sql_trans *tr, sqlid id, sql_dependency type)
 {
@@ -4080,7 +4094,9 @@ sql_trans_drop_all_dependencies(sql_tran
                                case COLUMN_DEPENDENCY: {
                                        if ((t_id = 
sql_trans_get_dependency_type(tr, dep_id, TABLE_DEPENDENCY)) > 0) {
                                                sql_table *t = 
sql_trans_find_table(tr, dep_id);
-                                               if (t)
+                                               if (t && ol_length(t->columns) 
== 1) /* only column left, drop the table instead */
+                                                       res = 
sql_trans_drop_table_id(tr, t->s, t->base.id, DROP_CASCADE);
+                                               else if (t)
                                                        res = 
sql_trans_drop_column(tr, t, dep_id, DROP_CASCADE);
                                        }
                                        } break;
@@ -4103,11 +4119,24 @@ sql_trans_drop_all_dependencies(sql_tran
                                case PROC_DEPENDENCY:
                                case FUNC_DEPENDENCY: {
                                        sql_func *f = sql_trans_find_func(tr, 
dep_id);
-                                       res = sql_trans_drop_func(tr, f->s, 
dep_id, DROP_CASCADE);
+                                       if (f)
+                                               res = sql_trans_drop_func(tr, 
f->s, dep_id, DROP_CASCADE);
                                        } break;
                                case TYPE_DEPENDENCY: {
-                                       sql_type *t = sql_trans_find_type(tr, 
NULL, dep_id);
-                                       res = sql_trans_drop_type(tr, t->s, 
dep_id, DROP_CASCADE);
+                                       /* Unlike other dependencies, for type 
dependencies,
+                                          the dependent object depends on the 
type, rather the other way around.
+                                          At this moment, only functions or 
columns depend on types, so try both */
+                                       sql_table *t = NULL;
+                                       sql_func *f = sql_trans_find_func(tr, 
dep_id);
+                                       if (f) {
+                                               res = sql_trans_drop_func(tr, 
f->s, dep_id, DROP_CASCADE);
+                                       } else if ((t = 
find_table_by_columnid(tr, "sys", dep_id)) ||
+                                                          (t = 
find_table_by_columnid(tr, "tmp", dep_id))) {
+                                               if (ol_length(t->columns) == 1) 
/* only column left, drop the table instead */
+                                                       res = 
sql_trans_drop_table_id(tr, t->s, t->base.id, DROP_CASCADE);
+                                               else
+                                                       res = 
sql_trans_drop_column(tr, t, dep_id, DROP_CASCADE);
+                                       }
                                        } break;
                                case USER_DEPENDENCY:  /*TODO schema and users 
dependencies*/
                                        break;
@@ -4425,7 +4454,7 @@ sys_drop_column(sql_trans *tr, sql_colum
 
        if (drop_action && (res = sql_trans_drop_all_dependencies(tr, 
col->base.id, COLUMN_DEPENDENCY)))
                return res;
-       if (col->type.type->s && (res = sql_trans_drop_dependency(tr, 
col->base.id, col->type.type->base.id, TYPE_DEPENDENCY)))
+       if (col->type.type->s && (res = sql_trans_drop_dependency(tr, 
col->type.type->base.id, col->base.id, TYPE_DEPENDENCY)))
                return res;
        return res;
 }
@@ -4689,6 +4718,22 @@ sys_drop_func(sql_trans *tr, sql_func *f
 
        if (drop_action && (res = sql_trans_drop_all_dependencies(tr, 
func->base.id, !IS_PROC(func) ? FUNC_DEPENDENCY : PROC_DEPENDENCY)))
                return res;
+       if (!func->vararg && func->ops) {
+               for (node *n = func->ops->h; n; n = n->next) {
+                       sql_arg *a = n->data;
+
+                       if (a->type.type->s && (res = 
sql_trans_drop_dependency(tr, a->type.type->base.id, func->base.id, 
TYPE_DEPENDENCY)))
+                               return res;
+               }
+       }
+       if (!func->varres && func->res) {
+               for (node *n = func->res->h; n; n = n->next) {
+                       sql_arg *a = n->data;
+
+                       if (a->type.type->s && (res = 
sql_trans_drop_dependency(tr, a->type.type->base.id, func->base.id, 
TYPE_DEPENDENCY)))
+                               return res;
+               }
+       }
        return res;
 }
 
diff --git a/sql/test/BugTracker/Tests/authorization.SF-1430616-3.test 
b/sql/test/BugTracker/Tests/authorization.SF-1430616-3.test
--- a/sql/test/BugTracker/Tests/authorization.SF-1430616-3.test
+++ b/sql/test/BugTracker/Tests/authorization.SF-1430616-3.test
@@ -1,4 +1,4 @@
-statement error 2BM37!DROP SCHEMA: unable to drop schema 'voc' (there are 
database objects which depend on it)
+statement error 2BM37!DROP SCHEMA: unable to drop schema 'voc' (there are 
database users using it as session's default schema)
 DROP SCHEMA voc
 
 statement error M1M05!DROP USER: 'voc' owns a schema
diff --git 
a/sql/test/BugTracker/Tests/set_a_new_user_password.SF-1844050.SQL.py 
b/sql/test/BugTracker/Tests/set_a_new_user_password.SF-1844050.SQL.py
--- a/sql/test/BugTracker/Tests/set_a_new_user_password.SF-1844050.SQL.py
+++ b/sql/test/BugTracker/Tests/set_a_new_user_password.SF-1844050.SQL.py
@@ -45,7 +45,7 @@ with tempfile.TemporaryDirectory() as fa
     with server_start() as srv:
         with SQLTestCase() as tc:
             tc.connect(username="monetdb", password="monetdb", port=myport, 
database='db1')
-            tc.execute("DROP SCHEMA \"voc2\";").assertFailed(err_message='DROP 
SCHEMA: unable to drop schema \'voc2\' (there are database objects which depend 
on it)')
+            tc.execute("DROP SCHEMA \"voc2\";").assertFailed(err_message='DROP 
SCHEMA: unable to drop schema \'voc2\' (there are database users using it as 
session\'s default schema)')
             tc.execute("""
             ALTER user "voc2" SET SCHEMA "sys";
             DROP SCHEMA "voc2";
diff --git a/sql/test/SQLancer/Tests/sqlancer17.test 
b/sql/test/SQLancer/Tests/sqlancer17.test
--- a/sql/test/SQLancer/Tests/sqlancer17.test
+++ b/sql/test/SQLancer/Tests/sqlancer17.test
@@ -71,12 +71,12 @@ project (
 | | | intersect (
 | | | | project (
 | | | | | select (
-| | | | | |  [ boolean(1) "true" ]
+| | | | | |  [ boolean(1) "true" as "%1"."%1" ]
 | | | | | ) [ (tinyint(2) "2") ! <= (tinyint(2) "1") ! <= (tinyint(2) "2"), 
(tinyint(3) "3") <= (tinyint(2) "2") <= (tinyint(2) "5") ]
 | | | | ) [ tinyint(2) "2" as "v0"."vc0" ],
 | | | | project (
 | | | | | select (
-| | | | | |  [ boolean(1) "true" ]
+| | | | | |  [ boolean(1) "true" as "%2"."%2" ]
 | | | | | ) [ (tinyint(3) "4") ! <= (tinyint(2) "1") ! <= (tinyint(3) "4"), 
(tinyint(3) "3") <= (tinyint(3) "4") <= (tinyint(2) "5") ]
 | | | | ) [ tinyint(3) "4" as "v0"."vc0" ]
 | | | ) [ "v0"."vc0" NOT NULL ]
diff --git a/sql/test/SQLancer/Tests/sqlancer22.test 
b/sql/test/SQLancer/Tests/sqlancer22.test
--- a/sql/test/SQLancer/Tests/sqlancer22.test
+++ b/sql/test/SQLancer/Tests/sqlancer22.test
@@ -71,3 +71,17 @@ CREATE VIEW v2(vc0, vc1, vc2) AS (WITH c
 
 statement ok
 ROLLBACK
+
+statement ok
+START TRANSACTION
+
+statement ok
+CREATE TABLE t0(c0 INT)
+
+query I nosort
+with x(x) as (select 4) select 2 > all(select 3 from t0 full outer join 
(values (x.x)) as y(y) on false) from x
+----
+0
+
+statement ok
+ROLLBACK
diff --git a/sql/test/sql_xml/Tests/All b/sql/test/sql_xml/Tests/All
--- a/sql/test/sql_xml/Tests/All
+++ b/sql/test/sql_xml/Tests/All
@@ -3,3 +3,4 @@ load
 HAVE_LIBXML?xml
 HAVE_LIBXML?xml_attribute_parsing.SF-1855673
 HAVE_LIBXML?xmlelement_segfault.SF-2812767
+cleanupfuncs
diff --git a/sql/test/sql_xml/Tests/cleanupfuncs.reqtests 
b/sql/test/sql_xml/Tests/cleanupfuncs.reqtests
new file mode 100644
--- /dev/null
+++ b/sql/test/sql_xml/Tests/cleanupfuncs.reqtests
@@ -0,0 +1,1 @@
+funcs
diff --git a/sql/test/sql_xml/Tests/cleanupfuncs.test 
b/sql/test/sql_xml/Tests/cleanupfuncs.test
new file mode 100644
--- /dev/null
+++ b/sql/test/sql_xml/Tests/cleanupfuncs.test
@@ -0,0 +1,107 @@
+# Also testing dependencies on types
+
+statement error 42000!DROP TYPE: unable to drop type xml (there are database 
objects which depend on it)
+DROP TYPE xml
+
+statement ok
+DROP FUNCTION xml(STRING)
+
+statement ok
+DROP FUNCTION str(xml)
+
+statement ok
+DROP FUNCTION "comment"(STRING)
+
+statement ok
+CREATE TABLE x (x XML)
+
+statement ok
+CREATE TABLE y (x XML, y XML)
+
+statement ok
+CREATE TABLE z (x XML, y XML, z INT)
+
+statement ok
+CREATE INDEX z1 ON z(x)
+
+statement ok
+CREATE INDEX z2 ON z(x,y)
+
+statement ok
+CREATE INDEX z3 ON z(y,z)
+
+statement ok
+CREATE INDEX z4 ON z(z)
+
+statement ok rowcount 1
+INSERT INTO z VALUES (NULL, NULL, 1)
+
+query T nosort
+SELECT "sqlname" FROM "types" WHERE "sqlname" = 'xml'
+----
+xml
+
+query T nosort
+SELECT "name" FROM "sys"."tables" WHERE "name" IN ('x', 'y', 'z')
+----
+x
+y
+z
+
+query TTI nosort
+SELECT * FROM z
+----
+NULL
+NULL
+1
+
+query T nosort
+SELECT "name" FROM "sys"."idxs" WHERE "name" IN ('z1', 'z2', 'z3', 'z4')
+----
+z1
+z2
+z3
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to