Sorry, realised I could have elaborated a bit more on this one. Running
against PG11.4 provided by Docker Hub this time.

I've added a single update statement which just reverses the last change in
the original SQL:

UPDATE test SET col = 4 WHERE col = 14;

Running a concurrent update I get:

REFRESH MATERIALIZED VIEW CONCURRENTLY m_test;
SELECT * FROM m_test;
 col
-----
   1
   2
   5
   6
   7
   8
   9
  10
  13
   4
(10 rows)

But then if I go ahead and do a non-concurrent refresh with no further data
changes:

REFRESH MATERIALIZED VIEW m_test;
SELECT * FROM m_test;
 col
-----
   1
   2
   4
   5
   6
   7
   8
   9
  10
  13
(10 rows)

which is what I was expecting.

On Wed, 24 Apr 2019 at 12:23, Awad Mackie <a...@zyper.com> wrote:

> I've added 5 more statements to the attached SQL to demonstrate the
> problem in the last two SELECTs. Ran it against PG 11.2 provided by Docker
> Hub this time and the problem is still visible.
>
> On Thu, 11 Apr 2019 at 21:39, Bruce Momjian <br...@momjian.us> wrote:
>
>> On Thu, Apr  4, 2019 at 02:54:29PM +0000, PG Doc comments form wrote:
>> > The following documentation comment has been logged on the website:
>> >
>> > Page:
>> https://www.postgresql.org/docs/10/sql-refreshmaterializedview.html
>> > Description:
>> >
>> > On 10.7 we hit a case where the backing query had an order by clause
>> and a
>> > concurrent refresh updated it differently than a normal refresh. This
>> is a
>> > bit of an odd corner case given that up till that point, views would
>> respect
>> > the ordering.
>> >
>> > It's not explicit that CONCURRENTLY populates the data any differently
>> than
>> > normal, specifically, in a way that means the ordering in the backing
>> query
>> > is not always maintained, depending on the order of updates.
>> >
>> > Reading through the comment at
>> >
>> https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/commands/matview.c;h=2aac63296bfee535af3ea660c617b265d7ec8042;hb=HEAD#l548
>> > I can see the logic in that, but it could use an explicit mention in the
>> > CONCURRENTLY section. Not sure if there's any plan for changing the
>> > behaviour either.
>> >
>> > Also the existing sentence "If you want the data to be ordered upon
>> > generation, you must use an ORDER BY clause in the backing query." sort
>> of
>> > implies that the ORDER BY will be respected.
>>
>> I ran the attached SQL file on PG 10.7 and PG head and got output that
>> honored the ORDER BY.  Is the test wrong?  Is something else needed to
>> see the ordering fail.  Can you provide an example of the failure?  If I
>> remove the ORDER BY from the materialized view, I do get randomly
>> ordered rows.
>>
>> --
>>   Bruce Momjian  <br...@momjian.us>        http://momjian.us
>>   EnterpriseDB                             http://enterprisedb.com
>>
>> + As you are, so once was I.  As I am, so you will be. +
>> +                      Ancient Roman grave inscription +
>>
>
>
> --
> Awad Mackie
> Lead Backend Engineer
>
>
>

-- 
*Awad Mackie*
Lead Backend Engineer, Zyper

Reply via email to