Changeset: f0cd052adb55 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f0cd052adb55
Modified Files:
sql/backends/monet5/sql.c
sql/server/rel_rel.c
sql/server/sql_partition.c
sql/test/SQLancer/Tests/sqlancer02.sql
sql/test/SQLancer/Tests/sqlancer02.stable.out
Branch: Oct2020
Log Message:
Fix for SQLancer crash, if a column is auto-incremented, don't create a
function dependency, the created bedroppped dependency is enough. Now into
partition expressions
diffs (272 lines):
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -316,8 +316,9 @@ create_table_or_view(mvc *sql, char* sna
sql_column *c = n->data;
if (c->def) {
+ /* TODO please don't place an auto incremented sequence
in the default value */
+ const char *next_value_for = "next value for
\"sys\".\"seq_";
sql_rel *r = NULL;
- list *id_l;
sql->sa = sql->ta;
r = rel_parse(sql, s, sa_message(sql->ta, "select %s;",
c->def), m_deps);
@@ -332,8 +333,12 @@ create_table_or_view(mvc *sql, char* sna
else
throw(SQL, "sql.catalog",
SQLSTATE(42000) "%s", sql->errstr);
}
- id_l = rel_dependencies(sql, r);
- mvc_create_dependencies(sql, id_l, nt->base.id,
FUNC_DEPENDENCY);
+ /* For a self incremented column, it's sequence will
get a BEDROPPED_DEPENDENCY,
+ so no additional dependencies are needed */
+ if (strncmp(c->def, next_value_for,
strlen(next_value_for)) != 0) {
+ list *id_l = rel_dependencies(sql, r);
+ mvc_create_dependencies(sql, id_l, nt->base.id,
FUNC_DEPENDENCY);
+ }
rel_destroy(r);
sa_reset(sql->sa);
}
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -1682,12 +1682,10 @@ static int exp_deps(mvc *sql, sql_exp *e
static int
exps_deps(mvc *sql, list *exps, list *refs, list *l)
{
- node *n;
- for(n = exps->h; n; n = n->next) {
+ for(node *n = exps->h; n; n = n->next)
if (exp_deps(sql, n->data, refs, l) != 0)
return -1;
- }
return 0;
}
@@ -1724,8 +1722,7 @@ exp_deps(mvc *sql, sql_exp *e, list *ref
} else if (e->flag & PSM_VAR) {
return 0;
} else if (e->flag & PSM_WHILE || e->flag & PSM_IF) {
- if (exp_deps(sql, e->l, refs, l) != 0 ||
- exps_deps(sql, e->r, refs, l) != 0)
+ if (exp_deps(sql, e->l, refs, l) != 0 || exps_deps(sql,
e->r, refs, l) != 0)
return -1;
if (e->flag & PSM_IF && e->f)
return exps_deps(sql, e->f, refs, l);
@@ -1739,53 +1736,56 @@ exp_deps(mvc *sql, sql_exp *e, list *ref
case e_convert:
return exp_deps(sql, e->l, refs, l);
case e_func: {
- sql_subfunc *f = e->f;
+ sql_subfunc *f = e->f;
- if (e->l && exps_deps(sql, e->l, refs, l) != 0)
- return -1;
- cond_append(l, &f->func->base.id);
- if (e->l && list_length(e->l) == 2 &&
strcmp(f->func->base.name, "next_value_for") == 0) {
- /* add dependency on seq nr */
- list *nl = e->l;
- sql_exp *schname = nl->h->data;
- sql_exp *seqname = nl->t->data;
+ if (e->l && exps_deps(sql, e->l, refs, l) != 0)
+ return -1;
+ cond_append(l, &f->func->base.id);
+ if (e->l && list_length(e->l) == 2 &&
strcmp(f->func->base.name, "next_value_for") == 0) {
+ /* add dependency on seq nr */
+ list *nl = e->l;
+ sql_exp *schname = nl->h->data, *seqname = nl->t->data;
+ char *sch_name = is_atom(schname->type) && schname->l ?
((atom*)schname->l)->data.val.sval : NULL;
+ char *seq_name = is_atom(seqname->type) && seqname->l ?
((atom*)seqname->l)->data.val.sval : NULL;
- char *sch_name =
((atom*)schname->l)->data.val.sval;
- char *seq_name =
((atom*)seqname->l)->data.val.sval;
+ if (sch_name && seq_name) {
sql_schema *sche = mvc_bind_schema(sql,
sch_name);
- sql_sequence *seq = find_sql_sequence(sche,
seq_name);
+ if (sche) {
+ sql_sequence *seq =
find_sql_sequence(sche, seq_name);
+ if (seq)
+ cond_append(l, &seq->base.id);
+ }
+ }
+ }
+ } break;
+ case e_aggr: {
+ sql_subfunc *a = e->f;
- cond_append(l, &seq->base.id);
+ if (e->l && exps_deps(sql, e->l, refs, l) != 0)
+ return -1;
+ cond_append(l, &a->func->base.id);
+ } break;
+ case e_cmp: {
+ if (e->flag == cmp_or || e->flag == cmp_filter) {
+ if (e->flag == cmp_filter) {
+ sql_subfunc *f = e->f;
+ cond_append(l, &f->func->base.id);
}
- } break;
- case e_aggr: {
- sql_subfunc *a = e->f;
-
- if (e->l &&exps_deps(sql, e->l, refs, l) != 0)
+ if (exps_deps(sql, e->l, refs, l) != 0 ||
+ exps_deps(sql, e->r, refs, l) != 0)
return -1;
- cond_append(l, &a->func->base.id);
- } break;
- case e_cmp: {
- if (e->flag == cmp_or || e->flag == cmp_filter) {
- if (e->flag == cmp_filter) {
- sql_subfunc *f = e->f;
- cond_append(l, &f->func->base.id);
- }
- if (exps_deps(sql, e->l, refs, l) != 0 ||
- exps_deps(sql, e->r, refs, l) != 0)
- return -1;
- } else if (e->flag == cmp_in || e->flag == cmp_notin) {
- if (exp_deps(sql, e->l, refs, l) != 0 ||
- exps_deps(sql, e->r, refs, l) != 0)
- return -1;
- } else {
- if (exp_deps(sql, e->l, refs, l) != 0 ||
- exp_deps(sql, e->r, refs, l) != 0)
- return -1;
- if (e->f)
- return exp_deps(sql, e->f, refs, l);
- }
- } break;
+ } else if (e->flag == cmp_in || e->flag == cmp_notin) {
+ if (exp_deps(sql, e->l, refs, l) != 0 ||
+ exps_deps(sql, e->r, refs, l) != 0)
+ return -1;
+ } else {
+ if (exp_deps(sql, e->l, refs, l) != 0 ||
+ exp_deps(sql, e->r, refs, l) != 0)
+ return -1;
+ if (e->f)
+ return exp_deps(sql, e->f, refs, l);
+ }
+ } break;
}
return 0;
}
@@ -1850,7 +1850,7 @@ rel_deps(mvc *sql, sql_rel *r, list *ref
case op_update:
case op_delete:
if (rel_deps(sql, r->l, refs, l) != 0 ||
- rel_deps(sql, r->r, refs, l) != 0)
+ rel_deps(sql, r->r, refs, l) != 0)
return -1;
break;
case op_project:
diff --git a/sql/server/sql_partition.c b/sql/server/sql_partition.c
--- a/sql/server/sql_partition.c
+++ b/sql/server/sql_partition.c
@@ -279,14 +279,15 @@ bootstrap_partition_expression(mvc *sql,
if (r)
r = sql_processrelation(sql, r, 0, 0);
if (r) {
- node *n, *found = NULL;
list *id_l = rel_dependencies(sql, r);
- for (n = id_l->h ; n ; n = n->next) //remove the table
itself from the list of dependencies
+ /* remove the table itself from the list of
dependencies */
+ for (node *n = id_l->h ; n ; ) {
+ node *m = n->next;
if (*(sqlid *) n->data == mt->base.id)
- found = n;
- assert(found);
- list_remove_node(id_l, found);
- mvc_create_dependencies(sql, id_l, mt->base.id,
TABLE_DEPENDENCY);
+ list_remove_node(id_l, n);
+ n = m;
+ }
+ mvc_create_dependencies(sql, id_l, mt->base.id,
FUNC_DEPENDENCY);
}
}
diff --git a/sql/test/SQLancer/Tests/sqlancer02.sql
b/sql/test/SQLancer/Tests/sqlancer02.sql
--- a/sql/test/SQLancer/Tests/sqlancer02.sql
+++ b/sql/test/SQLancer/Tests/sqlancer02.sql
@@ -314,6 +314,30 @@ EXCEPT (SELECT ALL ((CASE 0.1 WHEN 0.2 T
WHERE (3.0) IS NOT NULL; --error
ROLLBACK;
+CREATE TEMP TABLE mycount(cc BIGINT) ON COMMIT PRESERVE ROWS;
+INSERT INTO mycount SELECT COUNT(*) FROM sys.dependencies;
+
CREATE TABLE t0(c0 int AUTO_INCREMENT,c1 STRING);
+SELECT COUNT(*) > (SELECT cc FROM mycount) FROM sys.dependencies;
+ -- True
ALTER TABLE t0 DROP c0 CASCADE;
DROP TABLE t0;
+
+SELECT CAST(COUNT(*) - (SELECT cc FROM mycount) AS BIGINT) FROM
sys.dependencies;
+ -- 0
+
+TRUNCATE mycount;
+INSERT INTO mycount SELECT COUNT(*) FROM sys.dependencies;
+
+CREATE FUNCTION myfunc() returns int return 1;
+CREATE TABLE t0(c0 int default myfunc(),c1 STRING);
+SELECT COUNT(*) > (SELECT cc FROM mycount) FROM sys.dependencies;
+ -- True
+ALTER TABLE t0 DROP c0 CASCADE;
+DROP TABLE t0;
+DROP FUNCTION myfunc();
+
+SELECT CAST(COUNT(*) - (SELECT cc FROM mycount) AS BIGINT) FROM
sys.dependencies;
+ -- 0
+
+DROP TABLE mycount;
diff --git a/sql/test/SQLancer/Tests/sqlancer02.stable.out
b/sql/test/SQLancer/Tests/sqlancer02.stable.out
--- a/sql/test/SQLancer/Tests/sqlancer02.stable.out
+++ b/sql/test/SQLancer/Tests/sqlancer02.stable.out
@@ -1307,6 +1307,46 @@ stdout of test 'sqlancer02` in directory
% 3 # length
[ 896 ]
#ROLLBACK;
+#CREATE TEMP TABLE mycount(cc BIGINT) ON COMMIT PRESERVE ROWS;
+#INSERT INTO mycount SELECT COUNT(*) FROM sys.dependencies;
+[ 1 ]
+#CREATE TABLE t0(c0 int AUTO_INCREMENT,c1 STRING);
+#SELECT COUNT(*) > (SELECT cc FROM mycount) FROM sys.dependencies;
+% .%3 # table_name
+% %3 # name
+% boolean # type
+% 5 # length
+[ true ]
+#ALTER TABLE t0 DROP c0 CASCADE;
+#DROP TABLE t0;
+#SELECT CAST(COUNT(*) - (SELECT cc FROM mycount) AS BIGINT) FROM
sys.dependencies;
+% .%3 # table_name
+% %3 # name
+% bigint # type
+% 1 # length
+[ 0 ]
+#TRUNCATE mycount;
+[ 1 ]
+#INSERT INTO mycount SELECT COUNT(*) FROM sys.dependencies;
+[ 1 ]
+#CREATE FUNCTION myfunc() returns int return 1;
+#CREATE TABLE t0(c0 int default myfunc(),c1 STRING);
+#SELECT COUNT(*) > (SELECT cc FROM mycount) FROM sys.dependencies;
+% .%3 # table_name
+% %3 # name
+% boolean # type
+% 5 # length
+[ true ]
+#ALTER TABLE t0 DROP c0 CASCADE;
+#DROP TABLE t0;
+#DROP FUNCTION myfunc();
+#SELECT CAST(COUNT(*) - (SELECT cc FROM mycount) AS BIGINT) FROM
sys.dependencies;
+% .%3 # table_name
+% %3 # name
+% bigint # type
+% 1 # length
+[ 0 ]
+#DROP TABLE mycount;
# 17:04:12 >
# 17:04:12 > "Done."
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list