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

Mamta A. Satoor commented on DERBY-4631:
----------------------------------------

I stepped through the ConditionalNode's code generation logic to see how 
"if..then..else.." code is generated. Based on that, I have following pseudo 
code for code generation for solution 1). The following psuedo code is for 
generating if(lefTablJoinColumnValue is null) then return 
rightTableJoinColumnValue else return lefTablJoinColumnValue. I have not done 
recent work in the code generation part and would appreciate feedback if the 
psuedo code looks incorrect. I will next work on trying to identify how to make 
this pseudo code kick in for ResultColumn code generation if we are dealing 
with join column.

                String  receiverType = ClassName.DataValueDescriptor;
                String resultTypeName = 
                        
getTypeCompiler(DataTypeDescriptor.getBuiltInDataTypeDescriptor(Types.BOOLEAN).getTypeId()).interfaceName();

                //Following will generate if(lefTablJoinColumnValue is null)
                //Then call generateExpression on left Table's column
                LeftTableColumn.generateExpression(acb, mb);                    
                mb.cast(receiverType); // cast the method instance
                mb.callMethod(VMOpcode.INVOKEINTERFACE, (String) null,
                        "isNullOp",resultTypeName, 0);
                mb.cast(ClassName.BooleanDataValue);
                mb.push(true);
                mb.callMethod(VMOpcode.INVOKEINTERFACE, (String) null, 
"equals", "boolean", 1);

                //Following will generate then part of the if condition by 
generating expression for rightTablJoinColumnValue
                mb.conditionalIf();
                  ((ValueNode) RightTableColumn.generateExpression(acb, mb);
                //Following will generate else part of the if condition by 
generating expression for lefTablJoinColumnValue 
                mb.startElseCode();
                  ((ValueNode) LeftTableColumn.generateExpression(acb, mb);
                mb.completeConditional();

                
> Wrong join column returned by right outer join with NATURAL or USING and 
> territory-based collation
> --------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-4631
>                 URL: https://issues.apache.org/jira/browse/DERBY-4631
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.6.1.0
>            Reporter: Knut Anders Hatlen
>            Assignee: Mamta A. Satoor
>              Labels: derby_triage10_8
>
> SQL:2003 says that the join columns in a natural join or in a named
> columns join should be added to the select list by coalescing the
> column from the left table with the column from the right table.
> Section 7.7, <joined table>, syntax rules:
> > 1) Let TR1 be the first <table reference>, and let TR2 be the <table
> > reference> or <table factor> that is the second operand of the
> > <joined table>. Let RT1 and RT2 be the row types of TR1 and TR2,
> > respectively. Let TA and TB be the range variables of TR1 and TR2,
> > respectively. (...)
> and
> > 7) If NATURAL is specified or if a <join specification> immediately
> > containing a <named columns join> is specified, then:
> (...)
> > d) If there is at least one corresponding join column, then let SLCC
> > be a <select list> of <derived column>s of the form
> >
> > COALESCE ( TA.C, TB.C ) AS C
> >
> > for every column C that is a corresponding join column, taken in
> > order of their ordinal positions in RT1.
> For a right outer join, Derby doesn't use COALESCE(TA.C, TB.C), but
> rather just TB.C (the column in the right table) directly.
> This is in most cases OK, because COALESCE(TA.C, TB.C) = TB.C is an
> invariant in a right outer join. (Because TA.C is either NULL or equal
> to TB.C.)
> However, in a database with territory-based collation, equality
> between two values does not mean they are identical, especially now
> that the strength of the collator can be specified (DERBY-1748).
> Take for instance this join:
> ij> connect 
> 'jdbc:derby:testdb;create=true;territory=en_US;collation=TERRITORY_BASED:SECONDARY';
> ij> create table big(x varchar(5));
> 0 rows inserted/updated/deleted
> ij> insert into big values 'A','B','C';
> 3 rows inserted/updated/deleted
> ij> create table small(x varchar(5));
> 0 rows inserted/updated/deleted
> ij> insert into small values 'b','c','d';
> 3 rows inserted/updated/deleted
> ij> select x, t1.x, t2.x, coalesce(t1.x, t2.x) from small t1 natural right 
> outer join big t2;
> X    |X    |X    |4    
> -----------------------
> A    |NULL |A    |A    
> B    |b    |B    |b    
> C    |c    |C    |c    
> 3 rows selected
> I believe that the expected result from the above query is that the
> first column should have the same values as the last column. That is,
> the first column should contain {'A', 'b', 'c'}, not {'A', 'B', 'C'}.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to