Roland opened a bug "Documentation indicates some MYSQL_FIELD->flags are deprecated which aren't."
The MySQL protocol uses the string values of ENUM
- and SET
-fields. To indicate that this string
originated from a ENUM- or SET-column the ENUM_FLAG
and SET_FLAG
are used
in the Column Defintion
Same as Roland I wonder why they are deprecated. Is it something new? Something old?
Searching through the history
In an attempt to find out since when ENUM
s are sent as MYSQL_TYPE_STRING
+ ENUM_FLAG
I grepped through
the oldest MySQL release that can be found in the bzr tree:
mysql-3.23.22-beta$ find . -type f | xargs grep -n ENUM_FLAG
./sql/field.cc:4560: if (flags & (ENUM_FLAG | SET_FLAG))
./sql/field.h:118: tmp->flags&= (NOT_NULL_FLAG | BLOB_FLAG | UNSIGNED_FLAG | ZEROFILL_FLAG | BINARY_FLAG | ENUM_FLAG | SET_FLAG);
./sql/field.h:920: flags|=ENUM_FLAG;
./sql/field.h:957: flags=(flags & ~ENUM_FLAG) | SET_FLAG;
./Docs/manual.texi:30213:@item @code{ENUM_FLAG} @tab Field is an @code{ENUM} (deprecated)
./Docs/manual.texi:30218:Use of the @code{BLOB_FLAG}, @code{ENUM_FLAG} and @code{TIMESTAMP_FLAG} flags
./include/mysql_com.h:60:#define ENUM_FLAG 256 /* field is an enum */
... and stumbled over:
./Docs/manual.texi:30213:@item @code{ENUM_FLAG} @tab Field is an @code{ENUM} (deprecated)
A further look at revision 2 shows:
Use of the @code{BLOB_FLAG}, @code{ENUM_FLAG} and @code{TIMESTAMP_FLAG} flags
is deprecated because they indicate the type of a field rather than an
attribute of its type. It is preferable to test @code{field->type} against
@code{FIELD_TYPE_BLOB}, @code{FIELD_TYPE_ENUM} or @code{FIELD_TYPE_TIMESTAMP}
instead.
Checking the code of Field_enum
you see that:
class Field_enum {
Field_enum(...) {
...
flags |= ENUM_FLAG;
...
enum_field_types type() const { return FIELD_TYPE_STRING; }
}
This code snippet is the same in 5.7.
If the code is the same from 3.32.22
to 5.7
since when are the docs and the code out of sync?
The answer can only be found the old source-tar's of the times before bazaar and bitkeeper.
To the attic
After removing some dust from tar's running the above find-grep shows:
3.21.0
introduces ENUM support and theENUM_FLAG
(not documented)
When the ENUM_FLAG
was introduced there was no way to send it to the client. Back then field
for this in the column definition
was only 1-byte long and ENUM_FLAG
has the value of 256
... and was always cut off.
3.21.20
introduces support for a widerflags
field with theCLIENT_LONG_FLAG
capability.
From now on new clients could distinguish strings from ENUMs.
-
3.21.23
comment aroundENUM_FLAG
inmysql_com.h
changed fromNot sent to client
tofield is an enum
to describe that. -
3.22.5
adds documentation for the C-API including its field types and flags (includingENUM_FLAG
) -
3.22.6
deprecatesENUM_FLAG
,BLOB_FLAG
andTIMESTAMP_FLAG
as seen in the text-snippet above -
3.22.17
marks the table entry forENUM_FLAG
as(deprecated)
in the manual (which is what #69627 is about)
Why?
Judging from the documentation snippet and the history ENUM_FLAG
was deprecated because:
- it was not supported by clients before
3.21.20
- only
ENUM
and its brotherSET
are sent asMYSQL_TYPE_STRING
+ a flag
When the C-API section was updated in 3.22.6
I guess this was seen, discussed and moved to
the stack of things to clean up. It was still a alpha release.
That was in 1998. Years later the documentation was adjusted to follow the code to say:
ENUM and SET values are returned as strings. For these, check that the type value is
MYSQL_TYPE_STRING and that the ENUM_FLAG or SET_FLAG flag is set in the flags value.
... and now even the (deprecated)
tag is removed.
Comments