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