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

Reply via email to