@@ -249,18 +249,18 @@ bool MergeTreeIndexConditionGin::mayBeTrueOnGranuleInPart(MergeTreeIndexGranuleP
249249 throw Exception (ErrorCodes::LOGICAL_ERROR, " GinFilter index condition got a granule with the wrong type." );
250250
251251 // / Check like in KeyCondition.
252- std::vector<bool > rpn_stack;
252+ std::vector<BoolMask > rpn_stack;
253253 for (const auto & element : rpn)
254254 {
255255 if (element.function == RPNElement::FUNCTION_UNKNOWN)
256256 {
257- rpn_stack.emplace_back (true );
257+ rpn_stack.emplace_back (true , true );
258258 }
259259 else if (element.function == RPNElement::FUNCTION_EQUALS
260260 || element.function == RPNElement::FUNCTION_NOT_EQUALS
261261 || element.function == RPNElement::FUNCTION_HAS)
262262 {
263- rpn_stack.emplace_back (granule->gin_filters [element.key_column ].contains (*element.gin_filter , cache_store));
263+ rpn_stack.emplace_back (granule->gin_filters [element.key_column ].contains (*element.gin_filter , cache_store), true );
264264
265265 if (element.function == RPNElement::FUNCTION_NOT_EQUALS)
266266 rpn_stack.back () = !rpn_stack.back ();
@@ -279,7 +279,7 @@ bool MergeTreeIndexConditionGin::mayBeTrueOnGranuleInPart(MergeTreeIndexGranuleP
279279 result[row] = result[row] && granule->gin_filters [key_idx].contains (gin_filters[row], cache_store);
280280 }
281281
282- rpn_stack.emplace_back (std::find (std::cbegin (result), std::cend (result), true ) != std::end (result));
282+ rpn_stack.emplace_back (std::find (std::cbegin (result), std::cend (result), true ) != std::end (result), true );
283283 if (element.function == RPNElement::FUNCTION_NOT_IN)
284284 rpn_stack.back () = !rpn_stack.back ();
285285 }
@@ -292,7 +292,7 @@ bool MergeTreeIndexConditionGin::mayBeTrueOnGranuleInPart(MergeTreeIndexGranuleP
292292 for (size_t row = 0 ; row < gin_filters.size (); ++row)
293293 result[row] = granule->gin_filters [element.key_column ].contains (gin_filters[row], cache_store);
294294
295- rpn_stack.emplace_back (std::find (std::cbegin (result), std::cend (result), true ) != std::end (result));
295+ rpn_stack.emplace_back (std::find (std::cbegin (result), std::cend (result), true ) != std::end (result), true );
296296 }
297297 else if (element.function == RPNElement::FUNCTION_MATCH)
298298 {
@@ -306,11 +306,11 @@ bool MergeTreeIndexConditionGin::mayBeTrueOnGranuleInPart(MergeTreeIndexGranuleP
306306 for (size_t row = 0 ; row < gin_filters.size (); ++row)
307307 result[row] = granule->gin_filters [element.key_column ].contains (gin_filters[row], cache_store);
308308
309- rpn_stack.emplace_back (std::find (std::cbegin (result), std::cend (result), true ) != std::end (result));
309+ rpn_stack.emplace_back (std::find (std::cbegin (result), std::cend (result), true ) != std::end (result), true );
310310 }
311311 else if (element.gin_filter )
312312 {
313- rpn_stack.emplace_back (granule->gin_filters [element.key_column ].contains (*element.gin_filter , cache_store));
313+ rpn_stack.emplace_back (granule->gin_filters [element.key_column ].contains (*element.gin_filter , cache_store), true );
314314 }
315315
316316 }
@@ -323,22 +323,22 @@ bool MergeTreeIndexConditionGin::mayBeTrueOnGranuleInPart(MergeTreeIndexGranuleP
323323 auto arg1 = rpn_stack.back ();
324324 rpn_stack.pop_back ();
325325 auto arg2 = rpn_stack.back ();
326- rpn_stack.back () = arg1 && arg2;
326+ rpn_stack.back () = arg1 & arg2;
327327 }
328328 else if (element.function == RPNElement::FUNCTION_OR)
329329 {
330330 auto arg1 = rpn_stack.back ();
331331 rpn_stack.pop_back ();
332332 auto arg2 = rpn_stack.back ();
333- rpn_stack.back () = arg1 || arg2;
333+ rpn_stack.back () = arg1 | arg2;
334334 }
335335 else if (element.function == RPNElement::ALWAYS_FALSE)
336336 {
337- rpn_stack.emplace_back (false );
337+ rpn_stack.emplace_back (false , true );
338338 }
339339 else if (element.function == RPNElement::ALWAYS_TRUE)
340340 {
341- rpn_stack.emplace_back (true );
341+ rpn_stack.emplace_back (true , false );
342342 }
343343 else
344344 throw Exception (ErrorCodes::LOGICAL_ERROR, " Unexpected function type in GinFilterCondition::RPNElement" );
@@ -347,7 +347,7 @@ bool MergeTreeIndexConditionGin::mayBeTrueOnGranuleInPart(MergeTreeIndexGranuleP
347347 if (rpn_stack.size () != 1 )
348348 throw Exception (ErrorCodes::LOGICAL_ERROR, " Unexpected stack size in GinFilterCondition::mayBeTrueOnGranule" );
349349
350- return rpn_stack[0 ];
350+ return rpn_stack[0 ]. can_be_true ;
351351}
352352
353353bool MergeTreeIndexConditionGin::traverseAtomAST (const RPNBuilderTreeNode & node, RPNElement & out)
0 commit comments