Fix bug that <=> operator and in operator get wrong result (#1516)
* Fix bug that <=> operator and in operator get wrong result * Add some comment to get_result_for_null * Add an new Binary Operator to replace is_safe_for_null for handleing '<=>' operator * Add EQ_FOR_NULL to TExprOpcode * Remove macro definition last backslash
This commit is contained in:
@ -32,7 +32,8 @@ namespace doris {
|
||||
class BinaryPredicate : public Predicate {
|
||||
public:
|
||||
static Expr* from_thrift(const TExprNode& node);
|
||||
BinaryPredicate(const TExprNode& node) : Predicate(node) { }
|
||||
BinaryPredicate(const TExprNode& node) : Predicate(node) {
|
||||
}
|
||||
virtual ~BinaryPredicate() { }
|
||||
|
||||
protected:
|
||||
@ -41,6 +42,7 @@ protected:
|
||||
// virtual Status prepare(RuntimeState* state, const RowDescriptor& desc);
|
||||
virtual std::string debug_string() const;
|
||||
|
||||
|
||||
Status codegen_compare_fn(
|
||||
RuntimeState* state, llvm::Function** fn, llvm::CmpInst::Predicate pred);
|
||||
};
|
||||
@ -54,7 +56,7 @@ protected:
|
||||
return pool->add(new CLASS(*this)); } \
|
||||
\
|
||||
virtual Status get_codegend_compute_fn(RuntimeState* state, llvm::Function** fn); \
|
||||
virtual BooleanVal get_boolean_val(ExprContext* context, TupleRow*); \
|
||||
virtual BooleanVal get_boolean_val(ExprContext* context, TupleRow* row); \
|
||||
};
|
||||
|
||||
#define BIN_PRED_CLASSES_DEFINE(TYPE) \
|
||||
@ -63,7 +65,7 @@ protected:
|
||||
BIN_PRED_CLASS_DEFINE(Lt##TYPE##Pred) \
|
||||
BIN_PRED_CLASS_DEFINE(Le##TYPE##Pred) \
|
||||
BIN_PRED_CLASS_DEFINE(Gt##TYPE##Pred) \
|
||||
BIN_PRED_CLASS_DEFINE(Ge##TYPE##Pred)
|
||||
BIN_PRED_CLASS_DEFINE(Ge##TYPE##Pred)
|
||||
|
||||
BIN_PRED_CLASSES_DEFINE(BooleanVal)
|
||||
BIN_PRED_CLASSES_DEFINE(TinyIntVal)
|
||||
@ -77,5 +79,35 @@ BIN_PRED_CLASSES_DEFINE(StringVal)
|
||||
BIN_PRED_CLASSES_DEFINE(DateTimeVal)
|
||||
BIN_PRED_CLASSES_DEFINE(DecimalVal)
|
||||
BIN_PRED_CLASSES_DEFINE(DecimalV2Val)
|
||||
|
||||
|
||||
#define BIN_PRED_FOR_NULL_CLASS_DEFINE(CLASS) \
|
||||
class CLASS : public BinaryPredicate { \
|
||||
public: \
|
||||
CLASS(const TExprNode& node) : BinaryPredicate(node) { } \
|
||||
virtual ~CLASS() { } \
|
||||
virtual Expr* clone(ObjectPool* pool) const override { \
|
||||
return pool->add(new CLASS(*this)); } \
|
||||
\
|
||||
virtual Status get_codegend_compute_fn(RuntimeState* state, llvm::Function** fn); \
|
||||
virtual BooleanVal get_boolean_val(ExprContext* context, TupleRow* row); \
|
||||
};
|
||||
|
||||
#define BIN_PRED_FOR_NULL_CLASSES_DEFINE(TYPE) \
|
||||
BIN_PRED_FOR_NULL_CLASS_DEFINE(EqForNull##TYPE##Pred)
|
||||
|
||||
|
||||
BIN_PRED_FOR_NULL_CLASSES_DEFINE(BooleanVal)
|
||||
BIN_PRED_FOR_NULL_CLASSES_DEFINE(TinyIntVal)
|
||||
BIN_PRED_FOR_NULL_CLASSES_DEFINE(SmallIntVal)
|
||||
BIN_PRED_FOR_NULL_CLASSES_DEFINE(IntVal)
|
||||
BIN_PRED_FOR_NULL_CLASSES_DEFINE(BigIntVal)
|
||||
BIN_PRED_FOR_NULL_CLASSES_DEFINE(LargeIntVal)
|
||||
BIN_PRED_FOR_NULL_CLASSES_DEFINE(FloatVal)
|
||||
BIN_PRED_FOR_NULL_CLASSES_DEFINE(DoubleVal)
|
||||
BIN_PRED_FOR_NULL_CLASSES_DEFINE(StringVal)
|
||||
BIN_PRED_FOR_NULL_CLASSES_DEFINE(DateTimeVal)
|
||||
BIN_PRED_FOR_NULL_CLASSES_DEFINE(DecimalVal)
|
||||
BIN_PRED_FOR_NULL_CLASSES_DEFINE(DecimalV2Val)
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user