Changeset: d6791fc37829 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=d6791fc37829
Modified Files:
        sql/backends/monet5/sql.c
        sql/server/rel_exp.c
        sql/server/rel_rel.c
        sql/test/SQLancer/Tests/sqlancer02.sql
        sql/test/SQLancer/Tests/sqlancer02.stable.out
        sql/test/SQLancer/Tests/sqlancer02.test
        sql/test/merge-partitions/Tests/mergepart21.stable.err
        sql/test/merge-partitions/Tests/mergepart23.SQL.py
        sql/test/merge-partitions/Tests/mergepart23.stable.err
        sql/test/orderidx/Tests/simpletable.sql
        sql/test/orderidx/Tests/simpletable.stable.out
        sql/test/orderidx/Tests/simpletable.test
        sql/test/orderidx/Tests/smalltable.sql
        sql/test/orderidx/Tests/smalltable.stable.out
        sql/test/orderidx/Tests/smalltable.test
        testing/Mconvert.py.in
        testing/Mz.py.in
Branch: default
Log Message:

Merged with Oct2020


diffs (truncated from 1763 to 300 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
@@ -337,8 +337,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);
@@ -353,8 +354,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_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -2963,6 +2963,7 @@ exp_check_type(mvc *sql, sql_subtype *t,
                }
        }
        if (err) {
+               const char *name = (exp->type == e_column && !has_label(exp)) ? 
exp_name(exp) : "%";
                sql_exp *res = sql_error( sql, 03, SQLSTATE(42000) "types 
%s(%u,%u) and %s(%u,%u) are not equal%s%s%s",
                        fromtype->type->sqlname,
                        fromtype->digits,
@@ -2970,9 +2971,9 @@ exp_check_type(mvc *sql, sql_subtype *t,
                        t->type->sqlname,
                        t->digits,
                        t->scale,
-                       (exp->type == e_column && !has_label(exp) ? " for 
column '" : ""),
-                       (exp->type == e_column && !has_label(exp) ? 
exp_name(exp) : ""),
-                       (exp->type == e_column && !has_label(exp) ? "'" : "")
+                       (name[0] != '%' ? " for column '" : ""),
+                       (name[0] != '%' ? name : ""),
+                       (name[0] != '%' ? "'" : "")
                );
                return res;
        }
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,54 +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);
-                               assert(sche && seq);
-
-                               cond_append(l, &seq->base.id);
+                               if (sche) {
+                                       sql_sequence *seq = 
find_sql_sequence(sche, seq_name);
+                                       if (seq)
+                                               cond_append(l, &seq->base.id);
+                               }
                        }
-               } break;
+               }
+       } break;
        case e_aggr: {
-                       sql_subfunc *a = e->f;
+               sql_subfunc *a = e->f;
 
-                       if (e->l &&exps_deps(sql, e->l, refs, l) != 0)
-                               return -1;
-                       cond_append(l, &a->func->base.id);
-               } break;
+               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);
-                               }
-                               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);
+               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;
+                       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;
        }
        return 0;
 }
@@ -1851,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
@@ -274,20 +274,16 @@ bootstrap_partition_expression(mvc *sql,
 
        if (instantiate) {
                r = rel_project(sql->sa, r, NULL);
-               exp = rel_project_add_exp(sql, r, exp);
+               sql_rel *base = r->l, *nr = r;
+               r->l = NULL; /* omit table from list of dependencies */
+               (void) rel_project_add_exp(sql, r, exp);
 
-               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
-                               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);
+               nr = sql_processrelation(sql, nr, 0, 0);
+               if (nr) {
+                       list *id_l = rel_dependencies(sql, nr);
+                       mvc_create_dependencies(sql, id_l, mt->base.id, 
FUNC_DEPENDENCY);
                }
+               r->l = base;
        }
 
        return msg;
