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