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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list