| 1760 | } |
| 1761 | |
| 1762 | static inline bool tryCombineDecimalWithNumeric(const LogicalType& dec, const LogicalType& nonDec, |
| 1763 | LogicalType& result) { |
| 1764 | auto precision = DecimalType::getPrecision(dec); |
| 1765 | auto scale = DecimalType::getScale(dec); |
| 1766 | uint32_t requiredDigits = 0; |
| 1767 | // How many digits before the decimal point does result require? |
| 1768 | switch (nonDec.getLogicalTypeID()) { |
| 1769 | case LogicalTypeID::INT8: |
| 1770 | requiredDigits = function::NumericLimits<int8_t>::maxNumDigits(); |
| 1771 | break; |
| 1772 | case LogicalTypeID::UINT8: |
| 1773 | requiredDigits = function::NumericLimits<uint8_t>::maxNumDigits(); |
| 1774 | break; |
| 1775 | case LogicalTypeID::INT16: |
| 1776 | requiredDigits = function::NumericLimits<int16_t>::maxNumDigits(); |
| 1777 | break; |
| 1778 | case LogicalTypeID::UINT16: |
| 1779 | requiredDigits = function::NumericLimits<uint16_t>::maxNumDigits(); |
| 1780 | break; |
| 1781 | case LogicalTypeID::INT32: |
| 1782 | requiredDigits = function::NumericLimits<int32_t>::maxNumDigits(); |
| 1783 | break; |
| 1784 | case LogicalTypeID::UINT32: |
| 1785 | requiredDigits = function::NumericLimits<uint32_t>::maxNumDigits(); |
| 1786 | break; |
| 1787 | case LogicalTypeID::INT64: |
| 1788 | requiredDigits = function::NumericLimits<int64_t>::maxNumDigits(); |
| 1789 | break; |
| 1790 | case LogicalTypeID::UINT64: |
| 1791 | requiredDigits = function::NumericLimits<uint64_t>::maxNumDigits(); |
| 1792 | break; |
| 1793 | case LogicalTypeID::INT128: |
| 1794 | requiredDigits = function::NumericLimits<int128_t>::maxNumDigits(); |
| 1795 | break; |
| 1796 | case LogicalTypeID::UINT128: |
| 1797 | requiredDigits = function::NumericLimits<uint128_t>::maxNumDigits(); |
| 1798 | break; |
| 1799 | default: |
| 1800 | requiredDigits = DECIMAL_PRECISION_LIMIT + 1; |
| 1801 | } |
| 1802 | if (requiredDigits + scale > DECIMAL_PRECISION_LIMIT) { |
| 1803 | result = LogicalType::DOUBLE(); |
| 1804 | return true; |
| 1805 | } |
| 1806 | result = LogicalType::DECIMAL(std::max(requiredDigits + scale, precision), scale); |
| 1807 | return true; |
| 1808 | } |
| 1809 | |
| 1810 | bool LogicalTypeUtils::tryGetMaxLogicalType(const LogicalType& left, const LogicalType& right, |
| 1811 | LogicalType& result) { |
no test coverage detected