Details
-
Task
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Fixed
-
None
Description
To reduce the number of parameters in Type_handler methods (such as make_table_field_from_def(), see MDEV-9216), we'll introduce a new class representing the position and the offset of a bit.
It will be reused for:
- NULL bits (for NULL-able columns)
- Data bits (for the BIT(N) data type, and similar)
The tentative prototype:
class Bit_addr
|
{
|
/**
|
Byte where the bit is stored inside a record. |
If the corresponding Field is a NOT NULL field, this member is NULL. |
*/
|
uchar *m_ptr;
|
/**
|
Offset of the bit inside m_ptr[0], in the range 0..7. |
*/
|
uchar m_offs;
|
public: |
Bit_addr(uchar *ptr, uchar offs)
|
:m_ptr(ptr), m_offs(offs)
|
{
|
DBUG_ASSERT(ptr || offs == 0);
|
DBUG_ASSERT(offs < 8);
|
}
|
uchar *ptr() const { return m_ptr; } |
uchar offs() const { return m_offs; } |
uchar bit() const { return m_ptr ? ((uchar) 1) << m_offs : 0; } |
};
|
Encapsulation is needed for better consistency control, to make sure that m_ptr and m_offs always represent valid combinations.
To further reuse the code, we'll replace Record_addr members null_ptr and null_bit to an instance of Bit_addr.