Changeset: 964686a4bd1b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=964686a4bd1b Modified Files: monetdb5/optimizer/opt_postfix.c sql/server/sql_semantic.c sql/test/Tests/in.test Branch: default Log Message:
Clob is bigger than (var)char. Also fix opt_postfix optimizer with mitosis 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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list