CTE Changes in PostgreSQL 12, can we have a GUC to get old behavior

From: "Regina Obe" <lr(at)pcorp(dot)us>
To: <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: CTE Changes in PostgreSQL 12, can we have a GUC to get old behavior
Date: 2019-02-22 20:33:08
Message-ID: 000001d4caed$d29b9ae0$77d2d0a0$@pcorp.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

The CTE change in PostgreSQL 12 broke several of PostGIS regression tests
because many of our tests are negative tests that test to confirm we get
warnings in certain cases. In the past, these would output 1 notice because
the CTE was materialized, now they output 1 for each column.

An example is as follows:

WITH data AS ( SELECT '#2911' l, ST_Metadata(ST_Rescale( ST_AddBand(
ST_MakeEmptyRaster(10, 10, 0, 0, 1, -1, 0, 0, 0), 1, '8BUI', 0, 0 ),
2.0, -2.0 )) m ) SELECT l, (m).* FROM data;

In prior versions this raster test would return one notice:

NOTICE: Raster has default geotransform. Adjusting metadata for use of GDAL
Warp API

Now it returns 10 notices because the call is being done 10 times (1 for
each column)

NOTICE: Raster has default geotransform. Adjusting metadata for use of GDAL
Warp API
NOTICE: Raster has default geotransform. Adjusting metadata for use of GDAL
Warp API
NOTICE: Raster has default geotransform. Adjusting metadata for use of GDAL
Warp API
NOTICE: Raster has default geotransform. Adjusting metadata for use of GDAL
Warp API
NOTICE: Raster has default geotransform. Adjusting metadata for use of GDAL
Warp API
NOTICE: Raster has default geotransform. Adjusting metadata for use of GDAL
Warp API
NOTICE: Raster has default geotransform. Adjusting metadata for use of GDAL
Warp API
NOTICE: Raster has default geotransform. Adjusting metadata for use of GDAL
Warp API
NOTICE: Raster has default geotransform. Adjusting metadata for use of GDAL
Warp API
NOTICE: Raster has default geotransform. Adjusting metadata for use of GDAL
Warp API

The regression errors are easy enough to fix with OFFSET or subquery. What
I'm more concerned about is that I expect we'll have performance
degradation.

Historically PostGIS functions haven't been costed right and can't be
because they rely on INLINING of sql functions which gets broken when too
high of cost is put on functions. We have a ton of functions like these
that return composite objects and this above function is particularly
expensive so to have it call that 10 times is almost guaranteed to be a
performance killer.

I know there is a new MATERIALIZED keyword to get the old behavior, but
people are not going to be able to change their apps to introduce new
keywords, especially ones meant to be deployed by many versions of
PostgreSQL.

That said IS THERE or can there be a GUC like

set cte_materialized = on;

to get the old behavior?

Thanks,
Regina
PostGIS PSC member

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Robbie Harwood 2019-02-22 20:37:24 Re: [PATCH v20] GSSAPI encryption support
Previous Message Andres Freund 2019-02-22 20:31:39 Re: unconstify equivalent for volatile