Changeset: 136a16cc8969 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/136a16cc8969 Modified Files: sql/server/rel_optimizer.c sql/server/rel_schema.c sql/test/miscellaneous/Tests/simple_selects.test Branch: Jul2021 Log Message:
Defensive lines for declared tables diffs (82 lines): diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -9523,7 +9523,7 @@ rel_optimize_unions_topdown(visitor *v, return rel; } -static sql_rel * +static inline sql_rel * rel_basecount(visitor *v, sql_rel *rel) { if (is_groupby(rel->op) && rel->l && !rel->r && list_length(rel->exps) == 1 && exp_aggr_is_count(rel->exps->h->data)) { @@ -9532,7 +9532,8 @@ rel_basecount(visitor *v, sql_rel *rel) if (is_basetable(bt->op) && !e->l) { /* count(*) */ /* change into select cnt('schema','table') */; sql_table *t = bt->l; - if (!isTable(t)) + /* I need to get the declared table's frame number to make this work correctly for those */ + if (!isTable(t) || isDeclaredTable(t)) return rel; sql_subfunc *cf = sql_bind_func(v->sql, "sys", "cnt", sql_bind_localtype("str"), sql_bind_localtype("str"), F_FUNC); list *exps = sa_list(v->sql->sa); diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c --- a/sql/server/rel_schema.c +++ b/sql/server/rel_schema.c @@ -1471,6 +1471,8 @@ sql_drop_view(sql_query *query, dlist *q } return NULL; } + if (!isView(t)) + return sql_error(sql, 02, SQLSTATE(42000) "DROP VIEW: unable to drop view '%s': is a table", tname); return rel_drop(sql->sa, ddl_drop_view, t->s->base.name, tname, NULL, nr, if_exists); } diff --git a/sql/test/miscellaneous/Tests/simple_selects.test b/sql/test/miscellaneous/Tests/simple_selects.test --- a/sql/test/miscellaneous/Tests/simple_selects.test +++ b/sql/test/miscellaneous/Tests/simple_selects.test @@ -792,9 +792,6 @@ select "😀"() 1 statement ok -rollback - -statement ok CREATE FUNCTION ups() RETURNS INT BEGIN DECLARE "nononononononononononononononononononononononononononononononono" int; @@ -804,6 +801,9 @@ END; -- error for now statement error select ups() +statement ok +rollback + statement error create function "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"() returns int return 2 @@ -833,3 +833,24 @@ rollback statement ok drop table thisnamewontconflict + +statement ok +start transaction + +statement ok +CREATE OR REPLACE FUNCTION nasty() RETURNS BIGINT +BEGIN + DECLARE TABLE atest (a int); + DECLARE res BIGINT; + INSERT INTO atest VALUES (1),(2),(3); + SELECT count(*) INTO res FROM atest; + RETURN res; +END + +query I rowsort +select nasty() +---- +3 + +statement ok +rollback _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list