Re: rule-related crash in v11

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Robert Haas <robertmhaas(at)gmail(dot)com>
Cc: "pgsql-hackers(at)postgresql(dot)org" <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: rule-related crash in v11
Date: 2018-05-25 15:21:49
Message-ID: 7358.1527261709@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Robert Haas <robertmhaas(at)gmail(dot)com> writes:
> For reasons that I'm not quite sure about, the following test case
> crashes in v11, but not earlier versions:

Crashes just fine in prior versions for me, at least as far back as 9.3,
but probably much further. Note that I was doing an extra select fun()
right after creating the function --- I don't think that should affect
the behavior, but maybe it does? Or maybe you were testing non-assert
builds?

The core problem here seems to be that exec_stmt_execsql sets mod_stmt
once when the query is first planned, and doesn't account for the idea
that the statement's classification might change later. But adding
(or removing) a DO INSTEAD rule can indeed change that.

Looking at what mod_stmt is used for, we've got

(1) the Assert that's crashing, and its siblings, which are just meant
to cross-check that mod_stmt is consistent with the SPI return code.

(2) two places that decide to enforce STRICT behavior if mod_stmt
is true.

I think we could just drop those Asserts. As for the other things,
maybe we should force STRICT on the basis of examining the raw
parsetree (which really is immutable) rather than what came out of
the planner. It doesn't seem like a great idea that INSERT ... INTO
should stop being considered strict if there's currently a rewrite
rule that changes it into something else.

regards, tom lane

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Heikki Linnakangas 2018-05-25 15:24:07 Re: SCRAM with channel binding downgrade attack
Previous Message Charles Cui 2018-05-25 15:09:20 Re: [GSoC] github repo and initial work