LANGUAGE SQL vs LANGUAGE plpgsql in PostgreSQL functions

SQL functions … are the better choice: For simple scalar queries. Not much to plan, better save any overhead. For single (or very few) calls per session. Nothing to gain from plan caching via prepared statements that PL/pgSQL has to offer. See below. If they are typically called in the context of bigger queries and … Read more

How to stop a Postgres script when it encounters an error?

I think the solution to add following to .psqlrc is far from perfection \set ON_ERROR_STOP on there exists much more simple and convenient way – use psql with parameter: psql -v ON_ERROR_STOP=1 better to use also -X parameter turning off .psqlrc file usage. Works perfectly for me p.s. the solution found in great post from … Read more

Computed / calculated / virtual / derived / generated columns in PostgreSQL

Postgres 12 or newer STORED generated columns are introduced with Postgres 12 – as defined in the SQL standard and implemented by some RDBMS including DB2, MySQL, and Oracle. Or the similar “computed columns” of SQL Server. Trivial example: CREATE TABLE tbl ( int1 int , int2 int , product bigint GENERATED ALWAYS AS (int1 … Read more

Permission denied for relation in PostgreSQL

GRANT on the database is not what you need. Grant on the tables directly. Granting privileges on the database mostly is used to grant or revoke connect privileges. This allows you to specify who may do stuff in the database if they have sufficient other permissions. You want instead: GRANT ALL PRIVILEGES ON TABLE side_adzone … Read more

Show the CREATE VIEW code for a view in PostgreSQL?

Kept having to return here to look up pg_get_viewdef (how to remember that!!), so searched for a more memorable command… and got it: \d+ viewname You can see similar sorts of commands by typing \? at the pgsql command line. Bonus tip: The emacs command sql-postgres makes pgsql a lot more pleasant (edit, copy, paste, … Read more

Declare a variable in a PostgreSQL query

I accomplished the same goal by using a WITH clause, it’s nowhere near as elegant but can do the same thing. Though for this example it’s really overkill. I also don’t particularly recommend this. WITH myconstants (var1, var2) as ( values (5, ‘foo’) ) SELECT * FROM somewhere, myconstants WHERE something = var1 OR something_else … Read more