Changeset: 24adc5a35ab0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/24adc5a35ab0
Modified Files:
sql/server/rel_optimizer.c
sql/server/rel_rel.c
sql/server/rel_rel.h
sql/server/rel_select.c
sql/server/rel_unnest.c
sql/test/emptydb/Tests/check.stable.out
sql/test/emptydb/Tests/check.stable.out.32bit
sql/test/emptydb/Tests/check.stable.out.int128
sql/test/merge-partitions/Tests/mergepart31.test
sql/test/mergetables/Tests/mergequery.test
sql/test/miscellaneous/Tests/simple_selects.test
sql/test/prepare/Tests/sqlancer_prepare.stable.out
sql/test/prepare/Tests/sqlancer_prepare.stable.out.int128
sql/test/prepare/Tests/subquery_prepare.stable.out
sql/test/sys-schema/Tests/webExamplesComparisonFunctionsOperators.test
sql/test/sys-schema/Tests/webExamplesLogicalFunctionsOperators.test
sql/test/sys-schema/Tests/webExamplesMathematicalFunctionsOperators.test
Branch: Jan2022
Log Message:
When generating dummy projections, make sure a label is added on the boolean
expression
diffs (truncated from 601 to 300 lines):
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -8925,7 +8925,7 @@ merge_table_prune_and_unionize(visitor *
}
if (list_empty(tables)) { /* No table passed the predicates, generate
dummy relation */
list *converted = sa_list(v->sql->sa);
- nrel = rel_project(v->sql->sa, NULL,
list_append(sa_list(v->sql->sa), exp_atom_bool(v->sql->sa, 1)));
+ nrel = rel_project_exp(v->sql, exp_atom_bool(v->sql->sa, 1));
nrel = rel_select(v->sql->sa, nrel, exp_atom_bool(v->sql->sa,
0));
for (node *n = mt_rel->exps->h ; n ; n = n->next) {
@@ -9324,7 +9324,7 @@ rel_remove_union_partitions(visitor *v,
if (left_zero_rows && right_zero_rows) {
/* generate dummy relation */
list *converted = sa_list(v->sql->sa);
- sql_rel *nrel = rel_project(v->sql->sa, NULL,
list_append(sa_list(v->sql->sa), exp_atom_bool(v->sql->sa, 1)));
+ sql_rel *nrel = rel_project_exp(v->sql,
exp_atom_bool(v->sql->sa, 1));
nrel = rel_select(v->sql->sa, nrel, exp_atom_bool(v->sql->sa,
0));
for (node *n = rel->exps->h ; n ; n = n->next) {
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
@@ -875,12 +875,12 @@ rel_project(sql_allocator *sa, sql_rel *
return rel;
}
-sql_rel*
-rel_project_exp(sql_allocator *sa, sql_exp *e)
+sql_rel *
+rel_project_exp(mvc *sql, sql_exp *e)
{
- sql_rel *rel = rel_project(sa, NULL, append(new_exp_list(sa), e));
-
- return rel;
+ if (!exp_name(e))
+ exp_label(sql->sa, e, ++sql->label);
+ return rel_project(sql->sa, NULL, list_append(sa_list(sql->sa), e));
}
sql_rel *
diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h
--- a/sql/server/rel_rel.h
+++ b/sql/server/rel_rel.h
@@ -91,7 +91,7 @@ extern sql_exp *rel_groupby_add_aggr(mvc
extern sql_rel *rel_select(sql_allocator *sa, sql_rel *l, sql_exp *e);
extern sql_rel *rel_groupby(mvc *sql, sql_rel *l, list *groupbyexps );
sql_export sql_rel *rel_project(sql_allocator *sa, sql_rel *l, list *e);
-extern sql_rel *rel_project_exp(sql_allocator *sa, sql_exp *e);
+extern sql_rel *rel_project_exp(mvc *sql, sql_exp *e);
extern sql_rel *rel_exception(sql_allocator *sa, sql_rel *l, sql_rel *r, list
*exps);
extern sql_rel *rel_relational_func(sql_allocator *sa, sql_rel *l, list *exps);
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -1638,7 +1638,7 @@ rel_compare_exp_(sql_query *query, sql_r
set_anti(e);
if (!rel)
- return rel_select(sql->sa, rel_project_exp(sql->sa,
exp_atom_bool(sql->sa, 1)), e);
+ return rel_select(sql->sa, rel_project_exp(sql,
exp_atom_bool(sql->sa, 1)), e);
/* atom or row => select */
if (ls->card > rel->card || rs->card > rel->card || (rs2 && rs2->card >
rel->card)) {
@@ -5650,7 +5650,7 @@ rel_select_exp(sql_query *query, sql_rel
return sql_error(sql, 02, SQLSTATE(42000) "SELECT: the
selection or from part is missing");
if (!rel)
- rel = rel_project(sql->sa, NULL, append(new_exp_list(sql->sa),
exp_atom_bool(sql->sa, 1)));
+ rel = rel_project_exp(sql, exp_atom_bool(sql->sa, 1));
rel = rel_where_groupby_nodes(query, rel, sn, &group_totals);
if (sql->session->status) /* rel might be NULL as input, so we have to
check for the session status for errors */
return NULL;
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -1661,8 +1661,11 @@ rewrite_inner(mvc *sql, sql_rel *rel, sq
set_single(d);
} else if (is_project(rel->op)){ /* projection -> op_left */
if (rel->l || single || op == op_left) {
- if ((single || op == op_left) && !rel->l)
- rel->l = rel_project(sql->sa, rel->l,
append(sa_list(sql->sa), exp_atom_bool(sql->sa, 1)));
+ if ((single || op == op_left) && !rel->l) {
+ sql_exp *e = exp_atom_bool(sql->sa, 1);
+ exp_label(sql->sa, e, ++sql->label);
+ rel->l = rel_project(sql->sa, rel->l,
list_append(sa_list(sql->sa), e));
+ }
d = rel->l = rel_crossproduct(sql->sa, rel->l, inner,
op_left);
if (single)
set_single(d);
@@ -1696,7 +1699,7 @@ rewrite_exp_rel(visitor *v, sql_rel *rel
sql_rel *inner = exp_rel_get_rel(v->sql->sa, e);
if (is_single(inner)) {
/* use a dummy projection for the single join */
- sql_rel *nrel = rel_project(v->sql->sa, NULL,
append(sa_list(v->sql->sa), exp_atom_bool(v->sql->sa, 1)));
+ sql_rel *nrel = rel_project_exp(v->sql,
exp_atom_bool(v->sql->sa, 1));
if (!rewrite_inner(v->sql, nrel, inner,
depth?op_left:op_join, NULL))
return NULL;
@@ -1731,12 +1734,12 @@ rewrite_exp_rel(visitor *v, sql_rel *rel
static inline sql_rel *
rewrite_empty_project(visitor *v, sql_rel *rel)
{
- if (is_simple_project(rel->op) && list_empty(rel->exps)) {
+ if ((is_simple_project(rel->op) || is_groupby(rel->op)) &&
list_empty(rel->exps)) {
+ sql_exp *e = exp_atom_bool(v->sql->sa, 1);
+
+ exp_label(v->sql->sa, e, ++v->sql->label);
+ list_append(rel->exps, e);
v->changes++;
- append(rel->exps, exp_atom_bool(v->sql->sa, 1));
- } else if (is_groupby(rel->op) && list_empty(rel->exps)) {
- v->changes++;
- append(rel->exps, exp_atom_bool(v->sql->sa, 1));
}
return rel;
}
@@ -2682,7 +2685,7 @@ rewrite_anyequal(visitor *v, sql_rel *re
sql_rel *l = NULL, *rewrite = NULL;
if (rsq && lsq->card == CARD_ATOM &&
rsq->card == CARD_ATOM) { /* add project true */
lsq = rel_crossproduct(sql->sa,
lsq, rsq, op_full);
- lsq = rel_crossproduct(sql->sa,
rel_project_exp(sql->sa, exp_atom_bool(sql->sa, 1)), lsq, op_left);
+ lsq = rel_crossproduct(sql->sa,
rel_project_exp(sql, exp_atom_bool(sql->sa, 1)), lsq, op_left);
rsq = 0;
}
(void)rewrite_inner(sql, rel, lsq,
rel->card <= CARD_ATOM?op_left:op_join, &rewrite);
@@ -3502,8 +3505,11 @@ rewrite_groupings(visitor *v, sql_rel *r
}
append(pexps, ne);
}
- if (list_empty(exps))
- append(exps, exp_atom_bool(v->sql->sa,
1)); /* protection against empty projections */
+ if (list_empty(exps)) {
+ sql_exp *e = exp_atom_bool(v->sql->sa,
1);
+ exp_label(v->sql->sa, e,
++v->sql->label); /* protection against empty projections */
+ list_append(exps, e);
+ }
nrel->exps = exps;
if (!list_empty(rel->r) &&
!list_empty(nrel->r)) { /* aliases on grouping columns, ugh */
for (node *n = ((list*)nrel->r)->h ; n
; n = n->next) {
@@ -3518,8 +3524,11 @@ rewrite_groupings(visitor *v, sql_rel *r
list_hash_clear(nrel->r);
}
set_processed(nrel);
- if (list_empty(pexps))
- append(pexps, exp_atom_bool(v->sql->sa,
1)); /* protection against empty projections */
+ if (list_empty(pexps)) {
+ sql_exp *e = exp_atom_bool(v->sql->sa,
1);
+ exp_label(v->sql->sa, e,
++v->sql->label); /* protection against empty projections */
+ list_append(pexps, e);
+ }
nrel = rel_project(v->sql->sa, nrel, pexps);
set_processed(nrel);
@@ -3566,13 +3575,19 @@ rewrite_groupings(visitor *v, sql_rel *r
}
append(pexps, ne);
}
- if (list_empty(exps))
- append(exps, exp_atom_bool(v->sql->sa,
1)); /* protection against empty projections */
+ if (list_empty(exps)) {
+ sql_exp *e = exp_atom_bool(v->sql->sa,
1);
+ exp_label(v->sql->sa, e,
++v->sql->label); /* protection against empty projections */
+ list_append(exps, e);
+ }
nrel->exps = exps;
set_processed(nrel);
v->changes++;
- if (list_empty(pexps))
- append(pexps, exp_atom_bool(v->sql->sa,
1)); /* protection against empty projections */
+ if (list_empty(pexps)) {
+ sql_exp *e = exp_atom_bool(v->sql->sa,
1);
+ exp_label(v->sql->sa, e,
++v->sql->label); /* protection against empty projections */
+ list_append(pexps, e);
+ }
nrel = rel_project(v->sql->sa, nrel, pexps);
set_processed(nrel);
return nrel;
diff --git a/sql/test/emptydb/Tests/check.stable.out
b/sql/test/emptydb/Tests/check.stable.out
--- a/sql/test/emptydb/Tests/check.stable.out
+++ b/sql/test/emptydb/Tests/check.stable.out
@@ -6846,8 +6846,8 @@ select 'null in value_partitions.value',
% %171, %170, id # name
% char, bigint, int # type
% 17, 1, 1 # length
-% .%105, .%73, .var_values # table_name
-% %105, %73, var_name # name
+% .%105, .%104, .var_values # table_name
+% %105, %104, var_name # name
% char, bigint, char # type
% 24, 1, 16 # length
% .%2, sys.%1, sys.table_partitions # table_name
@@ -7998,8 +7998,8 @@ select 'null in value_partitions.value',
% %1, default_schema, name, fullname, default_schema, schema_path #
name
% char, int, varchar, varchar, int, clob # type
% 28, 1, 0, 0, 1, 0 # length
-% .%73, .var_values, .var_values, .var_values # table_name
-% %73, var_name, var_name, value # name
+% .%104, .var_values, .var_values, .var_values # table_name
+% %104, var_name, var_name, value # name
% char, char, char, varchar # type
% 27, 16, 16, 0 # length
% .%124, .var_values, .var_values, .var_values # table_name
diff --git a/sql/test/emptydb/Tests/check.stable.out.32bit
b/sql/test/emptydb/Tests/check.stable.out.32bit
--- a/sql/test/emptydb/Tests/check.stable.out.32bit
+++ b/sql/test/emptydb/Tests/check.stable.out.32bit
@@ -6846,8 +6846,8 @@ select 'null in value_partitions.value',
% %171, %170, id # name
% char, bigint, int # type
% 17, 1, 1 # length
-% .%105, .%73, .var_values # table_name
-% %105, %73, var_name # name
+% .%105, .%104, .var_values # table_name
+% %105, %104, var_name # name
% char, bigint, char # type
% 24, 1, 16 # length
% .%2, sys.%1, sys.table_partitions # table_name
@@ -7998,8 +7998,8 @@ select 'null in value_partitions.value',
% %1, default_schema, name, fullname, default_schema, schema_path #
name
% char, int, varchar, varchar, int, clob # type
% 28, 1, 0, 0, 1, 0 # length
-% .%73, .var_values, .var_values, .var_values # table_name
-% %73, var_name, var_name, value # name
+% .%104, .var_values, .var_values, .var_values # table_name
+% %104, var_name, var_name, value # name
% char, char, char, varchar # type
% 27, 16, 16, 0 # length
% .%124, .var_values, .var_values, .var_values # table_name
diff --git a/sql/test/emptydb/Tests/check.stable.out.int128
b/sql/test/emptydb/Tests/check.stable.out.int128
--- a/sql/test/emptydb/Tests/check.stable.out.int128
+++ b/sql/test/emptydb/Tests/check.stable.out.int128
@@ -7058,8 +7058,8 @@ select 'null in value_partitions.value',
% %171, %170, id # name
% char, bigint, int # type
% 17, 1, 1 # length
-% .%105, .%73, .var_values # table_name
-% %105, %73, var_name # name
+% .%105, .%104, .var_values # table_name
+% %105, %104, var_name # name
% char, bigint, char # type
% 24, 1, 16 # length
% .%2, sys.%1, sys.table_partitions # table_name
@@ -8210,8 +8210,8 @@ select 'null in value_partitions.value',
% %1, default_schema, name, fullname, default_schema, schema_path #
name
% char, int, varchar, varchar, int, clob # type
% 28, 1, 0, 0, 1, 0 # length
-% .%73, .var_values, .var_values, .var_values # table_name
-% %73, var_name, var_name, value # name
+% .%104, .var_values, .var_values, .var_values # table_name
+% %104, var_name, var_name, value # name
% char, char, char, varchar # type
% 27, 16, 16, 0 # length
% .%124, .var_values, .var_values, .var_values # table_name
diff --git a/sql/test/merge-partitions/Tests/mergepart31.test
b/sql/test/merge-partitions/Tests/mergepart31.test
--- a/sql/test/merge-partitions/Tests/mergepart31.test
+++ b/sql/test/merge-partitions/Tests/mergepart31.test
@@ -154,7 +154,7 @@ plan select 1 from splitted where stamp
----
project (
| select (
-| | [ boolean(1) "true" ]
+| | [ boolean(1) "true" as "%1"."%1" ]
| ) [ boolean(1) "false" ]
) [ tinyint(1) "1" ]
@@ -224,7 +224,7 @@ plan select 1 from splitted where stamp
----
project (
| select (
-| | [ boolean(1) "true" ]
+| | [ boolean(1) "true" as "%1"."%1" ]
| ) [ boolean(1) "false" ]
) [ tinyint(1) "1" ]
@@ -251,7 +251,7 @@ plan select 1 from splitted where stamp
----
project (
| select (
-| | [ boolean(1) "true" ]
+| | [ boolean(1) "true" as "%1"."%1" ]
| ) [ boolean(1) "false" ]
) [ tinyint(1) "1" ]
@@ -319,7 +319,7 @@ plan select 1 from splitted where stamp
----
project (
| select (
-| | [ boolean(1) "true" ]
+| | [ boolean(1) "true" as "%1"."%1" ]
| ) [ boolean(1) "false" ]
) [ tinyint(1) "1" ]
@@ -428,7 +428,7 @@ plan select 1 from splitted where stamp
----
project (
| select (
-| | [ boolean(1) "true" ]
+| | [ boolean(1) "true" as "%1"."%1" ]
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list