Bug #10276 | IS_NUM_FIELD () macro returning wrong value | ||
---|---|---|---|
Submitted: | 30 Apr 2005 2:52 | Modified: | 24 May 2005 4:43 |
Reporter: | Ritesh Nadhani | Email Updates: | |
Status: | Can't repeat | Impact on me: | |
Category: | MySQL Server | Severity: | S2 (Serious) |
Version: | 4.1.7 | OS: | Windows (Windows) |
Assigned to: | CPU Architecture: | Any |
[30 Apr 2005 2:52]
Ritesh Nadhani
[1 May 2005 3:05]
Jorge del Conde
I was unable to reproduce this w/4.1.12: mysql> create table num (a int, b float, c decimal(10,2), d double, e varchar(20)); Query OK, 0 rows affected (0.00 sec) mysql> exit Bye jorge-jorge/mysql_code> ./main Query: SELECT * FROM num IS_NUM_FIELD(a): 32768 IS_NUM_FIELD(b): 32768 IS_NUM_FIELD(c): 32768 IS_NUM_FIELD(d): 32768 IS_NUM_FIELD(e): 0 Query: SELECT * FROM num LIMIT 10 IS_NUM_FIELD(a): 32768 IS_NUM_FIELD(b): 32768 IS_NUM_FIELD(c): 32768 IS_NUM_FIELD(d): 32768 IS_NUM_FIELD(e): 0 main.c: #include <stdio.h> #include <mysql.h> #include <errmsg.h> int do_select(MYSQL *mysql, const char *qry) { MYSQL_RES *res; MYSQL_FIELD *field; if ((mysql_query(mysql, qry) != 0)) return (0); if ((res = mysql_store_result(mysql))) { printf("Query: %s\n", qry); while((field = mysql_fetch_field(res))) printf("IS_NUM_FIELD(%s): %d\n", field->name, IS_NUM_FIELD(field)); mysql_free_result(res); printf("\n"); return 1; } return 0; } int main () { MYSQL *mysql; mysql= mysql_init(NULL); mysql_real_connect(mysql,"localhost","root",NULL,"test",0,NULL,0); do_select(mysql, "SELECT * FROM num"); do_select(mysql, "SELECT * FROM num LIMIT 10"); mysql_close(mysql); return 0; }
[1 May 2005 9:58]
Sergei Golubchik
Also, I tried with exactly your query, and 5.0 client library (vs. 4.1 server) - worked as expected, flags were set correctly.
[1 May 2005 14:25]
Ritesh Nadhani
Hello, This is very strange. I have attached a sql dump of my database. Please restore the table and execute the two queries I provided. In my case (I am using the Windows client library), for the first simple query i.e. select * from mp3_files limit 10 returns correct value in flags field. 0 for non-numeric and 32768 for numeric and thus the following condition works: if ( IS_NUM_FIELD ( field ) ) printf ( "Numeric" ); else printf ( "Non-numeric" ); But if I execute the more complex version i.e. containing the group clause, the flags value for all field is 32967 which results the condition to be true in: if ( IS_NUM_FIELD ( field ) )
[1 May 2005 20:06]
Sergei Golubchik
perhaps it's windows-only problem. we'll try to repeat it on windows
[1 May 2005 23:15]
MySQL Verification Team
Verified on Windows 4.1.11: C:\temp>bug10276 Query: select Artist,Album,Genre,File_name from mp3_files where Artist is not NULL and Album is not NULL group by Album, Artist, Genre order by Genre, Artist, Album; IS_NUM_FIELD(Artist): 32768 IS_NUM_FIELD(Album): 32768 IS_NUM_FIELD(Genre): 32768 IS_NUM_FIELD(File_name): 0 Query: select * from mp3_files limit 10; IS_NUM_FIELD(ID): 32768 IS_NUM_FIELD(Title): 0 IS_NUM_FIELD(Artist): 0 IS_NUM_FIELD(Album): 0 IS_NUM_FIELD(Genre): 0 IS_NUM_FIELD(Rating): 32768 IS_NUM_FIELD(TrackTime): 32768 IS_NUM_FIELD(Nr): 32768 IS_NUM_FIELD(Bitrate): 32768 IS_NUM_FIELD(NumberOfChannels): 32768 IS_NUM_FIELD(RecYear): 32768 IS_NUM_FIELD(ArtistWebPage): 0 IS_NUM_FIELD(TrackType): 32768 IS_NUM_FIELD(TrackFormat): 0 IS_NUM_FIELD(File_name): 0 IS_NUM_FIELD(DateAdded): 0 IS_NUM_FIELD(ModTime): 0 IS_NUM_FIELD(DateLastPlayed): 0 IS_NUM_FIELD(TrackPlayCount): 32768 IS_NUM_FIELD(FileSizeInBytes): 32768 IS_NUM_FIELD(DiskNumberInSet): 32768 IS_NUM_FIELD(TotalDisksInSet): 32768 IS_NUM_FIELD(Composer): 0 IS_NUM_FIELD(FeaturedArtists): 0 IS_NUM_FIELD(Instrument): 0 IS_NUM_FIELD(Lyrics): 0 IS_NUM_FIELD(Notes): 0 IS_NUM_FIELD(ArtistBio): 0
[2 May 2005 2:33]
Ritesh Nadhani
Does verified means its a bug and will be fixed? When can I expect the bug fix? currently I have defined another macro: IS_NUMBER ( field->type ) #define IS_NUMBER(t) ((t)==FIELD_TYPE_LONG || (t)==FIELD_TYPE_LONGLONG || (t)==FIELD_TYPE_DECIMAL || (t)==FIELD_TYPE_DOUBLE || (t)==FIELD_TYPE_FLOAT || (t)==FIELD_TYPE_INT24 || (t)==FIELD_TYPE_YEAR || (t)==FIELD_TYPE_SHORT || (t)==FIELD_TYPE_TIMESTAMP || (t)==FIELD_TYPE_TINY ) which works for me but IS_NUM_FIELD() should work. Regards
[24 May 2005 0:24]
Jim Winstead
Sorry, there's not a usable test case here. The test needs to include the table, C code, the output, and the desired output. Miguel, please create a real test case for this bug. Thanks!
[24 May 2005 4:43]
MySQL Verification Team
I have tested now with latest 4.1.13 and the behavior presented by 4.1.11 not exists anymore. Test case: Create the table on test database: mysql> use test; Database changed mysql> CREATE TABLE `mp3_files` ( -> `ID` bigint(20) NOT NULL auto_increment, -> `Title` varchar(128) default NULL, -> `Artist` varchar(128) default NULL, -> `Album` varchar(128) default NULL, -> `Genre` varchar(32) default NULL, -> `Rating` tinyint(4) default NULL, -> `TrackTime` int(11) default NULL, -> `Nr` smallint(6) default NULL, -> `Bitrate` int(11) default NULL, -> `NumberOfChannels` smallint(6) default NULL, -> `RecYear` smallint(6) default NULL, -> `ArtistWebPage` varchar(255) default NULL, -> `TrackType` smallint(6) default NULL, -> `TrackFormat` varchar(50) default NULL, -> `File_name` varchar(255) NOT NULL, -> `DateAdded` varchar(40) default NULL, -> `ModTime` varchar(40) default NULL, -> `DateLastPlayed` varchar(40) default NULL, -> `TrackPlayCount` int(11) default NULL, -> `FileSizeInBytes` double default NULL, -> `DiskNumberInSet` smallint(6) default NULL, -> `TotalDisksInSet` smallint(6) default NULL, -> `Composer` varchar(128) default NULL, -> `FeaturedArtists` varchar(128) default NULL, -> `Instrument` varchar(128) default NULL, -> `Lyrics` mediumtext, -> `Notes` mediumtext, -> `ArtistBio` mediumtext, -> PRIMARY KEY (`ID`) -> ) ENGINE=MyISAM DEFAULT CHARSET=latin1; Query OK, 0 rows affected (0.09 sec) Create the below C API console application: #include <stdio.h> #include <my_global.h> #include <mysql.h> #include <errmsg.h> int do_select(MYSQL *mysql, const char *qry) { MYSQL_RES *res; MYSQL_FIELD *field; if ((mysql_query(mysql, qry) != 0)) return (0); if ((res = mysql_store_result(mysql))) { printf("Query: %s\n", qry); while((field = mysql_fetch_field(res))) printf("IS_NUM_FIELD(%s): %d\n", field->name, IS_NUM_FIELD(field)); mysql_free_result(res); printf("\n"); return 1; } return 0; } int main () { MYSQL *mysql; mysql= mysql_init(NULL); mysql_real_connect(mysql,"localhost","root","","test",0,NULL,0); do_select(mysql, "SELECT * FROM mp3_files"); do_select(mysql, "SELECT * FROM mp3_files LIMIT 10"); mysql_close(mysql); return 0; } Run the console application: D:\temp>bug10276 Query: SELECT * FROM mp3_files IS_NUM_FIELD(ID): 32768 IS_NUM_FIELD(Title): 0 IS_NUM_FIELD(Artist): 0 IS_NUM_FIELD(Album): 0 IS_NUM_FIELD(Genre): 0 IS_NUM_FIELD(Rating): 32768 IS_NUM_FIELD(TrackTime): 32768 IS_NUM_FIELD(Nr): 32768 IS_NUM_FIELD(Bitrate): 32768 IS_NUM_FIELD(NumberOfChannels): 32768 IS_NUM_FIELD(RecYear): 32768 IS_NUM_FIELD(ArtistWebPage): 0 IS_NUM_FIELD(TrackType): 32768 IS_NUM_FIELD(TrackFormat): 0 IS_NUM_FIELD(File_name): 0 IS_NUM_FIELD(DateAdded): 0 IS_NUM_FIELD(ModTime): 0 IS_NUM_FIELD(DateLastPlayed): 0 IS_NUM_FIELD(TrackPlayCount): 32768 IS_NUM_FIELD(FileSizeInBytes): 32768 IS_NUM_FIELD(DiskNumberInSet): 32768 IS_NUM_FIELD(TotalDisksInSet): 32768 IS_NUM_FIELD(Composer): 0 IS_NUM_FIELD(FeaturedArtists): 0 IS_NUM_FIELD(Instrument): 0 IS_NUM_FIELD(Lyrics): 0 IS_NUM_FIELD(Notes): 0 IS_NUM_FIELD(ArtistBio): 0 Query: SELECT * FROM mp3_files LIMIT 10 IS_NUM_FIELD(ID): 32768 IS_NUM_FIELD(Title): 0 IS_NUM_FIELD(Artist): 0 IS_NUM_FIELD(Album): 0 IS_NUM_FIELD(Genre): 0 IS_NUM_FIELD(Rating): 32768 IS_NUM_FIELD(TrackTime): 32768 IS_NUM_FIELD(Nr): 32768 IS_NUM_FIELD(Bitrate): 32768 IS_NUM_FIELD(NumberOfChannels): 32768 IS_NUM_FIELD(RecYear): 32768 IS_NUM_FIELD(ArtistWebPage): 0 IS_NUM_FIELD(TrackType): 32768 IS_NUM_FIELD(TrackFormat): 0 IS_NUM_FIELD(File_name): 0 IS_NUM_FIELD(DateAdded): 0 IS_NUM_FIELD(ModTime): 0 IS_NUM_FIELD(DateLastPlayed): 0 IS_NUM_FIELD(TrackPlayCount): 32768 IS_NUM_FIELD(FileSizeInBytes): 32768 IS_NUM_FIELD(DiskNumberInSet): 32768 IS_NUM_FIELD(TotalDisksInSet): 32768 IS_NUM_FIELD(Composer): 0 IS_NUM_FIELD(FeaturedArtists): 0 IS_NUM_FIELD(Instrument): 0 IS_NUM_FIELD(Lyrics): 0 IS_NUM_FIELD(Notes): 0 IS_NUM_FIELD(ArtistBio): 0