Thread: About the function current_user

About the function current_user

From
"Xiong He"
Date:
Dear All,

Just confused,  why :
postgres=# select current_user;
 current_user
--------------
 postgres
(1 row)

postgres=# select current_user();
2023-03-20 07:00:02.981 UTC [17281] ERROR:  syntax error at or near "(" at character 20
2023-03-20 07:00:02.981 UTC [17281] STATEMENT:  select current_user();
ERROR:  syntax error at or near "("
LINE 1: select current_user();
                           ^

why current_user() is not recognized?  
But the similar function current_database and current_database(), both can work.

Regards,
Xiong He [iihero] 


 

Re: About the function current_user

From
Pavel Stehule
Date:
Hi


po 20. 3. 2023 v 8:01 odesílatel Xiong He <iihero@qq.com> napsal:
Dear All,

Just confused,  why :
postgres=# select current_user;
 current_user
--------------
 postgres
(1 row)

postgres=# select current_user();
2023-03-20 07:00:02.981 UTC [17281] ERROR:  syntax error at or near "(" at character 20
2023-03-20 07:00:02.981 UTC [17281] STATEMENT:  select current_user();
ERROR:  syntax error at or near "("
LINE 1: select current_user();
                           ^

why current_user() is not recognized?  

this is not real function - it is pseudo constant

The real function in postgres has a record in the pg_proc table.

Regards

Pavel

 
But the similar function current_database and current_database(), both can work.

Regards,
Xiong He [iihero] 


 

Re: About the function current_user

From
Daniel Gustafsson
Date:
> On 20 Mar 2023, at 08:05, Pavel Stehule <pavel.stehule@gmail.com> wrote:
> po 20. 3. 2023 v 8:01 odesílatel Xiong He <iihero@qq.com <mailto:iihero@qq.com>> napsal:

> why current_user() is not recognized?
>
> this is not real function - it is pseudo constant
>
> The real function in postgres has a record in the pg_proc table.

The syntax of current_user and current_role are mandated by the SQL
specification, we have this note in the documentation:

    "current_catalog, current_role, current_schema, current_user,
    session_user, and user have special syntactic status in SQL: they must
    be called without trailing parentheses.  In PostgreSQL, parentheses can
    optionally be used with current_schema, but not with the others."

Given that current_schema and other current_xx functions accept parenthesis
it's easy to understand the confusion though.

--
Daniel Gustafsson




Re: About the function current_user

From
John Naylor
Date:

On Mon, Mar 20, 2023 at 3:16 PM Daniel Gustafsson <daniel@yesql.se> wrote:

> The syntax of current_user and current_role are mandated by the SQL
> specification, we have this note in the documentation:
>
>         "current_catalog, current_role, current_schema, current_user,
>         session_user, and user have special syntactic status in SQL: they must
>         be called without trailing parentheses.  In PostgreSQL, parentheses can
>         optionally be used with current_schema, but not with the others."

To further illuminate why the last one is special: It's not a fully-reserved keyword:

$ grep current_ src/include/parser/kwlist.h
PG_KEYWORD("current_catalog", CURRENT_CATALOG, RESERVED_KEYWORD, BARE_LABEL)
PG_KEYWORD("current_date", CURRENT_DATE, RESERVED_KEYWORD, BARE_LABEL)
PG_KEYWORD("current_role", CURRENT_ROLE, RESERVED_KEYWORD, BARE_LABEL)
PG_KEYWORD("current_schema", CURRENT_SCHEMA, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL)
PG_KEYWORD("current_time", CURRENT_TIME, RESERVED_KEYWORD, BARE_LABEL)
PG_KEYWORD("current_timestamp", CURRENT_TIMESTAMP, RESERVED_KEYWORD, BARE_LABEL)
PG_KEYWORD("current_user", CURRENT_USER, RESERVED_KEYWORD, BARE_LABEL)

--
John Naylor
EDB: http://www.enterprisedb.com

Re: About the function current_user

From
"Xiong He"
Date:
Thanks a lot. 
And how to understand below result? 

postgres=# select current_database();
 current_database
------------------
 postgres
(1 row)

postgres=# select current_database;
ERROR:  column "current_database" does not exist
LINE 1: select current_database;


------------------ Original ------------------
From: "Daniel Gustafsson" <daniel@yesql.se>;
Date: Mon, Mar 20, 2023 04:16 PM
To: "Pavel Stehule"<pavel.stehule@gmail.com>;
Cc: "Xiong He"<iihero@qq.com>;"pgsql-bugs"<pgsql-bugs@lists.postgresql.org>;
Subject: Re: About the function current_user

