[development] Is "SELECT * FROM ..." ok?

Ken Rickard agentrickard at gmail.com
Sat Feb 14 19:18:04 UTC 2009


One additional (bugworthy) note:

Using SELECT * on a {node} query breaks db_rewrite_sql() in Drupal 5
and Drupal 6. [1]

This opens a quasi-security hole where content may be shown to
non-privileged users.

This is due to the fact that node_db_rewrite_sql() adds 'distinct' ==
TRUE, and you cannot run DISTINCT(*) queries.

So, in the case of node list queries, SELECT * is _definitely_ a bug.

- Ken Rickard
Palantir.net

[1] -- http://drupal.org/node/324070


On Fri, Feb 13, 2009 at 10:23 PM, David Metzler <metzlerd at metzlerd.com> wrote:
> I would definitely agree here.  Selecting from watchdog definitely deserves
> to have the columns listed.  Selecting from taxonomies and categories are
> the same.   But there are places in CCK and views that select * might be
> considered more appropriate.   As a developer I'd love to see such comments
> in a patch review or code review, but I wouldn't love to see a bunch of
> issues filed because someone grepped my code for select *.
>
> I was really pointing out the fallacy of the select * = poor performance
> argument, and that you might do as well to find out how many ROWS were
> returned by the select statement in question, plus start searching for outer
> joins ,etc.
>
> And don't event get me started on insert statements without column lists..
>
> dave
>
>
>
> On Feb 13, 2009, at 7:15 AM, Morbus Iff wrote:
>
>>
>> I give *little* regard for performance (in this case), and everything for
>> my *expectations* and *documentation*. I could care less if it's faster or
>> not. I care more about clarity.
>>
>> David Metzler wrote:
>>>
>>> Although there are merits in this argument, I wouldn't classify it as  a
>>> bug.  There's a lot of generic/abstracted data loading, and as long  as
>>> there's code at there that dynamically adds columns, select *  actually is
>>> the sanest way to do things.
>>> Also, the performance costs are database dependent. Mysql may work  one
>>> way, but other db's work another.   Any DB with precompiled  cached queries
>>> is not going to carry significant parsing overhead.   The amount of data
>>> transfered in most cases is dependent on the size  of the data in the column
>>> and not the number of columns.  So in some  tables it may make sense.  You
>>> might get the name of the image file  in drupal, but you're not likely to
>>> get the image.
>>> Finally in my experience, most database performance problems lie in  what
>>> is in the WHERE or JOIN, and not what's in the column list.
>>
>> --
>> Morbus Iff ( masochism-oriented recombinant bot (unlisted series) )
>> Technical: http://www.oreillynet.com/pub/au/779
>> Enjoy: http://www.disobey.com/ and http://www.videounderbelly.com/
>> aim: akaMorbus / skype: morbusiff / icq: 2927491 / jabber.org: morbus
>
>



-- 
Ken Rickard
agentrickard at gmail.com
http://ken.therickards.com


More information about the development mailing list