Changeset: b25e8dc0bd4a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b25e8dc0bd4a
Branch: unlock
Log Message:
merged with default
diffs (79 lines):
diff --git a/monetdb5/optimizer/opt_postfix.c b/monetdb5/optimizer/opt_postfix.c
--- a/monetdb5/optimizer/opt_postfix.c
+++ b/monetdb5/optimizer/opt_postfix.c
@@ -73,22 +73,24 @@ OPTpostfixImplementation(Client cntxt, M
getArg(p, 5) ^= getArg(p, 4);
getArg(p, 4) ^= getArg(p, 5);
if (getFunctionId(p) ==
thetajoinRef) { /* swap the comparison */
- switch
(getVarConstant(mb, getArg(p, 6)).val.ival) {
+ ValRecord *x =
&getVarConstant(mb, getArg(p, 6)), cst = {.vtype = TYPE_int};
+ switch (x->val.ival) {
case JOIN_LT:
-
getVarConstant(mb, getArg(p, 6)).val.ival = JOIN_GE;
+ cst.val.ival =
JOIN_GE;
break;
case JOIN_LE:
-
getVarConstant(mb, getArg(p, 6)).val.ival = JOIN_GT;
+ cst.val.ival =
JOIN_GT;
break;
case JOIN_GT:
-
getVarConstant(mb, getArg(p, 6)).val.ival = JOIN_LE;
+ cst.val.ival =
JOIN_LE;
break;
case JOIN_GE:
-
getVarConstant(mb, getArg(p, 6)).val.ival = JOIN_LT;
+ cst.val.ival =
JOIN_LT;
break;
default:
- break;
+ cst.val.ival =
x->val.ival;
}
+ setArg(p, 6,
defConstant(mb, TYPE_int, &cst));
}
}
delArgument(p, p->retc -2);
diff --git a/sql/server/sql_semantic.c b/sql/server/sql_semantic.c
--- a/sql/server/sql_semantic.c
+++ b/sql/server/sql_semantic.c
@@ -963,7 +963,8 @@ result_datatype(sql_subtype *super, sql_
tpe = l->type->sqlname;
digits = (!r->digits)?0:l->digits;
} else { /* both */
- tpe = (l->type->base.id >
r->type->base.id)?l->type->sqlname:r->type->sqlname;
+ tpe = !strcmp(l->type->base.name,
"clob")?l->type->sqlname:!strcmp(r->type->base.name, "clob")?r->type->sqlname:
+ (l->type->base.id >
r->type->base.id)?l->type->sqlname:r->type->sqlname;
digits = (!l->digits||!r->digits)?0:sql_max(l->digits,
r->digits);
}
sql_find_subtype(super, tpe, digits, 0);
@@ -1035,8 +1036,17 @@ supertype(sql_subtype *super, sql_subtyp
lsuper = *r;
/* EC_STRING class is superior to EC_CHAR */
- if (i->type->base.id > r->type->base.id ||
- (EC_VARCHAR(i->type->eclass) && !EC_VARCHAR(r->type->eclass)) ||
i->type->eclass == EC_STRING) {
+ if (EC_VARCHAR(i->type->eclass) && EC_VARCHAR(r->type->eclass)) {
+ if (!strcmp(i->type->sqlname, "clob") ||
!strcmp(r->type->sqlname, "clob")) {
+ lsuper = !strcmp(i->type->sqlname, "clob") ? *i : *r;
+ radix = lsuper.type->radix;
+ tpe = lsuper.type->sqlname;
+ } else {
+ lsuper = i->type->base.id > r->type->base.id ? *i : *r;
+ radix = lsuper.type->radix;
+ tpe = lsuper.type->sqlname;
+ }
+ } else if (i->type->base.id > r->type->base.id ||
(EC_VARCHAR(i->type->eclass) && !EC_VARCHAR(r->type->eclass))) {
lsuper = *i;
radix = i->type->radix;
tpe = i->type->sqlname;
diff --git a/sql/test/Tests/in.test b/sql/test/Tests/in.test
--- a/sql/test/Tests/in.test
+++ b/sql/test/Tests/in.test
@@ -23,7 +23,7 @@ select i in (NULL,1) from tmp
1
NULL
-statement error 22018!conversion of string 'a' to type int failed.
+statement error
select i in (1,'a') from tmp
statement ok
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list