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

Reply via email to