> On 20 Mar 2023, at 08:05, Pavel Stehule <pavel.stehule@gmail.com> wrote:
> po 20. 3. 2023 v 8:01 odesílatel Xiong He <iihero@qq.com <mailto:iihero@qq.com>> napsal:

> why current_user() is not recognized? 
>
> this is not real function - it is pseudo constant
>
> The real function in postgres has a record in the pg_proc table.

The syntax of current_user and current_role are mandated by the SQL
specification, we have this note in the documentation:

"current_catalog, current_role, current_schema, current_user,
session_user, and user have special syntactic status in SQL: they must
be called without trailing parentheses.  In PostgreSQL, parentheses can
optionally be used with current_schema, but not with the others."

Given that current_schema and other current_xx functions accept parenthesis
it's easy to understand the confusion though.

--
Daniel Gustafsson

Re: About the function current_user

From
"Xiong He"
Date:
Great. So if it's in the PG_KEYWORD list,  we should not use current_*()?  

------------------ Original ------------------
From: "John Naylor" <john.naylor@enterprisedb.com>;
Date: Mon, Mar 20, 2023 04:49 PM
To: "Daniel Gustafsson"<daniel@yesql.se>;
Cc: "Pavel Stehule"<pavel.stehule@gmail.com>;"Xiong He"<iihero@qq.com>;"pgsql-bugs"<pgsql-bugs@lists.postgresql.org>;
Subject: Re: About the function current_user


On Mon, Mar 20, 2023 at 3:16 PM Daniel Gustafsson <daniel@yesql.se> wrote:

> The syntax of current_user and current_role are mandated by the SQL
> specification, we have this note in the documentation:
>
>         "current_catalog, current_role, current_schema, current_user,
>         session_user, and user have special syntactic status in SQL: they must
>         be called without trailing parentheses.  In PostgreSQL, parentheses can
>         optionally be used with current_schema, but not with the others."

To further illuminate why the last one is special: It's not a fully-reserved keyword:

$ grep current_ src/include/parser/kwlist.h
PG_KEYWORD("current_catalog", CURRENT_CATALOG, RESERVED_KEYWORD, BARE_LABEL)
PG_KEYWORD("current_date", CURRENT_DATE, RESERVED_KEYWORD, BARE_LABEL)
PG_KEYWORD("current_role", CURRENT_ROLE, RESERVED_KEYWORD, BARE_LABEL)
PG_KEYWORD("current_schema", CURRENT_SCHEMA, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL)
PG_KEYWORD("current_time", CURRENT_TIME, RESERVED_KEYWORD, BARE_LABEL)
PG_KEYWORD("current_timestamp", CURRENT_TIMESTAMP, RESERVED_KEYWORD, BARE_LABEL)
PG_KEYWORD("current_user", CURRENT_USER, RESERVED_KEYWORD, BARE_LABEL)

--
John Naylor
EDB: http://www.enterprisedb.com

Re: About the function current_user

From
John Naylor
Date:

On Mon, Mar 20, 2023 at 4:35 PM Xiong He <iihero@qq.com> wrote:
>
> Great. So if it's in the PG_KEYWORD list,  we should not use current_*()?  

That was just an explanation, regarding "reserved keywords", since you asked "why".

The documentation should have the correct uses. If it does, there is no bug here.

Speaking of bugs, I was wondering why appendix C didn't show up when searching within the doc website -- it's because the heading in appendix C spells it "key words", a spelling which seems non-standard and gets interpreted as "keywords" in a web search.

--
John Naylor
EDB: http://www.enterprisedb.com

Re: About the function current_user

From
John Naylor
Date:

On Mon, Mar 20, 2023 at 3:57 PM Xiong He <iihero@qq.com> wrote:
>
> Thanks a lot.
> And how to understand below result?
>
> postgres=# select current_database();
>  current_database
> ------------------
>  postgres
> (1 row)
>
> postgres=# select current_database;
> ERROR:  column "current_database" does not exist
> LINE 1: select current_database;

"current_database" is not a keyword.

--
John Naylor
EDB: http://www.enterprisedb.com

Re: About the function current_user

From
Peter Eisentraut
Date:
On 20.03.23 13:13, John Naylor wrote:
> Speaking of bugs, I was wondering why appendix C didn't show up when 
> searching within the doc website -- it's because the heading in appendix 
> C spells it "key words", a spelling which seems non-standard and gets 
> interpreted as "keywords" in a web search.

The reason for that is that the SQL standard uses mainly "key word". 
But it's also somewhat inconsistent about that.