Description
- When using subquery join lateral table function as followed:
select * from ( select 5 as f0 from s.t ) a,lateral table(s.GenerateStrings(f0)) as t(n, c) where char_length(c) > 3
'SqlValidatorException: Column 'F0' not found in any table' was thrown out.
I find the reason is that SqlValidatorImpl add the namespace of Identifier 's.t' to the children of tableScope,but not the subquey's namespace,just as the code show bellow in SqlValidatorImpl#registerFrom:
case IDENTIFIER: ........... if (tableScope == null) { tableScope = new TableScope(parentScope, node); } tableScope.addChild(newNs, alias, forceNullable);
I think the namespace of JoinScope's left child should be the children of tableScope which was referenced by the table function,just as the code show bellow in SqlValidatorImpl#registerFrom:
case COLLECTION_TABLE: .... TableScope tableScope = null; if(parentScope instanceof JoinScope) { tableScope = new TableScope(new EmptyScope(this),operand); JoinScope scope = (JoinScope) parentScope; SqlValidatorNamespace leftNs = scope.getChildren().get(0); tableScope.addChild(leftNs,scope.children.get(0).name,forceNullable); } ....
After this modification,the case upon runs well.
Is there any problem for this modification? Any suggestions is welcomed.Thanks a lot.