@@ -318,8 +314,15 @@ initialize_sql_parts(mvc *sql, sql_table
 
        find_partition_type(&found, mt);
        localtype = found.type->localtype;
-       if (isPartitionedByExpressionTable(mt)) /* Propagate type to outer 
transaction table */
+       if (isPartitionedByExpressionTable(mt)) { /* Propagate type and columns 
to outer transaction table */
                mt->po->part.pexp->type = mt->part.pexp->type;
+               assert(list_empty(mt->po->part.pexp->cols));
+               for (node *n = mt->part.pexp->cols->h ; n ; n = n->next) {
+                       int *cnr = sa_alloc(mt->po->part.pexp->cols->sa, 
sizeof(int));
+                       *cnr = *(int*)n->data;
+                       list_append(mt->po->part.pexp->cols, cnr);
+               }
+       }
 
        if (localtype != TYPE_str && mt->members && list_length(mt->members)) {
                list *new = sa_list(tr->sa), *old = sa_list(tr->sa);
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
@@ -281,3 +281,86 @@ 0.3672199296718357
 update t2 set c1 = (scale_down(t2.c1, 
0.39861114390109142480156378951505757868289947509765625))
 where (scale_up(-1155480997, 0.5434124050282382)) is not null;
 ROLLBACK;
+
+START TRANSACTION;
+CREATE TABLE "sys"."t1" ("c0" BOOLEAN NOT NULL,"c1" DECIMAL(18,3) NOT 
NULL,CONSTRAINT "t1_c0_c1_pkey" PRIMARY KEY ("c0", "c1"));
+COPY 8 RECORDS INTO "sys"."t1" FROM stdin USING DELIMITERS E'\t',E'\n','"';
+false  0.970
+true   0.249
+false  0.901
+true   0.416
+true   0.150
+true   -1.000
+true   0.305
+false  0.310
+
+CREATE TABLE "sys"."t2" ("c0" DOUBLE NOT NULL,"c1" CHAR(21),"c2" DOUBLE);
+COPY 16 RECORDS INTO "sys"."t2" FROM stdin USING DELIMITERS E'\t',E'\n','"';
+1      NULL    NULL
+1      NULL    NULL
+0.20096332264638103    NULL    -8177017368
+0.6291712421744081     NULL    3
+0.5608280161984844     "\n)GV3\n4w,"   NULL
+0.2283066361977384     "DoiQ2" NULL
+0.4162827659910059     ""      NULL
+0.7076516986629799     "2"     NULL
+0.0724600616400724     "true"  9
+0.03951652412329898    ""      1.5639034457363068
+0.4631650256727575     "0.10356338203734772"   0.2836868317291048
+-7.88997488    NULL    NULL
+0.9604713389860059     NULL    NULL
+0.7959037091231439     NULL    NULL
+0.38681017904242443    NULL    NULL
+-4.411138449465319     NULL    NULL
+
+SELECT ALL t1.c0 FROM t1, t2 CROSS JOIN ((SELECT "isauuid"(COALESCE(t2.c1, 
t2.c1)) FROM t2 WHERE ((((((((((TRUE)AND(TRUE)))OR
+(TRUE)))OR(TRUE)))OR(FALSE)))AND(TRUE))) EXCEPT ALL (SELECT ALL ((CASE 
0.54967607103225102349597364082001149654388427734375
+WHEN 0.05049592582495154857724628527648746967315673828125 THEN t2.c2 
END)>(greatest(t2.c2, t2.c0))) FROM t2
+RIGHT OUTER JOIN (SELECT ALL l1t1.c0, CASE WHEN l1t1.c0 THEN l1t1.c0 WHEN 
l1t1.c0 THEN l1t1.c0 WHEN l1t1.c0
+THEN l1t1.c0 END FROM t2 AS l1t2, t1 AS l1t1 WHERE l1t1.c0) AS sub0 ON 
((FALSE)OR(TRUE))
+CROSS JOIN (VALUES (r'-|cQ5', least(6, 4), CASE 0.13214429 WHEN 
0.92287980834693872367324729566462337970733642578125
+THEN r'Bv*氅.x' END), (r'', 0.7763767959438655, "insert"(r'RR6Mw+', 5, 
-65604773, r'1225096844'))) AS sub1)) AS sub0
+CROSS JOIN (VALUES (2, ((0.53827864)>>("day"(DATE '1969-12-27'))), 
CAST(((2)+(-1758578278)) AS REAL))) AS sub1
+WHERE (3.0) IS NOT NULL;
+
+SELECT CAST(SUM(count) AS BIGINT) FROM (SELECT ALL CAST((3.0) IS NOT NULL AS 
INT) as count FROM t1, t2 CROSS JOIN
+((SELECT "isauuid"(COALESCE(t2.c1, t2.c1)) FROM t2 WHERE 
((((((((((TRUE)AND(TRUE)))OR(TRUE)))OR(TRUE)))OR(FALSE)))AND(TRUE)))
+EXCEPT ALL (SELECT ALL ((CASE 
0.54967607103225102349597364082001149654388427734375 WHEN 
0.05049592582495154857724628527648746967315673828125
+THEN t2.c2 END)>(greatest(t2.c2, t2.c0))) FROM t2 RIGHT OUTER JOIN (SELECT 
l1t1.c0, CASE WHEN l1t1.c0 THEN l1t1.c0
+WHEN l1t1.c0 THEN l1t1.c0 WHEN l1t1.c0 THEN l1t1.c0 END FROM t2 AS l1t2, t1 AS 
l1t1 WHERE l1t1.c0) AS sub0 ON ((FALSE)OR(TRUE))
+CROSS JOIN (VALUES (r'-|cQ5', least(6, 4), CASE 0.13214429 WHEN 
0.92287980834693872367324729566462337970733642578125
+THEN r'Bv*氅.x' END), (r'', 0.7763767959438655, "insert"(r'RR6Mw+', 5, 
-65604773, r'1225096844'))) AS sub1)) AS sub0
+CROSS JOIN (VALUES (2, ((0.53827864)>>("day"(DATE '1969-12-27'))), 
CAST(((2)+(-1758578278)) AS REAL))) AS sub1) as res;
+
+SELECT ALL t1.c0 FROM t1, t2 CROSS JOIN ((SELECT 1 FROM t2)
+EXCEPT (SELECT ALL ((CASE 0.1 WHEN 0.2 THEN t2.c2 END)>(greatest(t2.c2, 
t2.c0))) FROM t2)) AS sub0
+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;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to