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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list