[development] touchy mysql ordering

randall at thinkingoutloud.org randall at thinkingoutloud.org
Mon Feb 13 18:53:17 UTC 2006


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/ .




More information about the development mailing list