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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list