| 93 | } |
| 94 | |
| 95 | inline bool RawValue::Eq(const void* v1, const void* v2, const ColumnType& type) { |
| 96 | const StringValue* string_value1; |
| 97 | const StringValue* string_value2; |
| 98 | switch (type.type) { |
| 99 | case TYPE_BOOLEAN: |
| 100 | return *reinterpret_cast<const bool*>(v1) |
| 101 | == *reinterpret_cast<const bool*>(v2); |
| 102 | case TYPE_TINYINT: |
| 103 | return *reinterpret_cast<const int8_t*>(v1) |
| 104 | == *reinterpret_cast<const int8_t*>(v2); |
| 105 | case TYPE_SMALLINT: |
| 106 | return *reinterpret_cast<const int16_t*>(v1) |
| 107 | == *reinterpret_cast<const int16_t*>(v2); |
| 108 | case TYPE_INT: |
| 109 | return *reinterpret_cast<const int32_t*>(v1) |
| 110 | == *reinterpret_cast<const int32_t*>(v2); |
| 111 | case TYPE_DATE: |
| 112 | return *reinterpret_cast<const DateValue*>(v1) |
| 113 | == *reinterpret_cast<const DateValue*>(v2); |
| 114 | case TYPE_BIGINT: |
| 115 | return *reinterpret_cast<const int64_t*>(v1) |
| 116 | == *reinterpret_cast<const int64_t*>(v2); |
| 117 | case TYPE_FLOAT: |
| 118 | return *reinterpret_cast<const float*>(v1) |
| 119 | == *reinterpret_cast<const float*>(v2); |
| 120 | case TYPE_DOUBLE: |
| 121 | return *reinterpret_cast<const double*>(v1) |
| 122 | == *reinterpret_cast<const double*>(v2); |
| 123 | case TYPE_STRING: |
| 124 | case TYPE_VARCHAR: |
| 125 | string_value1 = reinterpret_cast<const StringValue*>(v1); |
| 126 | string_value2 = reinterpret_cast<const StringValue*>(v2); |
| 127 | return string_value1->Eq(*string_value2); |
| 128 | case TYPE_TIMESTAMP: |
| 129 | return *reinterpret_cast<const TimestampValue*>(v1) == |
| 130 | *reinterpret_cast<const TimestampValue*>(v2); |
| 131 | case TYPE_CHAR: { |
| 132 | const char* v1ptr = reinterpret_cast<const char*>(v1); |
| 133 | const char* v2ptr = reinterpret_cast<const char*>(v2); |
| 134 | int64_t l1 = StringValue::UnpaddedCharLength(v1ptr, type.len); |
| 135 | int64_t l2 = StringValue::UnpaddedCharLength(v2ptr, type.len); |
| 136 | return StringCompare(v1ptr, l1, v2ptr, l2, std::min(l1, l2)) == 0; |
| 137 | } |
| 138 | case TYPE_DECIMAL: |
| 139 | switch (type.GetByteSize()) { |
| 140 | case 4: |
| 141 | return reinterpret_cast<const Decimal4Value*>(v1)->value() |
| 142 | == reinterpret_cast<const Decimal4Value*>(v2)->value(); |
| 143 | case 8: |
| 144 | return reinterpret_cast<const Decimal8Value*>(v1)->value() |
| 145 | == reinterpret_cast<const Decimal8Value*>(v2)->value(); |
| 146 | case 16: |
| 147 | return reinterpret_cast<const Decimal16Value*>(v1)->value() |
| 148 | == reinterpret_cast<const Decimal16Value*>(v2)->value(); |
| 149 | default: |
| 150 | DCHECK(false) << "Unknown decimal byte size: " << type.GetByteSize(); |
| 151 | return 0; |
| 152 | } |