[ 
https://issues.apache.org/jira/browse/DERBY-4695?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12883273#action_12883273
 ] 

Dag H. Wanvik edited comment on DERBY-4695 at 6/28/10 4:45 PM:
---------------------------------------------------------------

Uploading a patch, derby-4679-fixcolumnno-1a, which fixes the wrong column 
numbers, by assigning them at the same time as the tableNumber is bound, i.e. 
in the fromTable classes, rather than in ColumnReference#bindExpression. The 
fact that JoinNode replaces the RC, will then not affect the actually bound 
columnNumber like before.

Cf the enclosed trace patch which I have used to show what happens, 
trace-remapping.diff. This can be applied both with and without the patch 
proper.

I have ported the original DERBY-2526 query over to JoinTest#testDerby_4695 and 
added one more query, so there are two queries, let's call them a and b. 

The query tree after the bind phase before and after are attached as 
query-a-before.log and query-a-after.log. There have been normalized, so they 
can be diffed to see the net difference in binding, which is that the column 
reference BVW.C1 was 1,6 before the patch and 1,2 after the patch. 

For query a, we see the following trace of remappings done as a result of join 
flattening before the patch:

remapping CR: B3.C1 before: 0,1 after 5,1 null
remapping CR: B3.C9 before: 0,2 after 5,2 null
remapping CR: B3.C5 before: 0,3 after 5,3 null
remapping CR: B3.C6 before: 0,4 after 5,4 null
remapping CR: B4.C4 before: 6,2 after 6,2 null
remapping CR: B3.C1 before: 0,1 after 0,1 null
remapping CR: B3.C9 before: 0,2 after 0,2 null
remapping CR: B3.C5 before: 0,3 after 0,3 null
remapping CR: B3.C6 before: 0,4 after 0,4 null
remapping CR: BVW.C1 before: 1,6 after 1,2 B2   <-------- wrong input, but ends 
up correct



and the following after the patch:

remapping CR: B3.C1 before: 0,1 after 5,1 null
remapping CR: B3.C9 before: 0,2 after 5,2 null
remapping CR: B3.C5 before: 0,3 after 5,3 null
remapping CR: B3.C6 before: 0,4 after 5,4 null
remapping CR: B4.C4 before: 6,2 after 6,2 null
remapping CR: B3.C1 before: 0,1 after 0,1 null
remapping CR: B3.C9 before: 0,2 after 0,2 null
remapping CR: B3.C5 before: 0,3 after 0,3 null
remapping CR: B3.C6 before: 0,4 after 0,4 null
remapping CR: BVW.C1 before: 1,2 after 1,2 B2  <--- correct both before and 
after

For query b, which is a more complicated join, I also upload similar log files, 
query-b-before.log and query-b-after.log, which also only differ in their 
column reference BVW.C1 (several this time, since the column in used in more 
places). The query looks like this:

select b3.*, bvw.c1 from b3 inner join bvw on (b3.c1 = bvw.c5) 
                            inner join b4  on (bvw.c1 = b4.c7) 
                            inner join b  on (bvw.c1 = b.c1)
                            inner join b bcorr on bvw.c1 = bcorr.c1
    where b4.c4 = 42"

