Changeset: 3855c9d79484 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3855c9d79484
Modified Files:
sql/backends/monet5/Tests/pyapi05.stable.out
sql/backends/monet5/Tests/rapi05.stable.out
sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_05.stable.out
sql/include/sql_relation.h
sql/server/rel_dump.c
sql/server/rel_exp.c
sql/server/rel_exp.h
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/BugDay_2005-12-19_2.9.3/Tests/cast_bigint_to_int.SF-1211903.stable.out
sql/test/BugTracker-2008/Tests/decimal_cast_in_view.SF-2075223.stable.out
sql/test/BugTracker-2013/Tests/numeric-column-alias.Bug-3279.stable.out
sql/test/BugTracker-2014/Tests/missing_alias.Bug-3626.stable.out
sql/test/BugTracker-2015/Tests/string-to-inet.Bug-3666.stable.out
sql/test/BugTracker-2016/Tests/convert-function-test-hge.Bug-3460.stable.out.int128
sql/test/BugTracker-2016/Tests/convert-function-test.Bug-3460.stable.out
sql/test/BugTracker-2016/Tests/convert-function-test.Bug-3460.stable.out.int128
sql/test/BugTracker-2017/Tests/sqlsmith.Bug-6219.stable.out
sql/test/BugTracker-2017/Tests/sqlsmith01.stable.out
sql/test/BugTracker-2018/Tests/convert-key.Bug-6648.stable.out
sql/test/BugTracker-2018/Tests/count_from_commented_function_signatures.Bug-6542.stable.out
sql/test/BugTracker-2019/Tests/prepare-types.Bug-6724.stable.out
sql/test/BugTracker/Tests/convert_dec2varchar.SF-1774312.stable.out
sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
sql/test/Tests/window_functions.stable.out
sql/test/bugs/Tests/cast_varchar2int-bug-sf-964165.stable.out
sql/test/mergetables/Tests/mergeinit.stable.err
sql/test/mergetables/Tests/sqlsmith-exists.stable.out
sql/test/pg_regress/Tests/date.stable.out
sql/test/pg_regress/Tests/int8.stable.out
sql/test/pg_regress/Tests/int8.stable.out.int128
sql/test/subquery/Tests/subquery3.sql
sql/test/subquery/Tests/subquery3.stable.out
sql/test/sys-schema/Tests/bam_tables_checks.stable.out
sql/test/sys-schema/Tests/check_MaxStrLength_violations.stable.out
Branch: default
Log Message:
restrict expression binding after the ast->relational phase, to binding on
exact matches only
make sure we can refer back to an expression within one project (needed for
expression
reuse, in window functions and case /when handleing
diffs (truncated from 14339 to 300 lines):
diff --git a/sql/backends/monet5/Tests/pyapi05.stable.out
b/sql/backends/monet5/Tests/pyapi05.stable.out
--- a/sql/backends/monet5/Tests/pyapi05.stable.out
+++ b/sql/backends/monet5/Tests/pyapi05.stable.out
@@ -48,7 +48,7 @@ stdout of test 'pyapi05` in directory 's
#};
#SELECT cluster FROM (SELECT MIN(x) AS minx, MAX(x) AS maxx, kmeans(x,5) AS
cluster FROM xdata
# GROUP BY cluster) as cdata ORDER BY cluster;
-% sys. # table_name
+% sys.cdata # table_name
% cluster # name
% int # type
% 1 # length
diff --git a/sql/backends/monet5/Tests/rapi05.stable.out
b/sql/backends/monet5/Tests/rapi05.stable.out
--- a/sql/backends/monet5/Tests/rapi05.stable.out
+++ b/sql/backends/monet5/Tests/rapi05.stable.out
@@ -31,7 +31,7 @@ stdout of test 'rapi05` in directory 'sq
#language R {kmeans(arg1,arg2)$cluster};
#SELECT cluster FROM (SELECT MIN(x) AS minx, MAX(x) AS maxx, kmeans(x,5) AS
cluster FROM xdata
# GROUP BY cluster) as cdata ORDER BY cluster;
-% sys. # table_name
+% sys.cdata # table_name
% cluster # name
% int # type
% 1 # length
diff --git a/sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_05.stable.out
b/sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_05.stable.out
--- a/sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_05.stable.out
+++ b/sql/backends/monet5/UDF/pyapi3/Tests/pyapi3_05.stable.out
@@ -48,7 +48,7 @@ stdout of test 'pyapi3_05` in directory
#};
#SELECT cluster FROM (SELECT MIN(x) AS minx, MAX(x) AS maxx, kmeans(x,5) AS
cluster FROM xdata
# GROUP BY cluster) as cdata ORDER BY cluster;
-% sys. # table_name
+% sys.cdata # table_name
% cluster # name
% int # type
% 1 # length
diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -37,7 +37,7 @@ typedef struct expression {
void *l;
void *r;
void *f; /* func's and aggr's, also e_cmp may have have 2
arguments */
- unsigned int
+ unsigned long
flag:16, /* cmp types, PSM types/level */
card:2, /* card (0 truth value!) (1 atoms) (2 aggr) (3 multi
value) */
freevar:4, /* free variable, ie binds to the upper dependent join
*/
@@ -50,6 +50,7 @@ typedef struct expression {
need_no_nil:1,
has_no_nil:1,
base:1,
+ ref:1, /* used to indicate an other expression may reference
this one */
used:1; /* used for quick dead code removal */
sql_subtype tpe;
void *p; /* properties for the optimizer */
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -1053,16 +1053,16 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
*e = 0;
cname = sa_strdup(sql->sa, b);
if (pexps) {
- exp = exps_bind_column(pexps, cname, &amb);
+ exp = exps_bind_column(pexps, cname, &amb, 1);
if (exp)
exp = exp_alias_or_copy(sql,
exp_relname(exp), cname, lrel, exp);
}
(void)amb;
assert(amb == 0);
if (!exp && lrel)
- exp = rel_bind_column(sql, lrel, cname, 0);
+ exp = rel_bind_column(sql, lrel, cname, 0, 1);
if (!exp && rrel)
- exp = rel_bind_column(sql, rrel, cname, 0);
+ exp = rel_bind_column(sql, rrel, cname, 0, 1);
*e = old;
skipWS(r,pos);
}
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
@@ -127,6 +127,7 @@ exp_create(sql_allocator *sa, int type )
e->need_no_nil = 0;
e->has_no_nil = 0;
e->base = 0;
+ e->ref = 0;
e->used = 0;
e->tpe.type = NULL;
e->tpe.digits = e->tpe.scale = 0;
@@ -623,6 +624,21 @@ exp_propagate(sql_allocator *sa, sql_exp
return ne;
}
+sql_exp *
+exp_ref_save(mvc *sql, sql_exp *e)
+{
+ if (is_atom(e->type))
+ return exp_copy(sql, e);
+ if (!exp_name(e) || is_convert(e->type))
+ exp_label(sql->sa, e, ++sql->label);
+ if (e->type != e_column)
+ e->ref = 1;
+ sql_exp *ne = exp_ref(sql->sa, e);
+ if (ne && is_freevar(e))
+ set_freevar(ne, is_freevar(e)-1);
+ return ne;
+}
+
sql_exp *
exp_alias(sql_allocator *sa, const char *arname, const char *acname, const
char *org_rname, const char *org_cname, sql_subtype *t, unsigned int card, int
has_nils, int intern)
{
@@ -1093,7 +1109,7 @@ exp_match_col_exps( sql_exp *e, list *l)
return exp_match_col_exps(e, re->l) &&
exp_match_col_exps(e, re->r);
- if (re->type != e_cmp || /*re->flag != cmp_equal ||*/ !re_r ||
re_r->card != 1 || !exp_match_exp(e, re->l))
+ if (re->type != e_cmp || !re_r || re_r->card != 1 ||
!exp_match_exp(e, re->l))
return 0;
}
return 1;
@@ -1486,7 +1502,7 @@ rel_find_exp_( sql_rel *rel, sql_exp *e)
if (e->l) {
ne = exps_bind_column2(rel->exps, e->l, e->r);
} else {
- ne = exps_bind_column(rel->exps, e->r, NULL);
+ ne = exps_bind_column(rel->exps, e->r, NULL, 1);
}
}
return ne;
@@ -1555,7 +1571,7 @@ rel_find_exp( sql_rel *rel, sql_exp *e)
else if (rel->exps && e->l)
ne = exps_bind_column2(rel->exps, e->l, e->r);
else if (rel->exps)
- ne = exps_bind_column(rel->exps, e->r, NULL);
+ ne = exps_bind_column(rel->exps, e->r, NULL, 1);
}
break;
case op_basetable:
@@ -2012,7 +2028,7 @@ exp_key( sql_exp *e )
}
sql_exp *
-exps_bind_column( list *exps, const char *cname, int *ambiguous )
+exps_bind_column( list *exps, const char *cname, int *ambiguous, int no_tname)
{
sql_exp *e = NULL;
@@ -2046,7 +2062,7 @@ exps_bind_column( list *exps, const char
for (; he; he = he->chain) {
sql_exp *ce = he->value;
- if (ce->alias.name &&
strcmp(ce->alias.name, cname) == 0) {
+ if (ce->alias.name &&
strcmp(ce->alias.name, cname) == 0 && (!no_tname || !ce->alias.rname)) {
if (e && e != ce &&
ce->alias.rname && e->alias.rname && strcmp(ce->alias.rname, e->alias.rname) !=
0 ) {
if (ambiguous)
*ambiguous = 1;
@@ -2063,7 +2079,7 @@ exps_bind_column( list *exps, const char
}
for (en = exps->h; en; en = en->next ) {
sql_exp *ce = en->data;
- if (ce->alias.name && strcmp(ce->alias.name, cname) ==
0) {
+ if (ce->alias.name && strcmp(ce->alias.name, cname) ==
0 && (!no_tname || !ce->alias.rname)) {
if (e && e != ce && ce->alias.rname &&
e->alias.rname && strcmp(ce->alias.rname, e->alias.rname) != 0 ) {
if (ambiguous)
*ambiguous = 1;
@@ -2110,8 +2126,7 @@ exps_bind_column2( list *exps, const cha
for (; he; he = he->chain) {
sql_exp *e = he->value;
- if ((e && is_column(e->type) &&
e->alias.name && e->alias.rname && strcmp(e->alias.name, cname) == 0 &&
strcmp(e->alias.rname, rname) == 0) ||
- (e && e->type == e_column &&
e->alias.name && !e->alias.rname && e->l && strcmp(e->alias.name, cname) == 0
&& strcmp(e->l, rname) == 0)) {
+ if (e && is_column(e->type) &&
e->alias.name && e->alias.rname && strcmp(e->alias.name, cname) == 0 &&
strcmp(e->alias.rname, rname) == 0) {
MT_lock_unset(&exps->ht_lock);
return e;
}
@@ -2126,8 +2141,6 @@ exps_bind_column2( list *exps, const cha
if (e && is_column(e->type) && e->alias.name &&
e->alias.rname && strcmp(e->alias.name, cname) == 0 && strcmp(e->alias.rname,
rname) == 0)
return e;
- if (e && e->type == e_column && e->alias.name &&
!e->alias.rname && e->l && strcmp(e->alias.name, cname) == 0 && strcmp(e->l,
rname) == 0)
- return e;
}
}
return NULL;
@@ -2241,7 +2254,7 @@ is_identity( sql_exp *e, sql_rel *r)
if (e->l)
re = exps_bind_column2(r->exps, e->l, e->r);
if (!re && has_label(e))
- re = exps_bind_column(r->exps, e->r, NULL);
+ re = exps_bind_column(r->exps, e->r, NULL, 1);
if (re)
return is_identity(re, r->l);
}
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -83,6 +83,7 @@ extern int have_nil(list *exps);
extern sql_exp * exp_column(sql_allocator *sa, const char *rname, const char
*name, sql_subtype *t, unsigned int card, int has_nils, int intern);
extern sql_exp * exp_propagate(sql_allocator *sa, sql_exp *ne, sql_exp *oe);
#define exp_ref(sa, e) exp_propagate(sa, exp_column(sa, exp_relname(e),
exp_name(e), exp_subtype(e), exp_card(e), has_nil(e), is_intern(e)), e)
+extern sql_exp * exp_ref_save(mvc *sql, sql_exp *e); /* if needed mark the
input expression as a referenced expression, return reference to e */
extern sql_exp * exp_alias(sql_allocator *sa, const char *arname, const char
*acname, const char *org_rname, const char *org_cname, sql_subtype *t, unsigned
int card, int has_nils, int intern);
extern sql_exp * exp_alias_or_copy( mvc *sql, const char *tname, const char
*cname, sql_rel *orel, sql_exp *old);
extern sql_exp * exp_alias_ref(mvc *sql, sql_exp *e);
@@ -163,7 +164,7 @@ extern int rel_has_all_exps(sql_rel *rel
extern sql_rel *find_rel(list *rels, sql_exp *e);
extern sql_rel *find_one_rel(list *rels, sql_exp *e);
-extern sql_exp *exps_bind_column( list *exps, const char *cname, int
*ambiguous);
+extern sql_exp *exps_bind_column( list *exps, const char *cname, int
*ambiguous, int no_tname /* set if expressions should be without a tname */);
extern sql_exp *exps_bind_column2( list *exps, const char *rname, const char
*cname);
extern sql_exp *exps_bind_alias( list *exps, const char *rname, const char
*cname);
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
@@ -67,7 +67,7 @@ name_find_column( sql_rel *rel, const ch
if (rname)
e = exps_bind_column2(rel->exps, rname, name);
else
- e = exps_bind_column(rel->exps, name, NULL);
+ e = exps_bind_column(rel->exps, name, NULL, 0);
if (!e || e->type != e_column)
return NULL;
if (e->l)
@@ -144,12 +144,12 @@ name_find_column( sql_rel *rel, const ch
if (rname)
alias = exps_bind_column2(rel->exps, rname, name);
else
- alias = exps_bind_column(rel->exps, name, NULL);
+ alias = exps_bind_column(rel->exps, name, NULL, 1);
if (is_groupby(rel->op) && alias && alias->type == e_column &&
rel->r) {
if (alias->l)
alias = exps_bind_column2(rel->r, alias->l,
alias->r);
else
- alias = exps_bind_column(rel->r, alias->r,
NULL);
+ alias = exps_bind_column(rel->r, alias->r,
NULL, 1);
}
if (is_groupby(rel->op) && !alias && rel->l) {
/* Group by column not found as alias in projection
@@ -211,7 +211,7 @@ list_find_exp( list *exps, sql_exp *e)
if (e->type != e_column)
return NULL;
if (( e->l && (ne=exps_bind_column2(exps, e->l, e->r)) != NULL) ||
- ((!e->l && (ne=exps_bind_column(exps, e->r, NULL)) != NULL)))
+ ((!e->l && (ne=exps_bind_column(exps, e->r, NULL, 1)) != NULL)))
return ne;
return NULL;
}
@@ -1235,7 +1235,7 @@ exp_rename(mvc *sql, sql_exp *e, sql_rel
ne = exps_bind_column2(f->exps, e->l, e->r);
/* if relation name matches expressions relation name,
find column based on column name alone */
} else {
- ne = exps_bind_column(f->exps, e->r, NULL);
+ ne = exps_bind_column(f->exps, e->r, NULL, 1);
}
if (!ne)
return e;
@@ -1243,7 +1243,7 @@ exp_rename(mvc *sql, sql_exp *e, sql_rel
if (exp_name(ne) && ne->r && ne->l)
e = rel_bind_column2(sql, t, ne->l, ne->r, 0);
if (!e && ne->r)
- e = rel_bind_column(sql, t, ne->r, 0);
+ e = rel_bind_column(sql, t, ne->r, 0, 1);
sql->session->status = 0;
sql->errstr[0] = 0;
if (!e && exp_is_atom(ne))
@@ -1349,14 +1349,14 @@ static sql_exp *
/* if relation name matches expressions relation name,
find column based on column name alone */
}
if (!ne && !e->l)
- ne = rel_bind_column(sql, f, e->r, 0);
+ ne = rel_bind_column(sql, f, e->r, 0, 1);
if (!ne || ne->type != e_column)
return NULL;
e = NULL;
if (ne->l && ne->r)
e = rel_bind_column2(sql, t, ne->l, ne->r, 0);
if (!e && ne->r && !ne->l)
- e = rel_bind_column(sql, t, ne->r, 0);
+ e = rel_bind_column(sql, t, ne->r, 0, 1);
sql->session->status = 0;
sql->errstr[0] = 0;
if (e && oe)
@@ -2046,7 +2046,7 @@ rel_rename_exps( mvc *sql, list *exps1,
if (e2->l)
ne = exps_bind_column2(exps2, e2->l, e2->r);
if (!ne && !e2->l)
- ne = exps_bind_column(exps2, e2->r, NULL);
+ ne = exps_bind_column(exps2, e2->r, NULL, 1);
if (ne) {
int p = list_position(exps2, ne);
@@ -2270,7 +2270,7 @@ exp_push_down_prj(mvc *sql, sql_exp *e,
if (e->l)
ne = exps_bind_column2(f->exps, e->l, e->r);
if (!ne && !e->l)
- ne = exps_bind_column(f->exps, e->r, NULL);
+ ne = exps_bind_column(f->exps, e->r, NULL, 1);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list