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