\brief Extract an equality from an expression. Recognizes expressions of the form: equal(a, 2) is_null(a)
| 923 | /// equal(a, 2) |
| 924 | /// is_null(a) |
| 925 | std::optional<std::pair<FieldRef, Datum>> ExtractOneFieldValue( |
| 926 | const Expression& guarantee) { |
| 927 | auto call = guarantee.call(); |
| 928 | if (!call) return std::nullopt; |
| 929 | |
| 930 | // search for an equality conditions between a field and a literal |
| 931 | if (call->function_name == "equal") { |
| 932 | auto ref = call->arguments[0].field_ref(); |
| 933 | if (!ref) return std::nullopt; |
| 934 | |
| 935 | auto lit = call->arguments[1].literal(); |
| 936 | if (!lit) return std::nullopt; |
| 937 | |
| 938 | return std::make_pair(*ref, *lit); |
| 939 | } |
| 940 | |
| 941 | // ... or a known null field |
| 942 | if (call->function_name == "is_null") { |
| 943 | auto ref = call->arguments[0].field_ref(); |
| 944 | if (!ref) return std::nullopt; |
| 945 | |
| 946 | return std::make_pair(*ref, Datum(std::make_shared<NullScalar>())); |
| 947 | } |
| 948 | |
| 949 | return std::nullopt; |
| 950 | } |
| 951 | |
| 952 | // Conjunction members which are represented in known_values are erased from |
| 953 | // conjunction_members |
no test coverage detected