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