which is a bit meaningless, but exercises several flattenings involving bvw.c1. 
This query also gave a correct answer, but as we can see below, during the 
intermediate steps, the binding of RC ends up wrong (also one a la DERBY-4679, 
due to falling back on column name based matching: since the (tablenumber, 
column number) pair was wrong at the outset, and so made the new lookup method 
introduced for DERBY-4679 fail to do its job. I believe, although I haven't yet 
been able to prove it, that the wrong numbering could lead to bugs:

      - wrong or missing transitive closure computation since this is based     
    on (tn, cn)

      - lead to yet other wrong intermediate CRs (shown to happen thrice in the 
example below, although it doesn't lead to query error here) which could then 
in turn confuse transitive closure computation, as seen in DERBY-4679 (CR bound 
to wrong column instance in a JOIN RCL). Note that this represents another mode 
of "correct t-no, wrong col-no" happening: the primary issue here is the wrong 
binding in the bind phase, this second mode happens during rebinding in the 
optimizer's preprocess phase. I.e. error mode one leads to error mode 2, which 
has been shown to cause bugs.

Now, let us look at the differences for query b. Without the patch we see:

remapping CR: B3.C1 before: 0,1 after 9,1 null
remapping CR: B3.C9 before: 0,2 after 9,2 null
remapping CR: B3.C5 before: 0,3 after 9,3 null
remapping CR: B3.C6 before: 0,4 after 9,4 null
remapping CR: BVW.C1 before: 1,2 after 9,6 B2
remapping CR: B4.C4 before: 6,2 after 9,11 null
remapping CR: B3.C1 before: 0,1 after 7,1 null
remapping CR: B3.C9 before: 0,2 after 7,2 null
remapping CR: B3.C5 before: 0,3 after 7,3 null
remapping CR: B3.C6 before: 0,4 after 7,4 null
remapping CR: BVW.C1 before: 1,2 after 7,6 B2
remapping CR: B4.C4 before: 6,2 after 7,11 null
remapping CR: BVW.C1 before: 1,6 after 7,1 null <--- wrong!
remapping CR: B3.C1 before: 0,1 after 5,1 null
remapping CR: B3.C9 before: 0,2 after 5,2 null
remapping CR: B3.C5 before: 0,3 after 5,3 null
remapping CR: B3.C6 before: 0,4 after 5,4 null
remapping CR: BVW.C1 before: 1,2 after 5,6 B2
remapping CR: B4.C4 before: 6,2 after 6,2 null
remapping CR: BVW.C1 before: 1,6 after 5,1 null <--- wrong
remapping CR: BVW.C1 before: 1,6 after 5,1 null <--- wrong
remapping CR: B3.C1 before: 0,1 after 0,1 null
remapping CR: B3.C9 before: 0,2 after 0,2 null
remapping CR: B3.C5 before: 0,3 after 0,3 null
remapping CR: B3.C6 before: 0,4 after 0,4 null
remapping CR: BVW.C1 before: 1,2 after 1,2 B2
remapping CR: BVW.C1 before: 1,6 after 1,2 B2 <--- correct with wrong input 
(rescued ultimately!)
remapping CR: BVW.C1 before: 1,6 after 1,2 B2 <--- ditto
remapping CR: BVW.C1 before: 1,6 after 1,2 B2 <--- ditto

vs after the patch:

remapping CR: B3.C1 before: 0,1 after 9,1 null
remapping CR: B3.C9 before: 0,2 after 9,2 null
remapping CR: B3.C5 before: 0,3 after 9,3 null
remapping CR: B3.C6 before: 0,4 after 9,4 null
remapping CR: BVW.C1 before: 1,2 after 9,6 B2
remapping CR: B4.C4 before: 6,2 after 9,11 null
remapping CR: B3.C1 before: 0,1 after 7,1 null
remapping CR: B3.C9 before: 0,2 after 7,2 null
remapping CR: B3.C5 before: 0,3 after 7,3 null
remapping CR: B3.C6 before: 0,4 after 7,4 null
remapping CR: BVW.C1 before: 1,2 after 7,6 B2
remapping CR: B4.C4 before: 6,2 after 7,11 null
remapping CR: BVW.C1 before: 1,2 after 7,6 B2 <--- correct
remapping CR: B3.C1 before: 0,1 after 5,1 null
remapping CR: B3.C9 before: 0,2 after 5,2 null
remapping CR: B3.C5 before: 0,3 after 5,3 null
remapping CR: B3.C6 before: 0,4 after 5,4 null
remapping CR: BVW.C1 before: 1,2 after 5,6 B2
remapping CR: B4.C4 before: 6,2 after 6,2 null
remapping CR: BVW.C1 before: 1,2 after 5,6 B2 <--- correct
remapping CR: BVW.C1 before: 1,2 after 5,6 B2 <--- correct
remapping CR: B3.C1 before: 0,1 after 0,1 null
remapping CR: B3.C9 before: 0,2 after 0,2 null
remapping CR: B3.C5 before: 0,3 after 0,3 null
remapping CR: B3.C6 before: 0,4 after 0,4 null
remapping CR: BVW.C1 before: 1,2 after 1,2 B2
remapping CR: BVW.C1 before: 1,2 after 1,2 B2 <--- correct
remapping CR: BVW.C1 before: 1,2 after 1,2 B2 <--- correct
remapping CR: BVW.C1 before: 1,2 after 1,2 B2 <--- correct

As can be seen, the fact that BVW.C1 on the join condition is now correctly 
bound, makes the fix for DERBY-4679 kick in in yet another instance, and return 
(7,6) rather than (7,1) after the second flattening.

[ To see that (7,6) is correct, if we look inside the binding log file for 
query b, we see that table 7 corresponds to the join node with join clause 
BVW.C1 = B4.C7. This join has a RCL which is 12 columns long. We can see that 
RC (7,1) corresponds to B3.C1, which is wrong. After the patch, we see the 
binding is done to (9,6), which is correct, since that points to the correct RC 
in the RCL of table 7, that is a RC corresponding to RC in the join below, 
which ultimately stems from the subquery column BVW.C1. ]

So, we see from the trace that for each flattening, the binding for BVW.C1 
stays consistent during the flattening phases *with* the patch, whereas before 
it was wrong in several places, and also led to binding to the wrong RC in 
three cases, although the final flattening saved the day since the CR is then 
remapped against a RCL that had no duplicates in it - i.e. the subquery 
representing the view - so (1,6) finally became (1,2).

The patch ran regressions ok. While I haven't yet been able to prove that this 
issue could lead to query errors, I do think it could, for the reasons cited 
above. I therefore recommend we commit this patch as a defensive measure. If 
people think I should first be able to construct a wrong query, I can always 
try again.


      was (Author: dagw):
    Uploading a patch, derby-4679-fixcolumnno-1a, which fixes the wrong column 
numbers, by assigning them at the same time as the tableNumber is bound, i.e. 
in the fromTable classes, rather than in ColumnReference#bindExpression. The 
fact that JoinNode replaces the RC, will then not affect the actually bound 
columnNumber like before.

Cf the enclosed trace patch which I have used to show what happens, 
trace-remapping.diff. This can be applied both with and without the patch 
proper.

I have ported the original DERBY-2526 query over to JoinTest#testDerby_4695 and 
added one more query, so there are two queries, let's call them a and b. 

The query tree after the bind phase before and after are attached as 
query-a-before.log and query-a-after.log. There have been normalized, so they 
can be diffed to see the net difference in binding, which is that the column 
reference BVW.C1 was 1,6 before the patch and 1,2 after the patch. 

For query a, we see the following trace of remappings done as a result of join 
flattening before the patch:

remapping CR: B3.C1 before: 0,1 after 5,1 null
remapping CR: B3.C9 before: 0,2 after 5,2 null
remapping CR: B3.C5 before: 0,3 after 5,3 null
remapping CR: B3.C6 before: 0,4 after 5,4 null
remapping CR: B4.C4 before: 6,2 after 6,2 null
remapping CR: B3.C1 before: 0,1 after 0,1 null
remapping CR: B3.C9 before: 0,2 after 0,2 null
remapping CR: B3.C5 before: 0,3 after 0,3 null
remapping CR: B3.C6 before: 0,4 after 0,4 null
remapping CR: BVW.C1 before: 1,6 after 1,2 B2   <-------- wrong input, but ends 
up correct



and the following after the patch:

remapping CR: B3.C1 before: 0,1 after 5,1 null
remapping CR: B3.C9 before: 0,2 after 5,2 null
remapping CR: B3.C5 before: 0,3 after 5,3 null
remapping CR: B3.C6 before: 0,4 after 5,4 null
remapping CR: B4.C4 before: 6,2 after 6,2 null
remapping CR: B3.C1 before: 0,1 after 0,1 null
remapping CR: B3.C9 before: 0,2 after 0,2 null
remapping CR: B3.C5 before: 0,3 after 0,3 null
remapping CR: B3.C6 before: 0,4 after 0,4 null
remapping CR: BVW.C1 before: 1,2 after 1,2 B2  <--- correct both before and 
after

For query b, which is a more complicated join, I also upload similar log files, 
query-b-before.log and query-b-after.log, which also only differ in their 
column reference BVW.C1 (several this time, since the column in used in more 
places). The query looks like this:

select b3.*, bvw.c1 from b3 inner join bvw on (b3.c1 = bvw.c5) 
                            inner join b4  on (bvw.c1 = b4.c7) 
                            inner join b  on (bvw.c1 = b.c1)
                            inner join b bcorr on bvw.c1 = bcorr.c1
    where b4.c4 = 42"

which is a bit meaningless, but exercises several flattenings involving bvw.c1. 
This query also gave a correct answer, but as we can see, during the 
intermediate steps, the binding of RC ends up wrong (also one a la DERBY-4679, 
due to falling back on column name based matching: since the (tablenumber, 
column number) pair was wrong at the outset, and so made the new lookup method 
introduced for DERBY-4679 fail to do its job. I believe, although I haven't yet 
been able to prove it, that the wrong numbering could lead to bugs:

      - wrong or missing transitive closure computation since this is based     
    on (tn, cn)

      - lead to yet other wrong intermediate CRs (shown to happen thrice in the 
example below, although it doesn't lead to query error here) which could then 
in turn confuse transitive closure computation, as seen in DERBY-4679 (CR bound 
to wrong column instance in a JOIN RCL). Note that this represents another mode 
of "correct t-no, wrong col-no" happening: the primary issue here is the wrong 
binding in the bind phase, this second mode happens during rebinding in the 
optimizer's preprocess phase. I.e. error mode one leads to error mode 2, which 
has been shown to cause bugs.

Now, let us look at the differences for query b before the patch:

remapping CR: B3.C1 before: 0,1 after 9,1 null
remapping CR: B3.C9 before: 0,2 after 9,2 null
remapping CR: B3.C5 before: 0,3 after 9,3 null
remapping CR: B3.C6 before: 0,4 after 9,4 null
remapping CR: BVW.C1 before: 1,2 after 9,6 B2
remapping CR: B4.C4 before: 6,2 after 9,11 null
remapping CR: B3.C1 before: 0,1 after 7,1 null
remapping CR: B3.C9 before: 0,2 after 7,2 null
remapping CR: B3.C5 before: 0,3 after 7,3 null
remapping CR: B3.C6 before: 0,4 after 7,4 null
remapping CR: BVW.C1 before: 1,2 after 7,6 B2
remapping CR: B4.C4 before: 6,2 after 7,11 null
remapping CR: BVW.C1 before: 1,6 after 7,1 null <--- wrong!
remapping CR: B3.C1 before: 0,1 after 5,1 null
remapping CR: B3.C9 before: 0,2 after 5,2 null
remapping CR: B3.C5 before: 0,3 after 5,3 null
remapping CR: B3.C6 before: 0,4 after 5,4 null
remapping CR: BVW.C1 before: 1,2 after 5,6 B2
remapping CR: B4.C4 before: 6,2 after 6,2 null
remapping CR: BVW.C1 before: 1,6 after 5,1 null <--- wrong
remapping CR: BVW.C1 before: 1,6 after 5,1 null <--- wrong
remapping CR: B3.C1 before: 0,1 after 0,1 null
remapping CR: B3.C9 before: 0,2 after 0,2 null
remapping CR: B3.C5 before: 0,3 after 0,3 null
remapping CR: B3.C6 before: 0,4 after 0,4 null
remapping CR: BVW.C1 before: 1,2 after 1,2 B2
remapping CR: BVW.C1 before: 1,6 after 1,2 B2 <--- correct with wrong input 
(rescued ultimately!)
remapping CR: BVW.C1 before: 1,6 after 1,2 B2 <--- ditto
remapping CR: BVW.C1 before: 1,6 after 1,2 B2 <--- ditto

vs after the patch:

remapping CR: B3.C1 before: 0,1 after 9,1 null
remapping CR: B3.C9 before: 0,2 after 9,2 null
remapping CR: B3.C5 before: 0,3 after 9,3 null
remapping CR: B3.C6 before: 0,4 after 9,4 null
remapping CR: BVW.C1 before: 1,2 after 9,6 B2
remapping CR: B4.C4 before: 6,2 after 9,11 null
remapping CR: B3.C1 before: 0,1 after 7,1 null
remapping CR: B3.C9 before: 0,2 after 7,2 null
remapping CR: B3.C5 before: 0,3 after 7,3 null
remapping CR: B3.C6 before: 0,4 after 7,4 null
remapping CR: BVW.C1 before: 1,2 after 7,6 B2
remapping CR: B4.C4 before: 6,2 after 7,11 null
remapping CR: BVW.C1 before: 1,2 after 7,6 B2 <--- correct
remapping CR: B3.C1 before: 0,1 after 5,1 null
remapping CR: B3.C9 before: 0,2 after 5,2 null
remapping CR: B3.C5 before: 0,3 after 5,3 null
remapping CR: B3.C6 before: 0,4 after 5,4 null
remapping CR: BVW.C1 before: 1,2 after 5,6 B2
remapping CR: B4.C4 before: 6,2 after 6,2 null
remapping CR: BVW.C1 before: 1,2 after 5,6 B2 <--- correct
remapping CR: BVW.C1 before: 1,2 after 5,6 B2 <--- correct
remapping CR: B3.C1 before: 0,1 after 0,1 null
remapping CR: B3.C9 before: 0,2 after 0,2 null
remapping CR: B3.C5 before: 0,3 after 0,3 null
remapping CR: B3.C6 before: 0,4 after 0,4 null
remapping CR: BVW.C1 before: 1,2 after 1,2 B2
remapping CR: BVW.C1 before: 1,2 after 1,2 B2 <--- correct
remapping CR: BVW.C1 before: 1,2 after 1,2 B2 <--- correct
remapping CR: BVW.C1 before: 1,2 after 1,2 B2 <--- correct

As can be seen, the fact that BVW.C1 on the join condition is now correctly 
bound, makes the fix for DERBY-4679 kick in in yet another instance, and return 
(7,6) rather than (7,1) after the second flattening.

[ To see that (7,6) is correct, if we look inside the binding log file for 
query b, we see that table 7 corresponds to the join node with join clause 
BVW.C1 = B4.C7. This join has a RCL which is 12 columns long. We can see that 
RC (7,1) corresponds to B3.C1, which is wrong. After the patch, we see the 
binding is done to (9,6), which is correct, since that points to the correct RC 
in the RCL of table 7, that is a RC corresponding to RC in the join below, 
which ultimately stems from the subquery column BVW.C1. ]

So, we see from the trace that for each flattening, the binding for BVW.C1 
stays consistent during the flattening phases *with* the patch, whereas before 
it was wrong in several places, and also led to binding to the wrong RC in 
three cases, although the final flattening saved the day since the CR is then 
remapped against a RCL that had no duplicates in it - i.e. the subquery 
representing the view - so (1,6) finally became (1,2).

The patch ran regressions ok. While I haven't yet been able to prove that this 
issue could lead to query errors, I do think it could, for the reasons cited 
above. I therefore recommend we commit this patch as a defensive measure. If 
people think I should first be able to construct a wrong query, I can always 
try again.

  
> Internal assignment of tablenumer, columnnumber looks wrong in query tree, 
> although no ill effects are seen.
> ------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-4695
>                 URL: https://issues.apache.org/jira/browse/DERBY-4695
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.7.0.0
>            Reporter: Dag H. Wanvik
>            Assignee: Dag H. Wanvik
>            Priority: Minor
>         Attachments: derby-4695-fixcolumnno-1a.diff, 
> derby-4695-fixcolumnno-1a.stat, derby.log, query-a-after.log, 
> query-a-before.log, query-b-after.log, query-b-before.log, 
> trace-remapping.diff, why-ij-can-do-without-2nd-bind.txt, 
> why-loj-needs-2nd-bind.txt
>
>
> While looking into derby-4679, I also looked at the query in
> derby-2526 to validate that my changes also worked for that variant of
> the problem.
> During inspection of the query trees after the bind phase, I found one
> instance in which the pair (tablenumber, columnnumber) of a column
> reference was wrong. Although it did not seem to impact the query
> result, I note it here as as something we should probably investiate
> as it may be a symptom an underlying problem, or a potential for
> future problems.
> The query looks like this:
> select b3.* from b3 join bvw on (b3.c8 = bvw.c5) join b4 on (bvw.c1 = b4.c7) 
> where b4.c4 = 42"
> and the underlying DDL is this:
> create table b2 (c1 int, c2 int, c3 char(1), c4 int, c5 int, c6 int);
> create table b4 (c7 int, c4 int, c6 int);
> create table b3 (c8 int, c9 int, c5 int, c6 int);
> create table b (c1 int, c2 int, c3 char(1), c4 int, c5 int, c6 int);
> create view bvw (c5, c1 ,c2 ,c3 ,c4) as
> select c5, c1 ,c2 ,c3 ,c4 from b2 union
> select c5, c1 ,c2 ,c3 ,c4 from b;
> create view bvw2 (c1 ,c2 ,c3 ,c4 ,c5) as
> After the bind phase, the join clause "bvw.c1 = b4.c7" has the
> following entry for the column reference bvw.C1:
>           
>           tableNumber: 1
>           columnNumber: 6
> The problem is that the node with tablenumber 1 is bvw, which is the
> view with the subquery for the union, which has only 5 resulting
> columns, so 6 must be wrong. Although both the view participant tables
> (b, b2) both have six column, the view does not. In any case, C1 is
> column 2 in the view and column 2 in the two union selects from both b
> and b2.
> C1 is however, column 6 of the join node resulting from "select b3.*
> from b3 join bvw on (b3.c8 = bvw.c5)", but the correct table number for
> that would be 5, not 1.
> So, it would seem the table number has been bound to the bvw view's
> result set, but the column number has been bound to the innermost join
> node's result set. This looks worrying to me.
> See derby.log attached for the full dump of the query tree after the
> bind phase.
> sourceResultSet:                                    
>     org.apache.derby.impl.sql.compile.fromsubqu...@12789d2
>     correlation Name: BVW
>     null
>     tableNumber 1 <------------------------------------------- Note!
>     level 0
>     resultSetNumber: 0
>     referencedTableMap: null
>     statementResultSet: false
>     resultColumns:                                      
>         org.apache.derby.impl.sql.compile.resultcolumnl...@c943d1
>         indexRow: false
>         orderBySelect: 0
>         [0]:                                        
>         org.apache.derby.impl.sql.compile.resultcol...@d3c6a3
>         ***truncated***
>         [1]:                                        
>         org.apache.derby.impl.sql.compile.resultcol...@18352d8
>         exposedName: C1
>         name: C1
>         tableName: null
>         isDefaultColumn: false
>         wasDefaultColumn: false
>         isNameGenerated: false
>         sourceTableName: B2
>         type: INTEGER
>         columnDescriptor: null
>         isGenerated: false
>         isGeneratedForUnmatchedColumnInInsert: false
>         isGroupingColumn: false
>         isReferenced: true
>         isRedundant: false
>         virtualColumnId: 2
>         resultSetNumber: -1
>         dataTypeServices: INTEGER
>         expression:                                         
>             org.apache.derby.impl.sql.compile.virtualcolumnn...@b40ec4
>             dataTypeServices: null
>             sourceColumn:                                               
>                 org.apache.derby.impl.sql.compile.resultcol...@1d95da8
>                 ***truncated***
>             sourceResultSet:                                                
>                 org.apache.derby.impl.sql.compile.unionn...@14d7745
>                 ***truncated***
>         [2]:                                        
>         org.apache.derby.impl.sql.compile.resultcol...@13576a2
>         exposedName: C2
>         name: C2
>         tableName: null
>         isDefaultColumn: false
>         wasDefaultColumn: false
>         isNameGenerated: false
>         sourceTableName: B2
>         type: INTEGER
>         columnDescriptor: null
>         isGenerated: false
>         isGeneratedForUnmatchedColumnInInsert: false
>         isGroupingColumn: false
>         isReferenced: true
>         isRedundant: false
>         virtualColumnId: 3
>         resultSetNumber: -1
>         dataTypeServices: INTEGER
>         expression:                                         
>             org.apache.derby.impl.sql.compile.virtualcolumnn...@ff8c74
>             dataTypeServices: null
>             sourceColumn:                                               
>                 org.apache.derby.impl.sql.compile.resultcol...@61736e
>                 ***truncated***
>             sourceResultSet:                                                
>                 org.apache.derby.impl.sql.compile.unionn...@14d7745
>                 ***truncated***
>         [3]:                                        
>         org.apache.derby.impl.sql.compile.resultcol...@15e2ccd
>         exposedName: C3
>         name: C3
>         tableName: null
>         isDefaultColumn: false
>         wasDefaultColumn: false
>         isNameGenerated: false
>         sourceTableName: B2
>         type: CHAR(1)
>         columnDescriptor: null
>         isGenerated: false
>         isGeneratedForUnmatchedColumnInInsert: false
>         isGroupingColumn: false
>         isReferenced: true
>         isRedundant: false
>         virtualColumnId: 4
>         resultSetNumber: -1
>         dataTypeServices: CHAR(1)
>         expression:                                         
>             org.apache.derby.impl.sql.compile.virtualcolumnn...@1cf7491
>             dataTypeServices: null
>             sourceColumn:                                               
>                 org.apache.derby.impl.sql.compile.resultcol...@11946c2
>                 ***truncated***
>             sourceResultSet:                                                
>                 org.apache.derby.impl.sql.compile.unionn...@14d7745
>                 ***truncated***
>         [4]:    <----------------------------------------- highest column 
> number is 5 (index is zero-based)
>         org.apache.derby.impl.sql.compile.resultcol...@edf730
>         exposedName: C4
>         name: C4
>         tableName: null
>         isDefaultColumn: false
>         wasDefaultColumn: false
>         isNameGenerated: false
>         sourceTableName: B2
>         type: INTEGER
>         columnDescriptor: null
>         isGenerated: false
>         isGeneratedForUnmatchedColumnInInsert: false
>         isGroupingColumn: false
>         isReferenced: true
>         isRedundant: false
>         virtualColumnId: 5
>         resultSetNumber: -1
>         dataTypeServices: INTEGER
>         expression:                                         
>             org.apache.derby.impl.sql.compile.virtualcolumnn...@ff94b1
>             dataTypeServices: null
>             sourceColumn:                                               
>                 org.apache.derby.impl.sql.compile.resultcol...@17a4989
>                 ***truncated***
>             sourceResultSet:                                                
>                 org.apache.derby.impl.sql.compile.unionn...@14d7745
>                 ***truncated***
>     subquery:                                       
>         org.apache.derby.impl.sql.compile.unionn...@14d7745
>         ***truncated***

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to