[development] touchy mysql ordering

Tao Starbow starbow at citris-uc.org
Tue Feb 14 23:21:11 UTC 2006


Hope I am not just talking to myself here.
I have submitted patches to event, image & taxonomy for 4.6.  If they 
get reviewed and get positive feedback, I will see if similar patches 
need to be created for 4.7/cvs versions.

Tao Starbow wrote:

> I have followed up on this issue at: 
> http://drupal.org/node/43735#comment-92865
> I will be submitting patches to event.module, image.module & 
> taxonomy.module.
>
> It would be great if someone would patch db_rewrite_sql() itself to 
> warn when it is being used incorrectly.  I think the correct behavior 
> is to warn if the $primary_table does not match the first table in the 
> FROM clause.  I will take a pass at it, but it's going to take me a 
> while to figure out how the function works.
>
> The problem with the USING clause is harder ("Column 'nid' in from 
> clause is ambiguous").  This is not a case of db_rewrite_sql being 
> called incorrectly.  Using USING is fine for a select with two 
> tables,  but the rewrite converts the select into a three (or more?) 
> table join.  Mysql used to guess which of the tables to apply the 
> USING clause to, now it throws an error.  My guess is that 
> db_rewrite_sql is going to be forced to reject the use of USING 
> altogether.
>
> -tao
>
> randall at thinkingoutloud.org wrote:
>
>> MySQL bug or module bug ?
>>
>> Sorry, to post about the same issue, but I am really trying to 
>> understand
>> this.
>>
>> ---1---
>> This query (as seen in event.module):
>> SELECT n.nid, e.event_start FROM event e INNER JOIN node n ON n.nid = 
>> e.nid
>> When passed thru the db_rewrite_sql() function, the function returns 
>> this
>> query:
>>
>> SELECT DISTINCT(n.nid), e.event_start FROM event e INNER JOIN 
>> node_access
>> na ON na.nid = n.nid INNER JOIN node n ON n.nid = e.nid
>> -------
>>
>> ---2---
>> This query (the proposed fix):
>> SELECT n.nid, e.event_start FROM node n INNER JOIN event e ON n.nid = 
>> e.nid
>> When passed thru the db_rewrite_sql() function, the function returns 
>> this
>> query:
>>
>> SELECT DISTINCT(n.nid), e.event_start FROM node n INNER JOIN 
>> node_access na
>> ON na.nid = n.nid INNER JOIN event e ON n.nid = e.nid -------
>>
>> Query 1 and 2 prior to being passed to the db_rewrite_sql() function are
>> essentially the same.
>>
>> After being passed to the db_rewrite_sql() function...
>> Query 1 produces an error in MySQL 5.0 and Query 2 does not.
>>
>> So, is this a MySQL bug or module bug ?
>>
>> Thanks
>>
>> Randall
>>
>>
>> Original Message:
>> -----------------
>> From: Chris Johnson chris at tinpixel.com
>> Date: Mon, 13 Feb 2006 10:10:43 -0600
>> To: development at drupal.org
>> Subject: Re: [development] touchy mysql ordering
>>
>>
>> Tao Starbow wrote:
>>  
>>
>>> Stop me if you've heard this one before.
>>>
>>> I recently upgraded the server running my Drupal site, and the 
>>> events calendar stopped working for everyone except user=1.  I 
>>> tracked down the problem to this (simplified) line of SQL:
>>> SELECT n.nid, e.event_start FROM {event} e INNER JOIN {node} n ON 
>>> n.nid = e.nid
>>> This returns all my events if the user=1, and zero if the user is 
>>> anyone else.
>>> However, if I rewrite the SQL as:
>>> SELECT n.nid, e.event_start FROM {node} n INNER JOIN {event} e ON 
>>> n.nid = e.nid
>>> then it behaves as I would expect, returning all events regardless 
>>> of who the user is.
>>>
>>> I did not have this problem on my old server, which was running 
>>> mysql 4.0.20-max.  The new server is running mysql 5.0.17.
>>>
>>> I suspect whatever is causing this is also at the root of my 
>>> node_access_by_role issue (http://drupal.org/node/40623).  I guess 
>>> my next move is to install the devel module and see if I can find a 
>>> difference between the sql actually being generated when user=1 vs
>>>   
>>
>> user!=1.
>>
>> If the actual generated SQL works/fails as you describe in the 
>> simplified
>> SQL above, I think you have found a bug in MySQL.  INNER JOIN should 
>> be commutative, that is, it should not matter which order the two joined
>> tables are listed, the results should be the same.
>>
>>
>>
>> --------------------------------------------------------------------
>> mail2web - Check your email from the web at
>> http://mail2web.com/ .
>>
>>
>>  
>>
>

-- 
Tao Starbow
Web Architect, CITRIS



More information about the development mailing list