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