Обсуждение: pg ANY/SOME ambiguity wrt sql standard?
I'm looking into adding sql standard aggregates EVERY/ANY/SOME. It seems to me that there is a syntax ambiguity with ANY and SOME: CREATE TABLE bla(b BOOL);SELECT TRUE = ANY(b) FROM bla; Is parsed as an array-operator and there is a semantical error because no array is provided. Now ANY could be an aggregate function call, and it should be fine. However I really cannot see (my usual lack of imagination) how to handle this from the parser. Thus I'm afraid that I'll have to rewrite the A_Expr structure into a FuncCall to 'any' or 'some' somewhere. Comments? Any better idea? -- Fabien Coelho - coelho@cri.ensmp.fr
> It seems to me that there is a syntax ambiguity with ANY and SOME: > > CREATE TABLE bla(b BOOL); > SELECT TRUE = ANY(b) FROM bla; > > Is parsed as an array-operator and there is a semantical error because no > array is provided. Now ANY could be an aggregate function call, and it > should be fine. Well, it is not that fine, because allowing ANY and SOME as function name generates a lot of conflicts, obviously. The reverse (let us recognize an array expression in an function call wouldn't work either, as the parser need the special handling of ANY/SOME in order to look for subselects. > Thus I'm afraid that I'll have to rewrite the A_Expr structure into a > FuncCall to 'any' or 'some' somewhere. > Comments? Any better idea? So my question is "Any idea?" instead of "Any better idea?" :-( -- Fabien Coelho - coelho@cri.ensmp.fr
Fabien COELHO <coelho@cri.ensmp.fr> writes:
> I'm looking into adding sql standard aggregates EVERY/ANY/SOME.
> It seems to me that there is a syntax ambiguity with ANY and SOME:
> CREATE TABLE bla(b BOOL);
> SELECT TRUE = ANY(b) FROM bla;
AFAICS this ambiguity is built into the SQL standard, and in fact it's
possible to generate cases that are legally parseable either way:
SELECT foo.x = ANY((SELECT bar.y FROM bar)) FROM foo;
The parenthesized sub-select could be a plain <value expression>,
in which case ANY must be an aggregate function call, or we could
regard it as a <table subquery>, in which case we've got a <quantified
comparison predicate>. These interpretations could both work, if the
sub-select yields only one row, but they won't necessarily give the same
answer.
So I think that the SQL committee shot themselves in the foot when they
decided it was a good idea to call the boolean-OR aggregate "ANY", and
our addition of an array option isn't the fundamental problem.
Anyone know if SQL2003 fixed this silliness?
regards, tom lane
> AFAICS this ambiguity is built into the SQL standard, and in fact it's > possible to generate cases that are legally parseable either way: > > SELECT foo.x = ANY((SELECT bar.y FROM bar)) FROM foo; > > [...] > > So I think that the SQL committee shot themselves in the foot when they > decided it was a good idea to call the boolean-OR aggregate "ANY", and > our addition of an array option isn't the fundamental problem. > > Anyone know if SQL2003 fixed this silliness? It does not seemed to be fixed in the copy I found, but it may not be the last version. As a "temporary" fix, what about "_ANY" and "_SOME" as aggregate names? -- Fabien Coelho - coelho@cri.ensmp.fr
Fabien COELHO <coelho@cri.ensmp.fr> writes:
> As a "temporary" fix, what about "_ANY" and "_SOME" as aggregate names?
Ick :-(. The use of leading underscores is an ugly C-ism that we should
not propagate into SQL names.
How about bool_or() and bool_and()? Or at least something based on OR
and AND? I don't find ANY/ALL to be particularly mnemonic for this
usage anyway.
regards, tom lane
Tom Lane wrote:<br /><blockquote cite="mid8707.1083373014@sss.pgh.pa.us" type="cite"><pre wrap="">Fabien COELHO <a
class="moz-txt-link-rfc2396E"href="mailto:coelho@cri.ensmp.fr"><coelho@cri.ensmp.fr></a> writes:
</pre><blockquotetype="cite"><pre wrap="">As a "temporary" fix, what about "_ANY" and "_SOME" as aggregate names?
</pre></blockquote><prewrap="">
Ick :-(. The use of leading underscores is an ugly C-ism that we should
not propagate into SQL names.
</pre></blockquote> I second this... the whole __ is hard to type and remember.<br /><br /> Sincerely,<br /><br />
JoshuaD. Drake<br /><br /><br /><br /><blockquote cite="mid8707.1083373014@sss.pgh.pa.us" type="cite"><pre wrap="">How
aboutbool_or() and bool_and()? Or at least something based on OR
and AND? I don't find ANY/ALL to be particularly mnemonic for this
usage anyway.
regards, tom lane
---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to <a class="moz-txt-link-abbreviated"
href="mailto:majordomo@postgresql.org">majordomo@postgresql.org</a></pre></blockquote><br /><br /><pre
class="moz-signature"cols="72">--
Command Prompt, Inc., home of Mammoth PostgreSQL - S/ODBC and S/JDBC
Postgresql support, programming shared hosting and dedicated hosting.
+1-503-667-4564 - <a class="moz-txt-link-abbreviated" href="mailto:jd@commandprompt.com">jd@commandprompt.com</a> - <a
class="moz-txt-link-freetext"href="http://www.commandprompt.com">http://www.commandprompt.com</a>
PostgreSQL Replicator -- production quality replication for PostgreSQL</pre>
> > As a "temporary" fix, what about "_ANY" and "_SOME" as aggregate names? > > Ick :-(. The use of leading underscores is an ugly C-ism that we should > not propagate into SQL names. Ok. > How about bool_or() and bool_and()? Or at least something based on OR > and AND? I don't find ANY/ALL to be particularly mnemonic for this > usage anyway. Yep. The standard "EVERY" is fine for postgres, the issue is only with ANY/SOME. Do you think that bool_and should be proposed anyway for homogeneity with bool_or? -- Fabien Coelho - coelho@cri.ensmp.fr
Fabien COELHO <coelho@cri.ensmp.fr> writes:
> The standard "EVERY" is fine for postgres, the issue is only with
> ANY/SOME.
> Do you think that bool_and should be proposed anyway for homogeneity
> with bool_or?
I think EVERY is actively misleading, because it does *not* imply that
every input is TRUE. The spec says these aggregates should ignore
nulls, and so a true result only implies that there were no FALSE
inputs.
OTOH one could argue that the ignore-nulls behavior makes this not a
true analog of AND, either ...
regards, tom lane
Dear Tom, > > The standard "EVERY" is fine for postgres, the issue is only with > > ANY/SOME. Do you think that bool_and should be proposed anyway for > > homogeneity with bool_or? > > I think EVERY is actively misleading, because it does *not* imply that > every input is TRUE. The spec says these aggregates should ignore > nulls, and so a true result only implies that there were no FALSE > inputs. > > OTOH one could argue that the ignore-nulls behavior makes this not a > true analog of AND, either ... Argh, how stupid I am, I missread the specification! Then the patch I sent yesterday is wrong if NULL values are encountered:-( I should learn how to read sometimes... However, I did not name the boolean and aggregate EVERY, it is BOOL_AND (in the patch), because I tend to prefer homogeneity. I'll resubmit a patch later. -- Fabien Coelho - coelho@cri.ensmp.fr