AggregateCall
将作为表达式一部分的anHAVING
与 a 中的相应字段相关联的正确方法是RelRecordType
什么LogicalAggregate
?如果 theAggregateCall
不是SELECT
子句的一部分,LogicalAggregate
'RelRecordType
仍然有它,但AggregateCall
'name
属性设置为NULL
并且RelRecordType.getField(AggregateCall.getName())
在这种情况下不能使用。如果AggregateCall
是最终输出的一部分,name
则设置它并 RelRecordType.getField(AggregateCall.getName())
返回正确的字段。
问问题
113 次
1 回答
1
使用字段序数而不是名称。
在 CalciteRelNode
和RexNode
s 的世界中,字段名称并不重要;它们的存在主要是为了帮助您在调试时了解字段的用途。s 的名字AggregateCall
就更不重要了;它们存在以便Aggregate
可以为其字段提供合理的名称,如果它们不存在,那很好。
如果您SELECT
有N个字段(编号为 0 .. N -1)和一个HAVING
子句,您可能会将HAVING
谓词添加为字段 N,应用Filter
关系运算符,然后应用 aProject
以便仅返回字段 0 .. N -1。我很确定这是SqlToRelConverter
已经做到的。
于 2017-11-01T17:02:51.940 回答