About the function current_user

Started by Xiong Heabout 3 years ago9 messagesbugs
Jump to latest
#1Xiong He
iihero@qq.com

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] 

 

#2Pavel Stehule
pavel.stehule@gmail.com
In reply to: Xiong He (#1)
Re: About the function current_user

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

Show quoted text

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

Regards,
Xiong He [iihero]

#3Daniel Gustafsson
daniel@yesql.se
In reply to: Pavel Stehule (#2)
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

#4John Naylor
john.naylor@enterprisedb.com
In reply to: Daniel Gustafsson (#3)
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

#5Xiong He
iihero@qq.com
In reply to: Daniel Gustafsson (#3)
Re: About the function current_user

Thanks a lot.&nbsp;
And how to understand below result?&nbsp;

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

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

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

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

&gt; why current_user() is not recognized?&nbsp;
&gt;
&gt; this is not real function - it is pseudo constant
&gt;
&gt; 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.&nbsp; 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

#6Xiong He
iihero@qq.com
In reply to: John Naylor (#4)
Re: About the function current_user

Great. So if it's in the PG_KEYWORD list,&nbsp; we should not use current_*()?&nbsp;&nbsp;

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

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

&gt; The syntax of current_user and current_role are mandated by the SQL
&gt; specification, we have this note in the documentation:
&gt;
&gt; &nbsp; &nbsp; &nbsp; &nbsp; "current_catalog, current_role, current_schema, current_user,
&gt; &nbsp; &nbsp; &nbsp; &nbsp; session_user, and user have special syntactic status in SQL: they must
&gt; &nbsp; &nbsp; &nbsp; &nbsp; be called without trailing parentheses.&nbsp; In PostgreSQL, parentheses can
&gt; &nbsp; &nbsp; &nbsp; &nbsp; 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

#7John Naylor
john.naylor@enterprisedb.com
In reply to: Xiong He (#6)
Re: About the function current_user

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

#8John Naylor
john.naylor@enterprisedb.com
In reply to: Xiong He (#5)
Re: About the function current_user

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

#9Peter Eisentraut
peter_e@gmx.net
In reply to: John Naylor (#7)
Re: About the function current_user

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.