Changeset: 0040aa1b780b for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0040aa1b780b
Modified Files:
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_scenario.c
        sql/server/rel_rel.c
        sql/server/rel_rel.h
        sql/server/rel_select.c
        sql/server/rel_select.h
        sql/server/rel_updates.c
        
sql/test/BugTracker-2010/Tests/ORDER_BY_over_UNION_EXCEPT_INTERSECT.Bug-2606.stable.out
        
sql/test/BugTracker-2012/Tests/rewrite_like_into_likesubselect.Bug-3179.stable.out
        sql/test/BugTracker-2017/Tests/one-plus-nil.Bug-6243.stable.out
Branch: default
Log Message:

fixed bug 6247

fixed problems with rewrite like


diffs (truncated from 669 to 300 lines):

diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -110,6 +110,8 @@ alter_table_add_table(mvc *sql, char *ms
                mt = mvc_bind_table(sql, ms, mtname);
        if (ps)
                pt = mvc_bind_table(sql, ps, ptname);
+       if (mt && (mt->type != tt_merge_table && mt->type != tt_replica_table))
+               return sql_message("42S02!ALTER TABLE: cannot add table '%s.%s' 
to table '%s.%s'", psname, ptname, msname, mtname);
        if (mt && pt) {
                char *msg;
                node *n = cs_find_id(&mt->tables, pt->base.id);
diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -322,7 +322,6 @@ static int
 
        /* remote.exec(q, "sql", "register", "mod", "name", "relational_plan", 
"signature"); */
        p = newInstruction(curBlk, remoteRef, execRef);
-       getArg(p,0) = newTmpVariable(curBlk,TYPE_any);
        p = pushArgument(curBlk, p, q);
        p = pushStr(curBlk, p, sqlRef);
        p = pushStr(curBlk, p, registerRef);
@@ -480,7 +479,7 @@ int
 backend_dumpstmt(backend *be, MalBlkPtr mb, sql_rel *r, int top, int add_end, 
char *query)
 {
        mvc *c = be->mvc;
-       InstrPtr q, querylog;
+       InstrPtr q, querylog = NULL;
        int old_mv = be->mvc_var;
        MalBlkPtr old_mb = be->mb;
        stmt *s;
@@ -488,23 +487,22 @@ backend_dumpstmt(backend *be, MalBlkPtr 
        
        // Always keep the SQL query around for monitoring
 
-       if( query == 0)
-               tt = t = GDKstrdup("-- no query");
-       else
+       if (query) {
                tt = t = GDKstrdup(query);
-       while (t && isspace((int) *t))
-               t++;
+               while (t && isspace((int) *t))
+                       t++;
 
-       querylog = q = newStmt(mb, querylogRef, defineRef);
-       if (q == NULL) {
+               querylog = q = newStmt(mb, querylogRef, defineRef);
+               if (q == NULL) {
+                       GDKfree(tt);
+                       return -1;
+               }
+               setVarType(mb, getArg(q, 0), TYPE_void);
+               setVarUDFtype(mb, getArg(q, 0));
+               q = pushStr(mb, q, t);
                GDKfree(tt);
-               return -1;
+               q = pushStr(mb, q, getSQLoptimizer(be->mvc));
        }
-       setVarType(mb, getArg(q, 0), TYPE_void);
-       setVarUDFtype(mb, getArg(q, 0));
-       q = pushStr(mb, q, t);
-       GDKfree(tt);
-       q = pushStr(mb, q, getSQLoptimizer(be->mvc));
 
        /* announce the transaction mode */
        q = newStmt(mb, sqlRef, "mvc");
@@ -514,7 +512,8 @@ backend_dumpstmt(backend *be, MalBlkPtr 
        be->mb = mb;
                s = sql_relation2stmt(be, r);
        if (!s) {
-               (void) pushInt(mb, querylog, mb->stop);
+               if (querylog)
+                       (void) pushInt(mb, querylog, mb->stop);
                return 0;
        }
 
@@ -535,7 +534,8 @@ backend_dumpstmt(backend *be, MalBlkPtr 
        }
        if (add_end)
                pushEndInstruction(mb);
-       (void) pushInt(mb, querylog, mb->stop);
+       if (querylog)
+               (void) pushInt(mb, querylog, mb->stop);
        return 0;
 }
 
@@ -845,9 +845,9 @@ backend_create_sql_func(backend *be, sql
                if (f->type == F_UNION)
                        curInstr = table_func_create_result(curBlk, curInstr, 
f, restypes);
                else
-                       setVarType(curBlk, 0, res->type.type->localtype);
+                       setArgType(curBlk, curInstr, 0, 
res->type.type->localtype);
        } else {
-               setVarType(curBlk, 0, TYPE_void);
+               setArgType(curBlk, curInstr, 0, TYPE_void);
        }
        setVarUDFtype(curBlk, 0);
 
@@ -905,7 +905,7 @@ backend_create_sql_func(backend *be, sql
                        retseen++;
        }
        if (i == curBlk->stop && retseen == 1 && f->type != F_UNION && 
!no_inline)
-               curBlk->inlineProp =1;
+               curBlk->inlineProp = 1;
        if (sideeffects)
                curBlk->unsafeProp = 1;
        /* optimize the code */
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -943,7 +943,8 @@ SQLparser(Client c)
 #endif
        m = be->mvc;
        m->type = Q_PARSE;
-       SQLtrans(m);
+       if (be->language != 'X')
+               SQLtrans(m);
        pstatus = m->session->status;
 
        /* sqlparse needs sql allocator to be available.  It can be NULL at
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
@@ -4,6 +4,7 @@
 #include "rel_exp.h"
 #include "rel_prop.h"
 #include "rel_remote.h"
+#include "sql_semantic.h"
 #include "sql_mvc.h"
 
 /* we don't name relations directly, but sometimes we need the relation
@@ -361,6 +362,29 @@ rel_setop(sql_allocator *sa, sql_rel *l,
 }
 
 sql_rel *
+rel_setop_check_types(mvc *sql, sql_rel *l, sql_rel *r, list *ls, list *rs, 
operator_type op) 
+{
+       list *nls = new_exp_list(sql->sa);
+       list *nrs = new_exp_list(sql->sa);
+       node *n, *m;
+
+       for (n = ls->h, m = rs->h; n && m; n = n->next, m = m->next) {
+               sql_exp *le = n->data;
+               sql_exp *re = m->data;
+
+               if ((rel_convert_types(sql, &le, &re, 1, type_set) < 0))
+                       return NULL;
+               append(nls, le);
+               append(nrs, re);
+       }
+       l = rel_project(sql->sa, l, nls);
+       r = rel_project(sql->sa, r, nrs);
+       set_processed(l);
+       set_processed(r);
+       return rel_setop(sql->sa, l, r, op);
+}
+
+sql_rel *
 rel_crossproduct(sql_allocator *sa, sql_rel *l, sql_rel *r, operator_type join)
 {
        sql_rel *rel = rel_create(sa);
@@ -1073,6 +1097,7 @@ sql_rel *
 rel_or(mvc *sql, sql_rel *l, sql_rel *r, list *oexps, list *lexps, list *rexps)
 {
        sql_rel *rel, *ll = l->l, *rl = r->l;
+       list *ls, *rs;
 
        assert(!lexps || l == r);
        if (l == r && lexps) { /* merge both lists */
@@ -1109,11 +1134,11 @@ rel_or(mvc *sql, sql_rel *l, sql_rel *r,
                return l;
        }
 
-       l = rel_project(sql->sa, l, rel_projections(sql, l, NULL, 1, 1));
-       r = rel_project(sql->sa, r, rel_projections(sql, r, NULL, 1, 1));
+       ls = rel_projections(sql, l, NULL, 1, 1);
+       rs = rel_projections(sql, r, NULL, 1, 1);
        set_processed(l);
        set_processed(r);
-       rel = rel_setop(sql->sa, l, r, op_union);
+       rel = rel_setop_check_types(sql, l, r, ls, rs, op_union);
        rel->exps = rel_projections(sql, rel, NULL, 1, 1);
        set_processed(rel);
        rel = rel_distinct(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
@@ -43,7 +43,9 @@ extern sql_rel *rel_inplace_setop(sql_re
 extern sql_rel *rel_inplace_project(sql_allocator *sa, sql_rel *rel, sql_rel 
*l, list *e);
 extern sql_rel *rel_inplace_groupby(sql_rel *rel, sql_rel *l, list 
*groupbyexps, list *exps );
 
+extern int rel_convert_types(mvc *sql, sql_exp **L, sql_exp **R, int 
scale_fixing, int tpe);
 extern sql_rel *rel_setop(sql_allocator *sa, sql_rel *l, sql_rel *r, 
operator_type setop);
+extern sql_rel *rel_setop_check_types(mvc *sql, sql_rel *l, sql_rel *r, list 
*ls, list *rs, operator_type op);
 extern sql_rel *rel_crossproduct(sql_allocator *sa, sql_rel *l, sql_rel *r, 
operator_type join);
 
 extern sql_rel *rel_topn(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
@@ -4978,41 +4978,23 @@ rel_setquery_(mvc *sql, sql_rel *l, sql_
        sql_rel *rel;
 
        if (!cols) {
-               list *ls, *rs, *nls, *nrs;
-               node *n, *m;
-               int changes = 0;
+               list *ls, *rs;
 
                l = rel_unique_names(sql, l);
                r = rel_unique_names(sql, r);
                ls = rel_projections(sql, l, NULL, 0, 1);
                rs = rel_projections(sql, r, NULL, 0, 1);
-               nls = new_exp_list(sql->sa);
-               nrs = new_exp_list(sql->sa);
-               for (n = ls->h, m = rs->h; n && m; n = n->next, m = m->next) {
-                       sql_exp *le = n->data, *lb = le;
-                       sql_exp *re = m->data, *rb = re;
-
-                       if ((rel_convert_types(sql, &le, &re, 1, type_set) < 0))
-                               return NULL;
-                       if (le != lb || re != rb)
-                               changes = 1;
-                       append(nls, le);
-                       append(nrs, re);
-               }
-               if (changes) {
-                       l = rel_project(sql->sa, l, nls);
-                       r = rel_project(sql->sa, r, nrs);
-                       set_processed(l);
-                       set_processed(r);
-               }
+               rel = rel_setop_check_types(sql, l, r, ls, rs, 
(operator_type)op);
+       } else {
+               rel = rel_setop(sql->sa, l, r, (operator_type)op);
        }
-       rel = rel_setop(sql->sa, l, r, (operator_type)op);
-       rel->exps = rel_projections(sql, rel, NULL, 0, 1);
-       set_processed(rel);
+       if (rel) {
+               rel->exps = rel_projections(sql, rel, NULL, 0, 1);
+               set_processed(rel);
+       }
        return rel;
 }
 
-
 static sql_rel *
 rel_setquery(mvc *sql, sql_rel *rel, symbol *q)
 {
diff --git a/sql/server/rel_select.h b/sql/server/rel_select.h
--- a/sql/server/rel_select.h
+++ b/sql/server/rel_select.h
@@ -24,7 +24,6 @@ extern sql_exp * rel_value_exp2(mvc *sql
 
 /* TODO rename to exp_check_type + move to rel_exp.mx */
 extern sql_exp *rel_check_type(mvc *sql, sql_subtype *t, sql_exp *exp, int 
tpe);
-extern int rel_convert_types(mvc *sql, sql_exp **L, sql_exp **R, int 
scale_fixing, int tpe);
 extern sql_exp *rel_unop_(mvc *sql, sql_exp *e, sql_schema *s, char *fname, 
int card);
 extern sql_exp *rel_binop_(mvc *sql, sql_exp *l, sql_exp *r, sql_schema *s, 
char *fname, int card);
 extern sql_exp *rel_nop_(mvc *sql, sql_exp *l, sql_exp *r, sql_exp *r2, 
sql_exp *r3, sql_schema *s, char *fname, int card);
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -925,6 +925,8 @@ update_table(mvc *sql, dlist *qname, dli
                                fnd = table_ref(sql, NULL, n->data.sym, 0);
                                if (fnd)
                                        res = rel_crossproduct(sql->sa, res, 
fnd, op_join);
+                               else
+                                       res = fnd;
                        }
                        if (!res) 
                                return NULL;
diff --git 
a/sql/test/BugTracker-2010/Tests/ORDER_BY_over_UNION_EXCEPT_INTERSECT.Bug-2606.stable.out
 
b/sql/test/BugTracker-2010/Tests/ORDER_BY_over_UNION_EXCEPT_INTERSECT.Bug-2606.stable.out
--- 
a/sql/test/BugTracker-2010/Tests/ORDER_BY_over_UNION_EXCEPT_INTERSECT.Bug-2606.stable.out
+++ 
b/sql/test/BugTracker-2010/Tests/ORDER_BY_over_UNION_EXCEPT_INTERSECT.Bug-2606.stable.out
@@ -61,20 +61,24 @@ Ready.
 % .plan # table_name
 % rel # name
 % clob # type
-% 45 # length
+% 47 # length
 project (
 | distinct union (
-| | group by (
-| | | project (
-| | | | table(sys.t2606a) [ t2606a.a ] COUNT 
-| | | ) [ t2606a.a ]
-| | ) [ t2606a.a ] [ t2606a.a ],
-| | group by (
-| | | project (
-| | | | table(sys.t2606b) [ t2606b.a ] COUNT 
-| | | ) [ t2606b.a ]
-| | ) [ t2606b.a ] [ t2606b.a ]
-| ) [ t2606a.a as L11.a ]
+| | project (
+| | | group by (
+| | | | project (
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to