@@ -115,19 +115,27 @@ class TKqpOlapCompileContext {
115
115
return ExprContext.MakeType <TBlockExprType>(resultItemType);
116
116
}
117
117
118
- const TTypeAnnotationNode* GetReturnType (TPositionHandle pos, const TTypeAnnotationNode& left, const TTypeAnnotationNode& right, const TTypeAnnotationNode* resultItemType, bool optionalityFromRight) const {
118
+ const TTypeAnnotationNode *GetReturnType (TPositionHandle pos, const TTypeAnnotationNode &left,
119
+ const TTypeAnnotationNode &right, const TTypeAnnotationNode *resultItemType,
120
+ bool optionalityFromRight) const {
119
121
bool isScalarLeft, isScalarRight;
120
122
const auto leftItemType = GetBlockItemType (left, isScalarLeft);
121
123
const auto rightItemType = GetBlockItemType (right, isScalarRight);
122
124
123
125
if (!resultItemType) {
124
- const auto & leftCleanType = RemoveOptionality (*leftItemType);
125
- const auto & rightCleanType = RemoveOptionality (*rightItemType);
126
+ const auto & leftCleanType = RemoveOptionality (*leftItemType);
127
+ const auto & rightCleanType = RemoveOptionality (*rightItemType);
126
128
resultItemType = CommonType<true >(pos, &leftCleanType, &rightCleanType, ExprContext);
129
+ } else {
130
+ if (resultItemType->GetKind () == ETypeAnnotationKind::Optional) {
131
+ resultItemType = resultItemType->Cast <TOptionalExprType>()->GetItemType ();
132
+ }
127
133
}
128
- YQL_ENSURE (resultItemType);
129
134
130
- if ((ETypeAnnotationKind::Optional == leftItemType->GetKind () && !optionalityFromRight) || ETypeAnnotationKind::Optional == rightItemType->GetKind ()) {
135
+ Y_ENSURE (resultItemType, " KqpOlapCompiler: Result type is nullptr." );
136
+
137
+ if ((ETypeAnnotationKind::Optional == leftItemType->GetKind () && !optionalityFromRight) ||
138
+ ETypeAnnotationKind::Optional == rightItemType->GetKind ()) {
131
139
resultItemType = ExprContext.MakeType <TOptionalExprType>(resultItemType);
132
140
}
133
141
@@ -137,17 +145,23 @@ class TKqpOlapCompileContext {
137
145
return ExprContext.MakeType <TBlockExprType>(resultItemType);
138
146
}
139
147
140
- std::pair<ui32, const TTypeAnnotationNode*> AddYqlKernelIfFunc (TPositionHandle pos, const TTypeAnnotationNode& conditionType, const TTypeAnnotationNode& thenType, const TTypeAnnotationNode& elseType) const {
148
+ std::pair<ui32, const TTypeAnnotationNode *> AddYqlKernelIfFunc (TPositionHandle pos, const TTypeAnnotationNode &conditionType,
149
+ const TTypeAnnotationNode &thenType,
150
+ const TTypeAnnotationNode &elseType) const {
141
151
const auto retBlockType = GetReturnType (pos, thenType, elseType, nullptr , false );
142
152
return std::make_pair (YqlKernelRequestBuilder->AddIf (&conditionType, &thenType, &elseType), retBlockType);
143
153
}
144
154
145
- std::pair<ui32, const TTypeAnnotationNode*> AddYqlKernelBinaryFunc (TPositionHandle pos, TKernelRequestBuilder::EBinaryOp op, const TTypeAnnotationNode& argTypeOne, const TTypeAnnotationNode& argTypeTwo, const TTypeAnnotationNode* retType) const {
155
+ std::pair<ui32, const TTypeAnnotationNode *> AddYqlKernelBinaryFunc (TPositionHandle pos, TKernelRequestBuilder::EBinaryOp op,
156
+ const TTypeAnnotationNode &argTypeOne,
157
+ const TTypeAnnotationNode &argTypeTwo,
158
+ const TTypeAnnotationNode *retType) const {
146
159
const auto retBlockType = GetReturnType (pos, argTypeOne, argTypeTwo, retType, TKernelRequestBuilder::EBinaryOp::Coalesce == op);
147
160
return std::make_pair (YqlKernelRequestBuilder->AddBinaryOp (op, &argTypeOne, &argTypeTwo, retBlockType), retBlockType);
148
161
}
149
162
150
- ui32 AddYqlKernelBinaryFunc (TPositionHandle pos, TKernelRequestBuilder::EBinaryOp op, const TExprBase& arg1, const TExprBase& arg2, const TTypeAnnotationNode* retType) const {
163
+ ui32 AddYqlKernelBinaryFunc (TPositionHandle pos, TKernelRequestBuilder::EBinaryOp op, const TExprBase &arg1, const TExprBase &arg2,
164
+ const TTypeAnnotationNode *retType) const {
151
165
const auto arg1Type = GetArgType (arg1);
152
166
const auto arg2Type = GetArgType (arg2);
153
167
return AddYqlKernelBinaryFunc (pos, op, *arg1Type, *arg2Type, retType).first ;
@@ -665,9 +679,15 @@ TTypedColumn CompileYqlKernelUnaryOperation(const TKqpOlapFilterUnaryOp& operati
665
679
return {command->GetColumn ().GetId (), resultType};
666
680
}
667
681
668
- [[maybe_unused]]
669
- TTypedColumn CompileYqlKernelBinaryOperation (const TKqpOlapFilterBinaryOp& operation, TKqpOlapCompileContext& ctx)
670
- {
682
+ const TTypeAnnotationNode *TryToGetType (const TKqpOlapFilterBinaryOp &operation) {
683
+ const auto opPtr = operation.Ptr ();
684
+ if (opPtr->ChildrenSize () > TKqpOlapFilterBinaryOp::idx_OpType) {
685
+ return opPtr->Child (TKqpOlapFilterBinaryOp::idx_OpType)->GetTypeAnn ()->Cast <TTypeExprType>()->GetType ();
686
+ }
687
+ return nullptr ;
688
+ }
689
+
690
+ TTypedColumn CompileYqlKernelBinaryOperation (const TKqpOlapFilterBinaryOp &operation, TKqpOlapCompileContext &ctx) {
671
691
// Columns should be created before operation, otherwise operation fail to find columns
672
692
const auto leftColumn = GetOrCreateColumnIdAndType (operation.Left (), ctx);
673
693
const auto rightColumn = GetOrCreateColumnIdAndType (operation.Right (), ctx);
@@ -697,22 +717,22 @@ TTypedColumn CompileYqlKernelBinaryOperation(const TKqpOlapFilterBinaryOp& opera
697
717
op = TKernelRequestBuilder::EBinaryOp::GreaterOrEqual;
698
718
} else if (oper == " +" sv) {
699
719
op = TKernelRequestBuilder::EBinaryOp::Add;
700
- type = nullptr ;
720
+ type = TryToGetType (operation) ;
701
721
} else if (oper == " -" sv) {
702
722
op = TKernelRequestBuilder::EBinaryOp::Sub;
703
- type = nullptr ;
723
+ type = TryToGetType (operation) ;
704
724
} else if (oper == " *" sv) {
705
725
op = TKernelRequestBuilder::EBinaryOp::Mul;
706
- type = nullptr ;
726
+ type = TryToGetType (operation) ;
707
727
} else if (oper == " /" sv) {
708
728
op = TKernelRequestBuilder::EBinaryOp::Div;
709
- type = nullptr ;
729
+ type = TryToGetType (operation) ;
710
730
} else if (oper == " %" sv) {
711
731
op = TKernelRequestBuilder::EBinaryOp::Mod;
712
- type = nullptr ;
732
+ type = TryToGetType (operation) ;
713
733
} else if (oper == " ??" sv) {
714
734
op = TKernelRequestBuilder::EBinaryOp::Coalesce;
715
- type = nullptr ;
735
+ type = TryToGetType (operation) ;
716
736
} else {
717
737
YQL_ENSURE (false , " Unknown binary OLAP operation: " << oper);
718
738
}
0 commit comments