Hi!
>>>>> "Andrew" == Andrew Schmidt <[EMAIL PROTECTED]> writes:
>> Description:
Andrew> tough one to describe. the step by step example shows all
Andrew> basicly once a table gets more than 1 row and doing a select with no
Andrew> result will yield a blank date... gah please see the example =)
>> How-To-Repeat:
Andrew> create database tmpdb;
Andrew> use tmpdb;
Andrew> create table test (foo int);
Andrew> insert into test values (1);
Andrew> select NOW(), count(*) from test where foo in (2);
Andrew> +---------------------+----------+
Andrew> | NOW() | count(*) |
Andrew> +---------------------+----------+
Andrew> | 2001-04-20 17:21:29 | 0 |
Andrew> +---------------------+----------+
Andrew> insert into test values (1);
Andrew> select NOW(), count(*) from test where foo in (2);
Andrew> +-------+----------+
Andrew> | NOW() | count(*) |
Andrew> +-------+----------+
Andrew> | | 0 |
Andrew> +-------+----------+
Andrew> notice the date field is blank.
The problem here is that when you normally don't have any matching
rows, SQL will return an empty set.
When you add a group function, MySQL will return a surrogate row
where all column values are null.
MySQL uses a different optimization when you have just one table in
the result set and this was the cause for the different results.
Here is a patch for this:
===== sql/sql_select.cc 1.94 vs edited =====
*** /tmp/sql_select.cc-1.94-21846 Thu Apr 19 20:41:18 2001
--- edited/sql/sql_select.cc Sat Apr 21 17:02:49 2001
***************
*** 4643,4649 ****
--- 4643,4653 ----
else
{
if (!join->first_record)
+ {
+ /* No matching rows for group function */
clear_tables(join);
+ copy_fields(&join->tmp_table_param);
+ }
if (join->having && join->having->val_int() == 0)
error= -1; // Didn't satisfy having
else
***************
*** 4875,4881 ****
--- 4879,4889 ----
if (idx < (int) join->send_group_parts)
{
if (!join->first_record)
+ {
+ /* No matching rows for group function */
clear_tables(join);
+ copy_fields(&join->tmp_table_param);
+ }
copy_sum_funcs(join->sum_funcs);
if (!join->having || join->having->val_int())
{
***************
*** 4899,4905 ****
}
if (idx < (int) join->send_group_parts)
{
- copy_fields(&join->tmp_table_param);
copy_funcs(join->tmp_table_param.funcs);
init_sum_functions(join->sum_funcs);
if (join->procedure)
--- 4907,4912 ----
Regards,
Monty
---------------------------------------------------------------------
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php