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