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

Reply via email to