Re: Oddity with NOT IN - Mailing list pgsql-hackers

From Corey Huinker
Subject Re: Oddity with NOT IN
Date
Msg-id CADkLM=fKB=Qhw9buhW=Fs-MwO5X=KkKbJMuJAq_dj1qTRxLyyg@mail.gmail.com
Whole thread
In response to Re: Oddity with NOT IN  (Jim Nasby <Jim.Nasby@BlueTreble.com>)
List pgsql-hackers
On Sat, Aug 6, 2016 at 2:13 PM, Jim Nasby <Jim.Nasby@bluetreble.com> wrote:
On 8/6/16 12:57 PM, Andrew Gierth wrote:
The easy to catch case, I think, is when the targetlist of the IN or NOT
IN subquery contains vars of the outer query level but no vars of the
inner one and no volatile functions. This can be checked for with a
handful of lines in the parser or a couple of dozen lines in a plugin
module (though one would have to invent an error code, none of the
existing WARNING sqlstates would do).

I would still like to warn on any outer vars show up in the target list (other than as function params), because it's still very likely to be a bug. But I agree that what you describe is even more certain to be one.

Maybe David Fetter's suggested module for catching missing WHERE clauses
could be expanded into a more general SQL-'Lint' module?

Possibly, though I hadn't really considered treating this condition as an error.

Also, there's some other common gotchas that we could better warn users about, some of which involve DDL. One example is accidentally defining duplicate indexes.
--
Jim Nasby, Data Architect, Blue Treble Consulting, Austin TX
Experts in Analytics, Data Architecture and PostgreSQL
Data in Trouble? Get it in Treble! http://BlueTreble.com
855-TREBLE2 (855-873-2532)   mobile: 512-569-9461


--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

If we are contemplating a setting wherein we issue debug/notice/warning messages for potentially erroneous SQL, I would suggest a simple test would be any reference to a column without the a corresponding table/alias.

This is fine:
    SELECT a.x, b.y FROM table_that_has_x a JOIN table_that_has_y b ON a.id = b.foreign_id
This gives the notice/warning:
    SELECT x, b.y FROM table_that_has_x a JOIN table_that_has_y b ON a.id = b.foreign_id

We'd have to suppress the warning in cases where no tables are mentioned (no table to alias, i.e. "SELECT 'a_constant' as config_var"), and I could see a reason for suppressing it where only one table is mentioned, though I often urge table aliasing and full references because it makes it easier when you modify the query to add another table.

Some setting name suggestions:

notify_vague_column_reference = (on,off)
pedantic_column_identifiers = (off,debug,notice,warn,error)

pgsql-hackers by date:

Previous
From: Peter Geoghegan
Date:
Subject: Re: Parallel tuplesort (for parallel B-Tree index creation)
Next
From: Matt Kelly
Date:
Subject: Re: Surprising behaviour of \set AUTOCOMMIT ON