> t...@sss.pgh.pa.us wrote:
> 
>> b...@yugabyte.com wrote:
>> 
>> Why is the "array()" constructor not found in "pg_proc"?
> 
> Because it isn't a function. Yeah, it kind of looks like one, but its 
> argument is a subquery. If SQL had first-class functions and closures, maybe 
> ARRAY() could be implemented as an ordinary function. But I don't see any 
> plausible way to do that as things stand.
> 
> There are a bunch of other things that look like functions but aren't in 
> pg_proc, too :-(. Most of them are just catering to the SQL committee's weird 
> allergy to writing functions with plain function syntax. But ARRAY()'s 
> problem is semantic not syntactic.

There must be a significant difference between this:

  select 'dog'

and this:

  (select 'dog')

This works fine:

  select length( (select 'dog') )

But without the doubled parentheses, it causes a syntax error.

On the other hand, an extra pair of surrounding parentheses here

  select array( (values (17), (42)) )

while not necessary, *is* tolerated.

All this started because I had wrongly assumed that "pg_terminate_backend()" 
would have the same character as "array()" by not being subject to the 
"execute" privilege — just as is the case for all SQL built-ins in Oracle 
database, like "length()". I have a better mental model now.

Anyway, I know what to do in future. I'll simply look in pg_proc on a 
case-by-case basis.

Reply via email to