1

I want to use a query result as comment on the table. I have tried in psql:

\set list select count(*) from department.master_data
COMMENT ON TABLE department.master_data IS :list;

But I got this error:

it=> \set list select count(*) from department.master_data
it=> COMMENT ON TABLE department.master_data IS :list;
ERROR: syntax error at or near "selectcount"
LINE 1: ...ABLE department.master_data IS selectcoun...
Erwin Brandstetter
186k28 gold badges463 silver badges636 bronze badges
asked Apr 8, 2019 at 4:17
1
  • Why would you want to do that? Maybe you should tell us what the real, underlying problem is that you are trying to solve with that. Commented Apr 8, 2019 at 12:06

3 Answers 3

1

While I am not sure what you want to achieve (why it makes sense to store a count as a comment, especially if your table will get new rows (or lose some to DELETEs)), but here is how what your problem is and how you can solve it.

First, check what psql thinks you have in the variable:

\echo :list
selectcount(*)fromdepartment.master_data

Clearly not the result of your query. To store that, you'll have to use \gset:

> SELECT count(*) AS master_data_count FROM department.master_data;
 master_data_count
───────────────────
 1234567890
(1 row)
> \gset
> \echo :master_data_count
1234567890

If you would try to set the table description now, you'd get another error:

ERROR: syntax error at or near "1234567890"
LINE 1: ...ABLE department.master_data IS selectcoun...

This is because the comment must be a (quote-delimited) text. To get one out of your variable, you have two options. One is adding escaped quotes to the variable using psql (using the same feature you misused setting :list:

> \set master_data_count '\'' :master_data_count '\''
> \echo :master_data_count
'1234567890'

Or you can add the quote already in your query, so SELECT count(*) turns into

SELECT $$'$$ || count(*) || $$'$$

(I used dollar quoting above to avoid typing things like ''''.)

The result you can already use as a comment, as it contains the necessary quotes.

answered Apr 8, 2019 at 9:03
1

Use \gset in psql to store the result of a query in a local variable - like dezso already advised. Shorter yet, \gset can replace the semicolon (;) as query terminator:

test=# SELECT count(*) AS list FROM department.master_data \gset

Then, to get a single-quoted string (with any contained single quotes safely escaped automatically) refer to the psql variable with this syntax variant: :'list'. Note the enclosing '' after the colon!

test=# COMMENT ON TABLE department.master_data IS :'list';

Read about SQL interpolation in the manual.

Related:

answered Apr 8, 2019 at 11:23
0

According to the manual, the :list part should be enclosed in quotation marks:

COMMENT ON TABLE department.master_data
 IS ':list';
Andriy M
23.3k6 gold badges60 silver badges104 bronze badges
answered Apr 8, 2019 at 7:01
1
  • 2
    Have you tried the outcome of this? Commented Apr 8, 2019 at 8:41

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.