[
https://issues.apache.org/jira/browse/PHOENIX-2886?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15297858#comment-15297858
]
Sergey Soldatov commented on PHOENIX-2886:
------------------------------------------
[~aliciashu] as [~jamestaylor] mentioned, we need to track max scale and sort
order. and select the best of them. MaxLength is better to keep as Integer, but
not int.
I also checked the case with {{select id, cast('foo' as char(10)) firstname,
lastname from person;}}
There is a couple surprises. First of all, at the first glance we don't need
any coerce expressions here since firstname is char(10) as well as 'foo' with
cast expression. But. actually cast('foo' as char(10)) become to coerce
expression {{TO_CHAR('foo')}} with type PChar and max length 3 (!). So, when we
try to get value using outer schema which has PChar with max length 10, we are
getting troubles. First that came to my mind is to add an additional coerce if
lengths are different. But here is an another surprise - {{PChar.coerceBytes}}
is calling {{PDataType.coerceBytes}} which is not taking in consideration
desiredMaxLength in the case of the same data types.
As a possible solution we can change {{PChar.coerceBytes}} to extend ptr to
desired size.
So, there is no need to remove existing expressions. It will simplify code. I
would also simplify how TargetDataExpressions is collected. I used a simple
code
{noformat}
private static List<TargetDataExpression> checkit (List<QueryPlan>
selectPlans) throws SQLException {
int columnCount = selectPlans.get(0).getProjector().getColumnCount();
List<TargetDataExpression> result = new ArrayList<>(columnCount);
for (int i = 0; i < columnCount; i++) {
for (QueryPlan plan : selectPlans) {
ColumnProjector cp = plan.getProjector().getColumnProjector(i);
if(result.size() < i+1 ) {
result.add(new TargetDataExpression(cp));
} else {
result.get(i).update(cp);
}
}
}
return result;
}
{noformat}
You don't need an additional cycle to check values, all logic for choosing best
expression/length/order/scale can be hidden in {{update()}} as well as there is
no need to modify constructor calls if something is need to be added (like
scale/order)
> Union ALL with Char column not present in the table in Query 1 but in Query
> 2 throw exception
> ----------------------------------------------------------------------------------------------
>
> Key: PHOENIX-2886
> URL: https://issues.apache.org/jira/browse/PHOENIX-2886
> Project: Phoenix
> Issue Type: Bug
> Reporter: Alicia Ying Shu
> Assignee: Alicia Ying Shu
> Fix For: 4.8.0
>
> Attachments: PHOENIX-2886-v1.patch, PHOENIX-2886-v2.patch,
> PHOENIX-2886-v3.patch, PHOENIX-2886.patch, UnionAllIT.java.diff
>
>
> To reproduce:
> create table person ( id bigint not null primary key, firstname char(10),
> lastname varchar(10) );
> upsert into person values( 1, 'john', 'doe');
> upsert into person values( 2, 'jane', 'doe');
> -- fixed value for char(10)
> select id, 'foo' firstname, lastname from person union all select * from
> person;
> java.lang.RuntimeException: java.sql.SQLException: ERROR 201 (22000): Illegal
> data. Expected length of at least 106 bytes, but had 13
> -- fixed value for bigint
> select cast( 10 AS bigint) id, 'foo' firstname, lastname from person union
> all select * from person;
> java.lang.RuntimeException: java.sql.SQLException: ERROR 201 (22000): Illegal
> data. Expected length of at least 106 bytes, but had 13
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)