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:
chenhao
2019-07-30 11:17:53 +08:00
committed by GitHub
parent 97718a35a2
commit 2cb82c57bb
7 changed files with 215 additions and 15 deletions

View File

@ -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