Re: After dropping the rule - Not able to insert / server crash (one time ONLY)

From: Bruce Momjian <bruce(at)momjian(dot)us>
To: Dilip Kumar <dilipbalaut(at)gmail(dot)com>
Cc: tushar <tushar(dot)ahuja(at)enterprisedb(dot)com>, PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: After dropping the rule - Not able to insert / server crash (one time ONLY)
Date: 2018-01-25 21:38:07
Message-ID: 20180125213807.GC27619@momjian.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers


Can someone review this thread and determine if this patch is needed?
Thanks.

---------------------------------------------------------------------------

On Fri, Dec 22, 2017 at 04:58:47PM +0530, Dilip Kumar wrote:
> On Mon, Dec 11, 2017 at 4:33 PM, Dilip Kumar <dilipbalaut(at)gmail(dot)com> wrote:
>
> On Mon, Dec 11, 2017 at 3:54 PM, tushar <tushar(dot)ahuja(at)enterprisedb(dot)com>
> wrote:
>
> Hi,
>
> While testing something , I found that even after rule has dropped  not
> able to insert data  and in an another scenario , there is a Crash/
>
> Please refer this scenario's -
>
> 1) Rows not inserted after dropping the RULE
>
> postgres=# create table e(n int);
> CREATE TABLE
> postgres=# create rule e1 as on insert to e do instead nothing;
> CREATE RULE
> postgres=# create function e11(n int) returns int as $$ begin insert
> into e values(10); return 1; end; $$ language 'plpgsql';
> CREATE FUNCTION
> postgres=# select e11(1);
>  e11
> -----
>    1
> (1 row)
>
> postgres=# select e11(1);
>  e11
> -----
>    1
> (1 row)
>
> postgres=# select * from e;  => Expected , due to  the RULE enforced
>  n
> ---
> (0 rows)
>
>
> postgres=# drop rule e1 on e;  ==>Drop the rule
> DROP RULE
>
> postgres=# select e11(1);  =>again try to insert into table
>  e11
> -----
>    1
> (1 row)
>
> postgres=# select * from e;  =>This time , value should be inserted but
> still showing 0 row.
>  n
> ---
> (0 rows)
>
>
> I think this is becuase we are not invalidating the plan cache if rule is
> dropped.  You can reproduce same with prepared statements.
>  
>
> 2)Server crash (one time)
>
> postgres=# create table en(n int);
> CREATE TABLE
> postgres=# create function en1(n int) returns int as $$ begin insert
> into en values(10); return 1; end; $$ language 'plpgsql';
> CREATE FUNCTION
> postgres=#
> postgres=# select en1(1);
>  en1
> -----
>    1
> (1 row)
>
> postgres=# select * from en;
>  n
> ----
>  10
> (1 row)
>
> postgres=# create rule en11 as on insert to en do instead nothing;
> CREATE RULE
> postgres=# select en1(1);
> ostgres=# select en1(1);
> TRAP: FailedAssertion("!(!stmt->mod_stmt)", File: "pl_exec.c", Line:
> 3721)
> server closed the connection unexpectedly
>     This probably means the server terminated abnormally
>     before or while processing the request.
>
>
> I have looked into this crash, seems like below assert in exec_stmt_execsql
> is not correct
>
> case SPI_OK_REWRITTEN:
>
> Assert(!stmt->mod_stmt);
>
> In this issue first time execution of select en1(1); statement, stmt->
> mod_stmt is set to true for the insert query inside the function. Then
> before next execution we have created the rule "create rule en11 as on
> insert to en do instead nothing;".  Because of this nothing will be
> executed and output will be SPI_OK_REWRITTEN.  But we are asserting that 
> stmt->mod_stmt should be false (which were set to true in first execution).
>
>
> IMHO if the query is rewritten, then this assert is not valid. I have attached
> a patch which removes this assert.
>
> --
> Regards,
> Dilip Kumar
> EnterpriseDB: http://www.enterprisedb.com

> diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
> index dd575e7..9b85df8 100644
> --- a/src/pl/plpgsql/src/pl_exec.c
> +++ b/src/pl/plpgsql/src/pl_exec.c
> @@ -3727,8 +3727,6 @@ exec_stmt_execsql(PLpgSQL_execstate *estate,
> break;
>
> case SPI_OK_REWRITTEN:
> - Assert(!stmt->mod_stmt);
> -
> /*
> * The command was rewritten into another kind of command. It's
> * not clear what FOUND would mean in that case (and SPI doesn't

--
Bruce Momjian <bruce(at)momjian(dot)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 +

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Masahiko Sawada 2018-01-25 21:50:59 Invalid result from hash_page_items function
Previous Message Alvaro Herrera 2018-01-25 21:27:28 Re: reducing isolation tests runtime