Commit 1e227b8f authored by Sergei Golubchik's avatar Sergei Golubchik

clarify the comment and trivial cleanups

parent 267fc6f2
...@@ -656,36 +656,32 @@ class Field ...@@ -656,36 +656,32 @@ class Field
inline bool is_null(my_ptrdiff_t row_offset= 0) const inline bool is_null(my_ptrdiff_t row_offset= 0) const
{ {
/* /*
If the field is NULLable, it returns NULLity based
on null_ptr[row_offset] value. Otherwise it returns
NULL flag depending on TABLE::null_row value.
The table may have been marked as containing only NULL values The table may have been marked as containing only NULL values
for all fields if it is a NULL-complemented row of an OUTER JOIN for all fields if it is a NULL-complemented row of an OUTER JOIN
or if the query is an implicitly grouped query (has aggregate or if the query is an implicitly grouped query (has aggregate
functions but no GROUP BY clause) with no qualifying rows. If functions but no GROUP BY clause) with no qualifying rows. If
this is the case (in which TABLE::null_row is true) and the this is the case (in which TABLE::null_row is true), the field
field is not nullable, the field is considered to be NULL. is considered to be NULL.
Do not change the order of testing. Fields may be associated
with a TABLE object without being part of the current row.
For NULL value check to work for these fields, they must
have a valid null_ptr, and this pointer must be checked before
TABLE::null_row.
Note that if a table->null_row is set then also all null_bits are Note that if a table->null_row is set then also all null_bits are
set for the row. set for the row.
In the case of the 'result_field' for GROUP BY, table->null_row might
refer to the *next* row in the table (when the algorithm is: read the
next row, see if any of group column values have changed, send the
result - grouped - row to the client if yes). So, table->null_row might
be wrong, but such a result_field is always nullable (that's defined by
original_field->maybe_null()) and we trust its null bit.
*/ */
return real_maybe_null() ? return null_ptr ? null_ptr[row_offset] & null_bit : table->null_row;
MY_TEST(null_ptr[row_offset] & null_bit) : table->null_row;
} }
inline bool is_real_null(my_ptrdiff_t row_offset= 0) const inline bool is_real_null(my_ptrdiff_t row_offset= 0) const
{ return null_ptr ? (null_ptr[row_offset] & null_bit ? 1 : 0) : 0; } { return null_ptr && (null_ptr[row_offset] & null_bit); }
inline bool is_null_in_record(const uchar *record) const inline bool is_null_in_record(const uchar *record) const
{ {
if (!null_ptr) if (!null_ptr)
return 0; return 0;
return MY_TEST(record[(uint) (null_ptr - table->record[0])] & null_bit); return record[(uint) (null_ptr - table->record[0])] & null_bit;
} }
inline void set_null(my_ptrdiff_t row_offset= 0) inline void set_null(my_ptrdiff_t row_offset= 0)
{ if (null_ptr) null_ptr[row_offset]|= null_bit; } { if (null_ptr) null_ptr[row_offset]|= null_bit; }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment