Changeset: a9ef7be95524 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a9ef7be95524
Added Files:
        sql/test/BugTracker-2018/Tests/procedure-create-table.Bug-6604.sql
Modified Files:
        sql/server/rel_psm.c
        sql/server/rel_schema.c
        sql/test/BugTracker-2018/Tests/All
Branch: Mar2018
Log Message:

Steps to fix bug 6604. When creating a table inside a sequential block (UDF) 
check for the rel_insert case when the table is created with data.

However even in the scenario without data, the table doesn't get created. 
Another bug :(


diffs (82 lines):

diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -201,7 +201,7 @@ rel_psm_declare(mvc *sql, dnode *n)
 static sql_exp *
 rel_psm_declare_table(mvc *sql, dnode *n)
 {
-       sql_rel *rel = NULL;
+       sql_rel *rel = NULL, *baset = NULL;
        dlist *qname = n->next->data.lval;
        const char *name = qname_table(qname);
        const char *sname = qname_schema(qname);
@@ -209,18 +209,26 @@ rel_psm_declare_table(mvc *sql, dnode *n
 
        if (sname)  /* not allowed here */
                return sql_error(sql, 02, SQLSTATE(42000) "DECLARE TABLE: 
qualified name not allowed");
-       if (frame_find_var(sql, name)) 
+       if (frame_find_var(sql, name))
                return sql_error(sql, 01, SQLSTATE(42000) "Variable '%s' 
already declared", name);
-       
+
        assert(n->next->next->next->type == type_int);
-       
+
        rel = rel_create_table(sql, cur_schema(sql), SQL_DECLARED_TABLE, NULL, 
name, n->next->next->data.sym, n->next->next->next->data.i_val, NULL, 0);
 
-       if (!rel || rel->op != op_ddl || rel->flag != DDL_CREATE_TABLE)
+       if (!rel)
                return NULL;
-
-       t = 
(sql_table*)((atom*)((sql_exp*)rel->exps->t->data)->l)->data.val.pval;
-       if(!stack_push_table(sql, name, rel, t))
+       if(rel->op == op_ddl) {
+               baset = rel;
+       } else if(rel->op == op_insert) {
+               baset = rel->l;
+       } else {
+               return NULL;
+       }
+       if(baset->flag != DDL_CREATE_TABLE)
+               return NULL;
+       t = 
(sql_table*)((atom*)((sql_exp*)baset->exps->t->data)->l)->data.val.pval;
+       if(!stack_push_table(sql, name, baset, t))
                return sql_error(sql, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
        return exp_table(sql->sa, sa_strdup(sql->sa, name), t, sql->frame);
 }
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
@@ -920,7 +920,7 @@ rel_create_table(mvc *sql, sql_schema *s
                if (temp != SQL_PERSIST && tt == tt_table) {
                        s = mvc_bind_schema(sql, "tmp");
                        if (temp == SQL_LOCAL_TEMP && sname && strcmp(sname, 
s->base.name) != 0)
-                               return sql_error(sql, 02, SQLSTATE(3F000) 
"CREATE TABLE: local tempory tables should be stored in the '%s' schema", 
s->base.name);
+                               return sql_error(sql, 02, SQLSTATE(3F000) 
"CREATE TABLE: local temporary tables should be stored in the '%s' schema", 
s->base.name);
                } else if (s == NULL) {
                        s = ss;
                }
diff --git a/sql/test/BugTracker-2018/Tests/All 
b/sql/test/BugTracker-2018/Tests/All
--- a/sql/test/BugTracker-2018/Tests/All
+++ b/sql/test/BugTracker-2018/Tests/All
@@ -60,3 +60,4 @@ sqlitelogictest-select-errors.Bug-6600
 remote-table-where-is-null.Bug-6601
 sqlitelogictest-select-not-in-wrong.Bug-6602
 sqlitelogictest-groupby-distinct-duplicate.Bug-6603
+procedure-create-table.Bug-6604
diff --git a/sql/test/BugTracker-2018/Tests/procedure-create-table.Bug-6604.sql 
b/sql/test/BugTracker-2018/Tests/procedure-create-table.Bug-6604.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2018/Tests/procedure-create-table.Bug-6604.sql
@@ -0,0 +1,11 @@
+create procedure test() begin create table x (i int); insert into x values 
(1), (2); end;
+call test();
+select i from x limit 1;
+drop table x;
+drop procedure test;
+
+create procedure test() begin create table x as select * from sys.functions 
with data; end;
+call test();
+select query from x limit 1;
+drop table x;
+drop procedure test;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to